9

将此代码与 DatastoreService 一起使用时,我得到 ClassCastException Long acnnot be cast to integer in fromEntity。这是正常行为吗?(在本地计算机上使用 Eclipse 的谷歌插件进行调试时,我得到了这种行为)

class UserData {
    private int _integerval = 0;
    private String _stringval = "";
    public Entity getEntity() {
        Entity ret = new Entity( "User", key );
        ret.setProperty( "property1", _integerval );
        ret.setProperty( "property2", _stringval );
        return ret;
    }

    public static UserData fromEntity( Entity ent ) {
        UserData ret = new UserData();
        ret._integerval = (Integer)ent.getProperty("property1");
        ret._stringval = (String)ent.getProperty("property2");
        return ret;
    }
}

我是否总是必须像这样捕获这个异常:

try
{
    ret._integerval = (Integer)ent.getProperty("property1");
}
catch( ClassCastException ex ) {
    Long val = (Long)ent.getProperty("property1");
    ret._integerval = val.intValue(); 
}

或者也许所有的数值都只存储很长时间?我是否必须将 _integerval 类型更改为 long 以避免此异常?

4

5 回答 5

6

使用int而不是Integer在施法时使用。

ret._integerval = (int)ent.getProperty("property1");

编辑:

以下内容包含在setProperty API 中。

由于值存储在数据存储中,因此它被转换为数据存储的本机类型。这可能包括加宽,例如将 Short 转换为 Long。

因此,您的int数据将被转换为数据存储的本机类型为Long. long使用或进行投射Long

于 2013-03-06T11:40:28.793 回答
6

创建一个新的整数:

Integer property = new Integer(entity.getProperty("propertyKey").toString());
于 2013-06-16T15:53:15.273 回答
1

如果您想int在您的程序中使用,那么这可以正常工作:

int i = (int) (long) entity.getProperty(propertyName);

仍然要确保数字进入 int 范围(在此处讨论)。

于 2014-07-11T09:16:29.293 回答
1

官方文档中所述

由于值存储在数据存储中,因此它被转换为数据存储的本机类型。这可能包括加宽,例如将 Short 转换为 Long。

所以

  • 设置为 int 但将其转换为 long 因为由于某种原因本地环境中的数据存储行为不同并且它也存储整数。
  • 获取 Long 并使用 .intValue()

    public int get() {
        return ((Long) entity.getProperty(FIELD)).intValue(); 
    }
    
    public void set(int value) {
        entity.setProperty(FIELD, (long)value); 
    }
    
于 2014-12-09T13:42:14.313 回答
0

整数值保存为 Long,因此应用引擎将始终返回 Long,我自己很困惑,但后来我看到

于 2014-05-01T09:51:41.553 回答