我不确定是我的项目有问题还是我不明白绿刀是如何工作的。也许第二个选项才是正确的。
我有以下实体:
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.s etsettext("新文本");之后,数据库中的字段具有新值。
那么,问题是,对字段的更改是否在不调用dao的更新方法的情况下填充到表中?这怎么可能呢?这将帮助你解决这个问题
https://github.com/infinum/android_dbinspector