0

アプリケーションに巨大なデータベース (SQLite エンジン) があり、週に 1 回クエリを実行し、そのクエリのカーソルをキャッシュして後で再利用する必要があるため、カーソルを保存するために次の関数を作成しまし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;
}
4

1 に答える 1

4

クエリを週に 1 回実行し、そのクエリのカーソルをキャッシュして後で再利用する必要がある

週に 1 回のクエリは、その週にデータベースが変更されると結果が古くなる可能性があるため、結果をキャッシュするよりも、単純にクエリを再実行する方がはるかに適しているようです。

この機能を実現する方法についてのアイデアはありますか?

を手動で反復処理し、Cursorすべての行のすべての列を選択したファイル形式 (JSON など) に保存します。

于 2013-06-05T16:04:13.897 に答える