使用int调用setProperty但getProperty在google app引擎持久存储上返回Long

时间:2013-03-06 11:33:31

标签: java google-app-engine entity

在DatastoreService中使用此代码时,我得到ClassCastException Long无法在fromEntity中强制转换为整数。这是正常的行为吗? (我在本地计算机上使用google插件进行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以避免此异常?

5 个答案:

答案 0 :(得分:6)

创建一个新的整数:

Integer property = new Integer(entity.getProperty("propertyKey").toString());

答案 1 :(得分:5)

在投射时使用int代替Integer

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

修改

以下内容包含在setProperty API中。

  

当值存储在数据存储区中时,它将转换为   数据存储区的本机类型。这可能包括扩大,例如转换   短暂的。

因此,您的 int 数据正在转换为数据存储区的本机类型Long。使用longLong进行投射。

答案 2 :(得分:1)

如果您想在程序中使用int,那么这样就可以了:

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

仍然可以确保该数字进入了int范围(讨论here)。

答案 3 :(得分:1)

official documentation

中所述
  

当值存储在数据存储区中时,它将转换为   数据存储区的本机类型。这可能包括扩大,例如转换   短暂的。

所以

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

    public int get() {
        return ((Long) entity.getProperty(FIELD)).intValue(); 
    }
    
    public void set(int value) {
        entity.setProperty(FIELD, (long)value); 
    }
    

答案 4 :(得分:0)

整数值保存为Long,因此app引擎将始终返回Long,我很困惑,但后来我看到了this