如何缓存游标对象?

时间:2013-06-05 16:02:22

标签: java android sqlite caching cursor

我的应用程序中有一个庞大的数据库(SQLite Engine),我需要每周运行一次查询并缓存该查询的光标以便以后重新使用它。所以我编写了以下函数来保存我的光标ObjectStream但我无法通过ObjectInputStream加载它,因为它不可序列化!!!

有关如何完成此功能的任何想法?

public Cursor getCachedCursor(ReaderState state, String[] allowedColumns
        , String sortType, int limit) throws IOException, ClassNotFoundException
{
    File cacheFilePath = CacheManager.getCachePath(state.toString() + ".cached");
    Cursor mCursor = null;

    try
    {
        if (cacheFilePath == null)
        { 
             FileOutputStream mFileOutputStream = new FileOutputStream(cacheFilePath);
             ObjectOutputStream mObjectOutputStream = new ObjectOutputStream(mFileOutputStream);

             mObjectOutputStream.writeObject(mDatabase.query(TABLE_NAME, allowedColumns, null, null
                     , null, null, sortType, String.valueOf(limit)));

             mObjectOutputStream.close();
        }
    }
    finally
    {
        FileInputStream mFileInputStream = new FileInputStream(cacheFilePath);
        ObjectInputStream mObjectInputStream = new ObjectInputStream(mFileInputStream);

        mCursor = (Cursor) mObjectInputStream.readObject();

        mObjectInputStream.close();
    }

    return mCursor;
}

1 个答案:

答案 0 :(得分:4)

  

我需要每周运行一次查询并缓存该查询的光标以便以后重新使用

每周一次的查询似乎更适合简单地重新运行查询,而不是缓存结果,因为如果在该周期间修改数据库,这些结果可能会变得陈旧。

  

有关如何完成此功能的任何想法?

手动迭代Cursor并将所有行的所有列保存为您选择的文件格式(例如,JSON)。