与不是主键的列建立关系

时间:2014-05-19 16:00:11

标签: android database android-sqlite greendao greendao-generator

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

我的内容是从服务器获取的,服务器将生成的主键标识为String。我的内部数据库的主键为Long(就像Android要求的那样)。

当我同步时,我需要根据服务器提供的密钥(此处为" 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"。

有什么想法吗?

1 个答案:

答案 0 :(得分: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。但建立关系似乎有效,尽管我自己从未测试过。请参阅this帖子。我查看了消息来源,但我没有找到理由,为什么它不起作用。

查看来源我不认为现在可以引用除主键之外的其他内容。

如果您想使用标准ID主键,解决方法也可以从保留部分中的字符串值计算ID,并使用&#34; normal&#34; greendso toOne mapping。