【问题标题】:Android SQLiteDatabase SELECT query take long timeAndroid SQLiteDatabase SELECT 查询需要很长时间
【发布时间】:2015-10-23 20:05:54
【问题描述】:

我在 TABLE_CONTACT 中有大约 1500 条记录。我获取联系人的代码:

public ArrayList<SBContact> getAllContacts() {
    SQLiteDatabase database = dbHelper.getWritableDatabase();
    ArrayList<SBContact> mContacts = new ArrayList<SBContact>();
    String selectQuery = "SELECT  * FROM " + SBDatabaseHelper.TABLE_CONTACT;
    Cursor cursor = database.rawQuery(selectQuery, null);

    if (cursor.moveToFirst()) {
        do {
            SBContact result = new SBContact(cursor.getString(cursor.getColumnIndex(SBDatabaseHelper.CONTACT_NUMBER)),
                    cursor.getString(cursor.getColumnIndex(SBDatabaseHelper.CONTACT_NAME)), cursor.getInt(cursor.getColumnIndex(SBDatabaseHelper.EXITS_USER)));
            mContacts.add(result);
        } while (cursor.moveToNext());
    }
    return mContacts;
}

问题是:我第一次运行这个方法,大约需要15ms。 5秒后我再次运行这个方法,大约需要20 seconds

同理,第一次调用后,15s 后,再次运行方法,大约需要10 seconds。 2分钟后,再次运行该方法,第一次运行大约需要15ms

此时,没有其他线程对数据库进行读/写查询。

我不明白SQLiteDatabase 的作用。需要时间来释放内存还是做点什么?

已编辑 对不起,这不是SQLiteDatabase 的问题。有关此案例的更多详细信息,请参阅我的回答。

【问题讨论】:

  • 只选择您实际使用的联系人中的行,而不是*
  • 您的意思是columns 而不是rows?我的表只有 2 列,所以我认为使用 * 不是问题。
  • 是的,对不起,我的意思是列!另外,好的捕获可能愿意在 SQLiteDatabase 对象上测试查询与 rawQuery 的性能差异。这个数据集有多大?
  • 为什么要在 do..while 循环中迭代光标?
  • 你认为为什么需要加载所有数据?

标签: android sqlite select


【解决方案1】:

对不起,我的错。

此问题与SQLiteDatabase 无关。这是由于AsyncTask的问题。

我的情况是:我运行 AsyncTask 以从本地数据库(sqlite)获取联系,同时,我在此 AsyncTask 中启动新线程与服务器一起工作(调用 api 需要很长时间)。当我再次运行 AsyncTask 以获取联系人时(使用 execute 方法),旧的 AsyncTask 仍在运行,它阻止了新的运行。这就是新任务需要很长时间才能完成的原因。 我已经通过使用executeOnExecutor 方法修复,方法的结果立即返回。

再一次,对不起。

【讨论】:

    【解决方案2】:

    每次查询后关闭光标

    【讨论】:

    • 谢谢你,我的错误,但它并没有解决问题
    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 2016-02-02
    • 2018-01-09
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多