2

我在我的项目中使用了 GreenDao,它在将我的服务器模型映射到 android 设备方面做得很好。我一直在努力解决的是 dao.update 和/或 dao.updateInTx 方法没有更新数据库中的任何行。

我所做的:

/**
 *  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()。

有谁知道我可能做错了什么?

4

2 回答 2

2

请启用此功能并检查

dao.queryBuilder().LOG_VALUES=true;
dao.queryBuilder().LOG_SQL=true;

并确保 countryList 和 countryListDetail 在更新时具有相同的 Primarykey

于 2015-01-21T12:23:47.163 回答
1

可能您的countyListDetail不包含Country已使用 greendao 查询的对象。因此对象“不知道”数据库,因为没有对DaoSession. 此更新仅适用于已插入或从数据库查询的对象。

如果 中的数据countryList包含在 的数据中countryListDetail,我会使用insertOrReplace.

Country否则,您必须在插入或更新之前合并您的-objects。

于 2013-11-05T22:22:29.310 回答