将 gson 创建的对象存储在 greenDao 中
Store object created by gson in greenDao
问题: 我无法使用 greenDao
将没有 id 的 gson 创建的对象插入到数据库中
设置 GreenDao
我的 Web 服务 returns 像这样的输出
[
{
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
对象,它会抛出 Entity is detached from DAO context on同样 person.getProfession()
调用
恐怕 GreenDao 和 Gson 不是一对友好的夫妻。这是因为在GreenDao中,所有实体必须在对象构建之前插入。
在这种情况下,Profession 不是一个字段,它是一个关系,所以当您执行 person.getProfession() 时,您是从 Profession table 而不是从 Person 对象中检索此值。您应该同时插入 Person 和 Profession 对象,然后建立它们的关系。
这两个工具不能很好地协同工作确实很不方便,但据我所知,它是如何工作的。
问题: 我无法使用 greenDao
将没有 id 的 gson 创建的对象插入到数据库中设置 GreenDao
我的 Web 服务 returns 像这样的输出
[
{
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
对象,它会抛出 Entity is detached from DAO context on同样 person.getProfession()
调用
恐怕 GreenDao 和 Gson 不是一对友好的夫妻。这是因为在GreenDao中,所有实体必须在对象构建之前插入。
在这种情况下,Profession 不是一个字段,它是一个关系,所以当您执行 person.getProfession() 时,您是从 Profession table 而不是从 Person 对象中检索此值。您应该同时插入 Person 和 Profession 对象,然后建立它们的关系。
这两个工具不能很好地协同工作确实很不方便,但据我所知,它是如何工作的。