2

我在 Android 上使用 Ormlite 并启用了 ObjectCache,在使用 UpdateBuilder 和 ColumnExpression 更新表后,我得到了旧数据。我已经通读了文档,它没有警告不要在启用缓存的情况下使用 UpdateBuilder。

设置表最多应该只有 1-5 行。updateColumnExpression 似乎是一种只允许其中一行为真的简单方法。

这是预期的行为吗?

public void setActiveSetting(String id)
{
    try {
        UpdateBuilder<Settings, Integer> updateBuilder2 = getHelper().getSettingsDao().updateBuilder();
        updateBuilder2.updateColumnExpression("active", "id = " + id );
        updateBuilder2.update();
    } catch (SQLException e){
        e.printStackTrace();
    }
}

这是返回过时数据的调用:

public List<Settings> getSettings() 
{
    List<Settings> settings = null;
    try  {
        settings = getHelper().getSettingsDao().queryForAll();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return settings;
}

以及设置DAO:

public Dao<Settings, Integer> getSettingsDao() 
{
    if (null == settingsDao) {
        try {
            settingsDao = getDao(Settings.class);
            settingsDao.setObjectCache(true);
        } catch (java.sql.SQLException e) {
            e.printStackTrace();
        }
    }
    return settingsDao;
}

禁用 ObjectCache 确实会返回正确的数据,但是这些数据被非常频繁地获取,所以我想保留它。

谢谢

4

1 回答 1

5

这是预期的行为吗?

不幸的是,是的。如果您使用更新了对象,dao.update(...);那么缓存将知道需要刷新该对象。通过使用 对UpdateBuilder表进行大量更改,缓存无法知道哪些对象受到影响。

您需要在调用UpdateBuilder完成后清除缓存。

于 2013-02-06T16:01:03.993 回答