Java 从SQLite DB创建ArrayList非常慢
好的,我正在尝试从我的SQLite DB创建一个小而轻量级的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
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”关键字之前添加空格,我在原始代码中修复了它,但我还是犯了同样的错误。