2012-06-09 87 views
1

我有一个活动中的代码来从数据库中收集数据。活动打开需要5秒钟。没有这个,活动需要2秒钟才能打开。有没有一种方法来优化此代码?Android的SQL游标很慢

所有数组(包括循环中的一个:arr_calllog_name0)在我的手机上有61个项目。在模拟器中它很快,有6个项目。

for (int i=0; i<arr_calllog_name0.size(); i++) 
    { 


     Cursor crname = info.getAllTitles_Stats2A(arr_calllog_name0.get(i), "1", d1, d2); 
     crname.moveToFirst(); 
     count_in = crname.getInt(0); 
     arr_calllog_numberin0.add(String.valueOf(count_in)); 



     Cursor crname2 = info.getAllTitles_Stats2A(arr_calllog_name0.get(i), "2", d1, d2); 
     crname2.moveToFirst(); 
     count_out = crname2.getInt(0); 
     arr_calllog_numberout0.add(String.valueOf(count_out)); 



     Cursor crname3 = info.sumAllTitles_StatsA(arr_calllog_name0.get(i), "1", d1, d2); 
     crname3.moveToFirst(); 
     sum_in = crname3.getInt(0); 
     arr_calllog_durationin0.add(String.valueOf(sum_in)); 



     Cursor crname4 = info.sumAllTitles_StatsA(arr_calllog_name0.get(i), "2", d1, d2); 
     crname4.moveToFirst(); 
     sum_out = crname4.getInt(0); 
     arr_calllog_durationout0.add(String.valueOf(sum_out)); 

    } 

信息被声明为HotOrNot info = new HotOrNot(ChartsDuration.this);其中HotOrNot是包含DbHelper类扩展SQLiteOpenHelper类。

一个查询(另一种是几乎相同)

public Cursor getAllTitles_Stats2A(String name, String type, String date1, String date2) { 
     return ourDatabase.rawQuery("SELECT COUNT(*) FROM " + DATABASE_TABLE + " WHERE " + KEY_DATE + " BETWEEN '" + date1 + "'" + " AND '" + date2 + "'" + " AND " + KEY_NAME + " = '" + name + "'" + " AND " + KEY_TYPE + " = '" + type + "'" + " COLLATE NOCASE", null); 
    } 

的DATABASE_TABLE有我的电话500个项目。

+0

如果您对每个“item”(无论“item”是什么)执行四个查询,并且有61个“items”,那可能会很慢。然而,因为我们不知道'info'是什么,所有这些查询都是什么,你正在查询什么,'arr_calllog_name0'是什么,为什么你认为你需要运行所有这些查询,等等,这是不可能的任何人都可以真正帮助你。 – CommonsWare

+0

我已更新我的问题。 – erdomester

回答

2

永远不要以这种方式使用游标。游标是宝贵的(游标是一个数据表而不是指针),因此它们在CPU时间方面创建起来很昂贵。你的例子有两个非常严重的问题。

  1. 不要运行查询在for循环
  2. 始终关闭游标,当你用它完成

你更有可能赢得成功,如果你能找到一个方法来做到这一点使用一个JOIN,但没有更多的信息,很难给出一个更确切的解决方案,你的问题。

+0

for循环中的查询是不好的做法,我同意。我设法做到没有for循环,但它没有帮助。为什么要关闭游标?当我不关闭数据库时,出现错误。但是在游标的情况下。 – erdomester

+0

游标使用资源(即吞噬内存)。未能关闭它们将导致资源问题。请注意,如果您使用的是托管游标,那么该活动应该为您关闭此功能。我觉得自己管理它们会更好。至于数据库错误,这是每个活动打开和关闭数据库的常见弊端。这不是致命的,但如果你真的想避免它,你需要通过覆盖默认应用程序类来实现访问数据库的单例模型。你需要研究这个。 – Merlin