1

現在、ORMlite から GreenDao に切り替えていますが、greendao でデータベース モデルを作成するのに問題があります。

私のコンテンツは、サーバーが生成された主キーを持つエントリを文字列として識別するサーバーから取得されます。私の内部データベースには、(Android が必要とするように) Long の主キーがあります。

同期するときは、サーバーから配信されたキー (ここでは「backendId」) に基づいてリレーションを作成し、同期を簡単にする必要があります。

ORMlite では、リレーションシップを作成するために使用する列を指定できます。同じことを greendao 用に作成しようとしましたが、失敗しました。

これが私が試したことです:セクターは資産を持つことができます。「assetId」には、アセットの「backendId」に格納されている値が含まれている必要があります。

どうすればそれを達成できるのでしょうか?

Entity asset = schema.addEntity("Asset");
asset.setSuperclass("Backend");
asset.addIdProperty().index();
asset.addStringProperty("backendId").index();
asset.addStringProperty("title");
asset.addStringProperty("description");
asset.addStringProperty("contentType");
asset.addStringProperty("url");

Entity sector = schema.addEntity("Sector");
sector.setSuperclass("Backend");
sector.addIdProperty().index();
sector.addStringProperty("backendId").index();
sector.addStringProperty("title");
sector.addToOne(asset, sector.addLongProperty("asset").getProperty(), "assetId");

// insert test:
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "greenmodel-db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
AssetDao assetDao = daoSession.getAssetDao();
SectorDao sectorDao = daoSession.getSectorDao();

Asset asset = new Asset(1l, "12345", "Title", "Description", "type", "url");
assetDao.insert(asset);

Sector sector = new Sector();
sector.setTitle("title");
sector.setBackendId("123");
sector.setAssetId(asset);
sectorDao.insert(sector);

その挿入の結果、「assetId」は資産テーブルの主キーですが、「backendId」にする必要があります。

何か案は?

4

1 に答える 1

4

現時点では、String-primary キーを使用するしかない可能性があります (データで可能な場合)。

次のようなことを試すことができます:

Entity asset = schema.addEntity("Asset");
asset.setSuperclass("Backend");
asset.addStringProperty("backendId").index().primaryKey();
asset.addStringProperty("title");
asset.addStringProperty("description");
asset.addStringProperty("contentType");
asset.addStringProperty("url");

Entity sector = schema.addEntity("Sector");
sector.setSuperclass("Backend");
sector.addIdProperty().index();
Property fkAsset = sector.addStringProperty("backendId").index();
sector.addStringProperty("title");
sector.addToOne(asset, fkAsset, "Asset");

そして、これを使用してテストします:

Asset asset = new Asset("12345", "Title", "Description", "type", "url");
assetDao.insert(asset);

Sector sector = new Sector();
sector.setTitle("title");
sector.setAsset(asset);
sectorDao.insert(sector);

アップデート

greendao は、 以外の主キーを使用して正しく動作することを保証していないことを私は知っていますLong。しかし、自分でテストしたことはありませんが、関係の構築は機能しているようです。この投稿を参照してください。ソースを調べたところ、理由が見つかりませんでした。なぜそれが機能しないのですか。

ソースを見ると、現時点では主キー以外のものを参照することはできないと思います。

標準の id 主キーを使用する場合の回避策として、keep セクションの文字列値から id を計算し、「通常の」 greendso toOne マッピングを使用することもできます。

于 2014-05-20T14:55:02.817 に答える