Android 当查询批量数据时,第一次游标操作非常慢。如何解决?

Android 当查询批量数据时,第一次游标操作非常慢。如何解决?,android,sqlite,Android,Sqlite,我必须查询三个表,并向我的customerView显示数据 我的代码如下: Log.v(TAG, System.CurrentTimeMillis()) int len = cursor.getCount(); Log.v(TAG, System.CurrentTimeMillis()) Product[] products = new Product[len]; int i = 0; while(cursor.moveToNext()){ products[i] = new Prod

我必须查询三个表,并向我的customerView显示数据

我的代码如下:

Log.v(TAG, System.CurrentTimeMillis())
int len = cursor.getCount();
Log.v(TAG, System.CurrentTimeMillis())

Product[] products = new Product[len];
int i = 0;
while(cursor.moveToNext()){
    products[i] = new Product(cursor.getstring(0),.....);
}
Log.v(TAG, System.CurrentTimeMillis())
Sqlite查询:

 String sql = "SELECT T1.PRODUCT_ID, CODE, SHORT_DESCRIPTION, CATEGORY_CODE,
     BRAND_CODE, FORM_CODE, DENOMINATOR, T1.PIECE_PRICE, T1.lowest_piece_price, 
     T2.sku_type, T1.master_sku " + 
 "FROM CUSTOMER_PROD_LIST_ITEMS T1 INNER JOIN PRODUCT T2 ON 

T1.PRODUCT_ID = T2.ID INNER JOIN PRODUCT_UOMS ON T2.ID = 
                                          PRODUCT_UOMS.PRODUCT_ID"+ 
"WHERE T1.VALID = 1 AND PRODUCT_UOMS.VALID = 1 AND 
   CUSTOMER_PRODUCT_LIST_ID = " + customer_pdtlist_ID + " 
ORDER BY T1.PRODUCT_ID ASC";
在我的测试之后,如果游标中有1500行,我们必须花费30多秒来完成这一行(cursor.getcount()。如果我删除这一行,并使用ArrayList执行。我发现我们应该花30多秒来创建Cursor.moveToNext()

所以我的问题是为什么第一次游标操作要花这么长时间?我们如何解决

这个人也有同样的问题。但答案并不适用于我。 顺便说一句,我发现在Iphone上显示同样的1500行,只需要3行


提前谢谢

这就是为什么光标上的第一个操作如此缓慢的原因。当游标由SQLite支持时,Android在内部使用SQLite C库,创建
游标类似于在C库中创建一条准备好的语句。创建准备好的语句成本很低,而且不执行任何查询。摘自C库的文档:

sqlite3\u prepare()

此例程将SQL文本转换为准备好的语句对象,并返回指向该对象的指针。此接口需要通过先前调用sqlite3_open()创建的数据库连接指针和包含要准备的SQL语句的文本字符串。此API实际上并不计算SQL语句。它只是准备SQL语句进行计算

光标上调用
moveToNext()
时,实际执行查询时
moveToNext
导致调用C库中的
sqlite3\u step()
函数。同样,摘自文件:

sqlite3\u步骤()

此例程用于计算先前由sqlite3_prepare()接口创建的已准备好的语句。语句的计算将一直到第一行结果可用为止。要前进到第二行结果,请再次调用sqlite3_step()。继续调用sqlite3_step(),直到语句完成。不返回结果的语句(例如:INSERT、UPDATE或DELETE语句)在对sqlite3_step()的单个调用中运行到完成

因此,创建游标是惰性的,只有在第一次移动游标时才计算查询


要找出查询花费如此长时间的原因,请在查询中使用,并查看瓶颈所在。通常是缺少适当的索引。

好了,伙计们,我已经好几天没来了。我找到了解决方案,那就是你必须为你的表创建索引,这将提高查询速度。同样感谢您,您的查询是什么样子的?String sql=“选择T1.PRODUCT\u ID、代码、简短描述、类别代码、品牌代码、格式代码、分母、T1.Piecle\u PRICE、T1.Lost\u Piecle\u PRICE、T2.sku类型、T1.master\u sku”+“来自客户产品清单项目T1内部连接产品T2在T1.PRODUCT\u ID=T2.ID内部连接产品UOM在T2.ID=PRODUCT\u UOM.PRODUCT\u ID”+,其中T1.VALID=1,PRODUCT\u UOM.VALID=1,CUSTOMER\u PRODUCT\u LIST\u ID=“+CUSTOMER\u pdtlist\u ID+”由T1.PRODUCT\u ID ASC订购";我想你的问题太详尽了,不会造成这次延误。如果您使用这个结果显示在listview中,那么我想您应该使用动态加载,通过使用
LIMIT
只获取少数记录(比如20条),然后在列表滚动到底部时再次加载。我想在我的CustomerView中显示那些与表类似的数据,而不是listview。谢谢Waqas。我不认为这种延迟是因为穷举sql。我可以看到这个sql应该执行多长时间,大约3毫秒。非常快。关键是读取游标。好了,伙计们,我已经好几天没来了。我找到了一个解决方案,那就是你必须为你的表创建索引,这将提高查询速度。还是谢谢你。这应该是公认的答案。索引通常会减少查询时间,但在大型数据库和复杂搜索中,仍然可能在第一次执行游标时遇到延迟(此答案对此进行了解释)。