在greenDao中存储由gson创建的对象

时间:2015-10-27 09:56:08

标签: java android android-sqlite greendao greendao-generator

问题:我无法使用greenDao将没有id的gson创建的对象插入数据库

设置GreenDao

我的网络服务返回这样的输出

[
    {
        id: 2,
        firstName: "John",
        lastName: "Cleese",
        dateOfBirth: -952473600,
        profession: {
            name: "Actor",
            description: "TV show entertainer"
        }
    }
]

Gson将其转换为具有Person对象的Profession对象。这些类使用GreenDao Generator生成。

Schema schema = new Schema(SCHEMA_VERSION, "com.example.dao");

Entity profession = schema.addEntity("Profession");
profession.addIdProperty().autoincrement().notNull();
profession.addStringProperty("name");
profession.addStringProperty("description");

Entity person = schema.addEntity("Person");
person.addIdProperty();
person.addStringProperty("firstName");
person.addStringProperty("lastName");
person.addDateProperty("dateOfBirth");
Property professionProperty = person.addLongProperty("profession_id").getProperty();
person.addToOne(profession, professionProperty);

new DaoGenerator().generateAll(schema, "my/path/java");

插入问题:

现在我正在尝试插入创建的Person对象及其Profession对象:

DaoMaster master = new DaoMaster(devOpenHelper.getWritableDatabase());
    DaoSession session = master.newSession();
    PersonDao personDao = session.getPersonDao();
    List<Person> people = myWebServiceResponse.getPeople();
    ProfessionDao professionDao = session.getProfessionDao();
    personDao.insertOrReplaceInTx(people);
    for (Person person : people) {
        try {
            professionDao.insertInTx(person.getProfession());
        } catch (Exception e) {
            Log.e("MainActivity", "Issue on insert: " + e.getMessage());
        }
    }

person.getProfession()抛出此异常:尝试在空对象引用上调用虚拟方法'long com.example.dao.Profession.getId()'

如果我扭转局面,首先插入Profession然后再插入Person个对象,它会在同一个{{1}上抛出实体与DAO上下文分离调用

1 个答案:

答案 0 :(得分:4)

我担心GreenDao和Gson不是一对情侣。这是因为在GreenDao中,必须在对象构造之前插入所有实体。

在这种情况下,Profession不是一个字段,它是一个关系,所以当你执行person.getProfession()时,你从Profession表中检索这个值,而不是从Person对象中检索。您应该插入Person和Profession对象,然后建立它们之间的关系。

这两个工具不能很好地协同工作真的很不方便,但据我所知,这是它的工作原理。