Java 从SQLite DB创建ArrayList非常慢

Java 从SQLite DB创建ArrayList非常慢,java,android,sqlite,android-listview,arraylist,Java,Android,Sqlite,Android Listview,Arraylist,好的,我正在尝试从我的SQLite DB创建一个小而轻量级的ArrayList 代码如下: public ArrayList<Album> getAlbums() { Cursor cursor = null; Cursor cursor2 = null; try{ Log.d(Global.TAG, "STARTING"); ArrayList<Album> albums = new ArrayList<Al

好的,我正在尝试从我的SQLite DB创建一个小而轻量级的
ArrayList

代码如下:

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;

}
public ArrayList getAlbums()
{
游标=空;
游标游标2=null;
试一试{
Log.d(Global.TAG,“开始”);
ArrayList albums=新的ArrayList();
相册=新相册();
db=getOpenDatabase(DBADS);
String albumQuery=“选择*从”+albumsTableName+”按“+albumIsMain+”描述”排序;
cursor=db.rawQuery(albumQuery,null);
if(cursor.moveToFirst()){
做{
Log.d(Global.TAG,“IN-LOOP”);
相册=新相册();
album.id=cursor.getInt(0);
album.albumName=cursor.getString(1);
album.passcode=cursor.getString(2);
album.isMainAlbum=cursor.getInt(3)==1?真:假;
albumQuery=“从“+picturesTableName+”中选择计数(*),其中“+pictureAlbumId+”=“+album.id;
cursor2=db.rawQuery(albumQuery,null);
游标2.moveToFirst();
album.photoscont=cursor2.getInt(0);
游标2.close();
相册。添加(相册);
}
while(cursor.moveToNext());
}
Log.d(Global.TAG,“返回”);
归还相册;
}
捕获(例外情况除外)
{
Toast.makeText(上下文,例如toString(),Toast.LENGTH_LONG).show();
}
最后
{
如果(光标!=null){
cursor.close();
}
如果(游标2!=null){
游标2.close();
}
如果(游标3!=null){
游标3.close();
}
}
返回null;
}
以下代码在8秒内执行,总共只执行6项!这简直太慢了。
这里没有1000行,但只有6行。 经过一些调试后,我发现如果我移除另一个内部游标,它会变得非常快

原因可能是什么


非常感谢。

将第一条select语句的结果保存在列表中。然后将它们同时传递给第二个select调用。现在您正在进行大量的数据库调用

我真的不太明白,您能提供进一步的解释或示例吗?请看计数操作需要很多时间。所以,在第一个do while循环中列出AlbumtID。然后,您可以将所有相册id一起传递(在do while循环之外):从“+picturesTableName+”中选择相册id,其中“+PictureStableId+”位于(“+albumIdList+”)中";................. 现在,您需要对结果进行循环,并计算返回特定唱片集Id的次数。这将需要更多的java编码,但会减少db调用。我已经尝试实现您的想法,下面是代码:但我遇到了一个错误:sqlite返回:错误代码=1,msg=没有这样的列:1,2,3,4,5谢谢您的帮助。在相关的PasteBin中,我忘记在“in”关键字之前添加空格,我在原始代码中修复了它,但我还是犯了同样的错误。