0

ArrayListよし、 SQLite DB から 少し軽量なものを作成しようとしています。

コードは次のとおりです。

public ArrayList<Album> getAlbums()
{
    Cursor cursor = null;
    Cursor cursor2 = null;
    try{
        Log.d(Global.TAG, "STARTING");
        ArrayList<Album> albums = new ArrayList<Album>();
        Album album = new Album();
        db = getOpenDatabase(DBADS);
        String albumQuery = "SELECT * FROM " +albumsTableName + " ORDER BY " +albumIsMain + " DESC"; 
        cursor = db.rawQuery(albumQuery, null);
        if (cursor.moveToFirst()){
            do {
                Log.d(Global.TAG, "IN LOOP");
                album = new Album();
                album.id = cursor.getInt(0);
                album.albumName = cursor.getString(1);
                album.passcode = cursor.getString(2);
                album.isMainAlbum = cursor.getInt(3) == 1 ? true : false;
                albumQuery = "SELECT COUNT(*) FROM " + picturesTableName+" WHERE "+ pictureAlbumId +"="+album.id;
                cursor2 = db.rawQuery(albumQuery, null);
                cursor2.moveToFirst();
                album.photosCount = cursor2.getInt(0);
                cursor2.close();

                albums.add(album);
            }
            while (cursor.moveToNext());
        }
        Log.d(Global.TAG, "RETURNING");
        return albums;
    }
    catch(Exception ex)
    {
        Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show();
    }
    finally
    {
        if(cursor != null){
            cursor.close();
        }
        if(cursor2 != null){
            cursor2.close();
        }
        if(cursor3 != null){
            cursor3.close();
        }
    }
    return null;

}

次のコードは、合計 6 つの項目に対して約 8 秒で実行されます。これは非常に遅いです。
ここには 1000 行ほどではありませんが、6 行しかありません。デバッグを行った後、他の 2 番目の内部カーソルを削除すると、非常に高速になることがわかりました。

その理由は何でしょうか?

どうもありがとう。

4

1 に答える 1

0

最初の select ステートメントの結果をリストに保存します。次に、それらを同時に 2 番目の select 呼び出しに渡します。現在、多くの db 呼び出しを行っています

于 2013-08-25T22:33:25.010 に答える