对greendao实体更新机制感到困惑

时间:2015-05-29 06:21:21

标签: android greendao

我不确定我的项目是否有问题,或者我不明白绿道是如何工作的。可能第二种选择是正确的选择。

我有以下实体:

Entity review= schema.addEntity("Review");
review.setTableName("reviews");
review.addIdProperty().primaryKey();
Property user_id = review.addLongProperty("user_id").getProperty();
Property object_id= review.addLongProperty("object_id").getProperty();
review.addStringProperty("text");

Index indexUnique = new Index();
indexUnique.addProperty(user_id);
indexUnique.addProperty(object_id);
indexUnique.makeUnique();
review.addIndex(indexUnique);

我在字段user_id和object_id上使用唯一索引,因为我希望这两个字段作为主键使用,因为我只希望对每个用户和表中的每个对象进行一次审核。

我第一次在数据库中插入评论时,我会执行以下操作:

MyEntity e=new MyEntity();
e.setText("Hello");
e.setUserId(1);
e.setObjectId(9);
myDao.insert(e); 

一切正常。下一步是用户更新实体,我使用以下代码:

MyEntity e=new MyEntity();
e.setText("New text");
e.setUserId(1);
e.setObjectId(9);
myDao.insertOrReplaceInTx(e); 

insertOrReplaceInTx方法无异常。当我尝试使用myDao.loadAll()方法加载所有评论时,会出现问题。出现异常后:

  

无法从CursorWindow

读取第0行,第0列

我查看了数据库文件,问题是实体已保存到表中,但所有字段都为空,我不知道为什么。

经过大量测试后,我设法让它工作,做了以下事情。第一次创建评论时,我也是这样做的:

MyEntity e=new MyEntity();
e.setText("New text");
e.setUserId(1);
e.setObjectId(9);
myDao.insert(e);

稍后,如果实体已经存在于数据库中(对于编辑操作),那么我加载实体,我这样做;

MyEntity e= do a query with greendao and load the entity with user_id=1 and object_id=9//Yes I know that is pseudocode
e.setText("New text");
myDao.update(e);

它有效,但这里奇怪的是我不需要调用myDao.update(e);我已经意识到在e.setText(“New text”);之后,数据库中的字段具有新值。

然后,问题是,填充到表中的字段的更改是否没有调用dao的更新方法?怎么可能呢?

1 个答案:

答案 0 :(得分:5)

这将帮助您解决此问题

https://github.com/infinum/android_dbinspector