我在我的项目中使用了GreenDao,它很好地将我的服务器模型映射到了android设备。一段时间以来,我一直在努力解决的问题是dao.update和/或dao.updateInTx方法没有更新数据库中的任何行。
我做什么:< br >
/**
* The first approach -> All in one runnable
*
*/
// list definitions
ArrayList<Country> countryList;
ArrayList<Country> countryListDetail;
final DaoSession daoSession = daoMaster.newSession();
// execute everything in runnable
// in order to optimize insert time
daoSession.runInTx(new Runnable() {
@Override
public void run() {
CountryDao countryDao = new CaountryDao();
// delete all records first
countryDao.deleteAll();
// insert countries with less data
size = countryList.size();
for (int i=0; i < size; i++) {
countryDao.insert(countryList.get(i));
}
// update countries with more data
// ID's of the Objects in countryListDetail match those from
// the countryList, so the primary key mathces
size = countryListDetail.size();
for (int i=0; i < size; i++) {
countryDao.update(countryListDetail.get(i));
}
}
}
/**
* The second approach -> updateInTx()
*
*/
// list definitions
ArrayList<Country> countryList;
ArrayList<Country> countryListDetail;
// insert & update logic
final DaoSession daoSession = daoMaster.newSession();
CountryDao countryDao = new CaountryDao();
countryDao.insertInTx(countryList);
countryDao.updateInTx(countryListDetail);
在这两种情况下,当我从设备中提取数据库并对其进行检查时,Country表只有基本插入数据,但没有来自更新语句的详细数据。调试时,GreenDao逻辑似乎会执行updateInsideSynchronized()方法,并且还会调用stmt.execute()
有人知道我做错了什么吗?
请启用并检查
dao.queryBuilder().LOG_VALUES=true;
dao.queryBuilder().LOG_SQL=true;
并确保在更新时国家列表和国家列表详细信息具有相同的Primarykey
您的countyListDetail
可能不包含Country
对象,这些对象是使用greendao查询的。因此,对象对数据库“一无所知”,因为没有引用DaoSession
。更新仅适用于已插入或从数据库中查询的对象。
如果countryList
中的数据包含在countryListDetail
的数据中,我会使用insertOrReplace
。
否则,您必须在插入或更新之前合并您的Country
-对象。