java - 将gson创建的对象存储在greenDao中

标签 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 将其转换为具有 Profession 对象的 Person 对象。这些类是使用 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相同的 person.getProfession() 调用

最佳答案

恐怕 GreenDao 和 Gson 并不是一对友好的情侣。这是因为在GreenDao中,所有实体都必须在对象构造之前插入。

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

这两个工具不能很好地协同工作,这确实很不方便,但据我所知,它就是这样工作的。

关于java - 将gson创建的对象存储在greenDao中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33364711/

相关文章:

android - 安全 sqlite 数据库 : Android

javascript - 查看使用外部化连接配置文件的 birt 报告

java - MongoDB 读取性能不佳

Java 类/接口(interface)命名约定

java - 启动小程序后,僵尸 java 解释器会阻止 java 控制台在重新启动时重新出现

android - Sugar ORM 不会创建表

android - 从 SQLite 数据库中获取单行并将值保存到单个变量中并将它们显示到不同的 TextView 中

android - 在 Facebook 集成上发布多张图片

android - 识别哪个 Android 应用程序正在与我的应用程序引擎应用程序联系

android - android中的颜色代码不同