2010-11-02 170 views
1

我正在建立一个Android应用程序的工作,但我没有,我的SQL操作正在采取永远完成Android的SQLite的需要很长时间才能完成

我已经异形应用范围缩小到行为将光标移动到结果集的第一行以进行简单的选择查询(只返回1行,我正在测试它以消除结果集的大小作为一个问题)。

是否有更好的移动选项到结果集的开头?

编辑:

一些代码:

public Cursor sqlQuery(String Sql) 
{ 
    Cursor c = database.rawQuery(Sql, null); 
    //start at the first spot 
    c.moveToFirst(); 
    return c; 
} 

和调用代码

Cursor Slots = evedb.sqlQuery("SELECT attrib.value, " 
      +"attribtypes.attributename " 
      +"FROM dgmTypeAttribs AS attrib " 
      +"INNER JOIN invTypes AS type " 
      +"ON attrib.typeID = type._ID " 
      +"INNER JOIN dgmAttribs AS attribtypes " 
      +"ON attrib.attributeID = attribtypes._ID " 
      +"AND attribtypes.attributename = 'hiSlots' " 
      +"AND type.typeName = '" + shipname + "'"); 

这个运行3次,我有它的时间约2秒的代码或超过这个在一分钟内所有的休息。

我也运行了rawQuery语句,但没有移动到第一个,它需要大约18秒,所以我先看看代码中最糟糕的部分。

+0

能否请您与我们分享您的代码,看看您是否做错了什么。你有没有试过在adb的sqlite控制台上运行查询? – Pentium10 2010-11-02 12:47:55

+0

看到我的评论下面我已经尝试了一些移动指针的选项,但是对新创建的光标的特定操作正在将我的加载时间从3个查询的约2秒钟加载到一分钟以上。 – Philderbeast 2010-11-02 13:18:28

+0

代码添加了更多关于测试已经完成的细节以找到我的问题的来源。 – Philderbeast 2010-11-02 13:31:44

回答

0

你有没有使用你正在使用的代码snipet来查看可能出错?

如果您正在讨论移动到游标中的第一项,我使用:c.moveToFirst()其中c是游标。

+1

我试过moveToFrist()moveToNext()和moveToPosition(0)但是所有这些都会导致活动花费超过1分钟来初始化3个查询 – Philderbeast 2010-11-02 12:41:09

1

您可能拥有大型数据集。你可以做什么:

  1. 确保你有适当的索引中对使用的每一个领域,或者语法应该被索引(所有的FK字段建立索引中有你为每个表设置PK你的_ID场?) (一般来说)。

  2. 你应该改一下你的查询:

    +"ON attrib.attributeID = attribtypes._ID " 
    +"WHERE attribtypes.attributename = 'hiSlots' " 
    +"AND type.typeName = '" + shipname + "'"); 
    
  3. 考虑使用PreparedStatement的

  4. 此查询使用的数据的检查量 - 删除其中的条件,只是把COUNT(*)

  5. 考虑将一个大查询拆分为几个较小的查询。还有EXPLAIN命令可用于检查SQLite用来检索数据的方式。看看here获取更多信息。

移动到第一行是在查询开始收集数据,因此这仅仅是数据库性能问题的地步。

相关问题