1

我目前正在从 ORMlite 切换到 GreenDao,并且在 greendao 中创建我的数据库模型时遇到了麻烦。

我的内容是从服务器获取的,服务器将生成的主键条目标识为字符串。我的内部数据库的主键为 Long(如 Android 要求)。

当我同步时,我需要根据服务器提供的键(此处为“backendId”)创建关系,以使我的同步方式更容易。

在 ORMlite 中,我可以说应该使用哪一列来创建关系。我尝试为 greendao 创建相同的内容,但失败了。

这是我的尝试:一个部门可以拥有资产。“assetId”应该包含存储在 Asset 的“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

目前,您唯一的机会可能是使用字符串主键(如果您的数据可能的话)。

你可以尝试这样的事情:

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 主键,解决方法也是从保留部分中的字符串值计算 id 并使用“正常”greendso toOne 映射。

于 2014-05-20T14:55:02.817 回答