2

問題: greenDao を使用して、gson で作成された ID のないオブジェクトをデータベースに挿入できません

GreenDao のセットアップ

私のWebサービスはこのような出力を返します

[
    {
        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()例外をスローします: null オブジェクト参照で仮想メソッド 'long com.example.dao.Profession.getId()' を呼び出しようとしました

Profession最初にオブジェクトを挿入してからオブジェクトを挿入することで、状況を好転させると、同じ呼び出しで Entity is detached from DAO context がPersonスローされますperson.getProfession()

4

1 に答える 1

4

残念ながら GreenDao と Gson は友好的なカップルではありません。これは、GreenDao では、オブジェクトを構築する前にすべてのエンティティを挿入する必要があるためです。

この場合、Profession はフィールドではなくリレーションであるため、person.getProfession() を実行すると、この値は Person オブジェクトからではなく、Profession テーブルから取得されます。Person オブジェクトと Profession オブジェクトの両方を挿入し、後でそれらの関係を確立する必要があります。

この 2 つのツールがうまく連携しないのは本当に不便ですが、私の知る限りでは、このように機能します。

于 2015-10-28T08:50:49.330 に答える