当majorkey在greendao中很短时ClassCastException

时间:2014-09-07 13:13:15

标签: android orm primary-key classcastexception greendao

我创建了一个只需要Short标识的实体。

这是我生成的代码:

public Source(Short id, String name) {
    this.id = id;
    this.name = name;
}

TestCode DatabaseHelperTest.java

public void testInsertAndLoad(){
    Source source = new Source((short) 0, "TestSource");
    SourceDao sourceDao = daoSession.getSourceDao(); //#line 26
    sourceDao.insert(source);
    Short id = source.getId();
    assertNotNull(id);
}

当我运行测试时,我得到了ClassCastException:

Running tests
Test running started
java.lang.ClassCastException: java.lang.Short cannot be cast to java.lang.Long
at de.greenrobot.dao.identityscope.IdentityScopeLong.put(IdentityScopeLong.java:31)
at de.greenrobot.dao.AbstractDao.attachEntity(AbstractDao.java:695)
at de.greenrobot.dao.AbstractDao.updateKeyAfterInsertAndAttach(AbstractDao.java:362)
at de.greenrobot.dao.AbstractDao.executeInsert(AbstractDao.java:355)
at de.greenrobot.dao.AbstractDao.insert(AbstractDao.java:293)
at com.tuanchau.DatabaseHelperTest.testInsertAndLoad(DatabaseHelperTest.java:26)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)

那么,GreenDAO是否允许short成为primary key? 而且,我该如何处理这个异常。

由于

更新

数据库生成代码

Entity source = schema.addEntity("Source");
Entity category = schema.addEntity("Category");

source.addShortProperty("id").primaryKey().getProperty();
source.addStringProperty("name").notNull();

category.addIntegerProperty("id").primaryKey().getProperty();
category.addStringProperty("name").notNull();
Property csid = category.addLongProperty("sid").notNull().getProperty();

category.addToOne(source, csid);

来源属性

public static class Properties {
    public final static Property Id = new Property(0, Short.class, "id", true, "ID");
    public final static Property Name = new Property(1, String.class, "name", false, "NAME");
};

类别属性

public static class Properties {
    public final static Property Id = new Property(0, Integer.class, "id", true, "ID");
    public final static Property Name = new Property(1, String.class, "name", false, "NAME");
    public final static Property Sid = new Property(2, short.class, "sid", false, "SID");
};

1 个答案:

答案 0 :(得分:6)

来自greenDao website

  

当前主键(PK)限制:当前,实体必须具有long或Long属性作为其主键。这是Android和SQLite的推荐做法。 greenDAO准备在将来处理任何主键场景,但并非所有内容都已完全实现。要解决此问题,您可以使用长主键并对预期的“键”属性使用唯一索引。

您可以尝试使用以下内容:

source.addIdProperty();
source.addShortProperty("shortId").unique().getProperty();
source.addStringProperty("name").notNull();