gpt4 book ai didi

android - 加快对 SQLite 数据库的查询

转载 作者:行者123 更新时间:2023-11-30 03:55:06 24 4
gpt4 key购买 nike

我已经对 SQLite 数据库的 IO 进行了一些测量。从这个数据库加载一些对象大约需要 6 秒。我有一个扩展 Asynctask 的类,这个类的工作是加载我的数据库中的最后 10 个条目。这个类是这样构造的:

import View.CustomAdapter;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.util.Log;
import android.view.*;

public class LoadCases extends AsyncTask<String, Integer, ArrayList<Case>> {

ProgressBar progressBar;
ArrayList<Case> lastTenCases;
CustomAdapter cAdapter;
Context context;
ListView lastCases;
DatabaseHandler db;
TextView loading;
int options;

public LoadCases(ProgressBar progressBar, Context context, ListView lastCases, TextView loading, ArrayList<Case> lastTenCases) {
this.progressBar = progressBar;
this.context = context;
this.lastCases = lastCases;
this.loading = loading;
this.lastTenCases = lastTenCases;
db = new DatabaseHandler(context);
}

public void onPreExecute() {
progressBar.incrementProgressBy(1);
}


@Override
protected ArrayList<Case> doInBackground(String... params) {
long start = System.nanoTime();
lastTenCases = db.getAllCases(10);
long end = System.nanoTime();
Log.d("TIME TO LOAD CASES FROM BASE: ", Long.toString((end-start)/1000000000));
return lastTenCases;
}

public void onPostExecute(ArrayList<Case> result) {
progressBar.setVisibility(View.GONE);
loading.setVisibility(View.GONE);
cAdapter = new CustomAdapter(context, lastTenCases);
cAdapter.notifyDataSetChanged();
lastCases.setAdapter(cAdapter);

}

如您所见,测量是在我调用方法 getAllCases(10)

之前完成的
long start = System.nanoTime();
lastTenCases = db.getAllCases(10);
long end = System.nanoTime();
Log.d("TIME TO LOAD CASES FROM BASE: ", Long.toString((end-start)/1000000000));

如前所述,这将给我大约 6 秒的时间从数据库加载 10 个案例。

现在,转到 getAllCases 方法

public ArrayList<Case> getAllCases(int take) {

ArrayList<Case> caseList = new ArrayList<Case>();
String selectQuery = "SELECT *, (strftime('%s', DATE) * 1000) AS DATENOW FROM " + TABLE_CASES + " ORDER BY " + DATE + " DESC LIMIT " + Integer.toString(take) + " ;";

SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);

// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
Case c = new Case();

long millis = cursor.getLong(cursor.getColumnIndexOrThrow("DATENOW"));
Date addedOn = new Date(millis);
c.setCaseNumber(cursor.getString(0));
c.setDate(addedOn.toLocaleString());
c.setStatus(cursor.getString(cursor.getColumnIndex(STATUS)));
caseList.add(c);
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return caseList;
}

此方法将构造Case 对象,并将其添加到ArrayList。这个 ArrayList 将被返回。是的,我猜你理解代码。但是 6 秒,真的吗?我究竟做错了什么?我怎样才能加快这个操作?

谢谢!

最佳答案

这取决于您的数据库结构(例如,如果 TABLE_CASES 只是另一个复杂查询)和 TABLE_CASES 中的字段数,但至少可以改进以下几点:

  • strftime('%s', DATE) * 1000) - 当您需要获取 CASE 时,您真的需要每次都计算它吗?存储该值而不是计算肯定会加快查询速度;
  • 不确定是否需要 ArrayList,可能是 CursorLoader可以使用;
  • 基于 this tip new Date(millis) 的调用可能应该移出循环;
  • getColumnIndexOrThrowgetColumnIndex 的调用也应移出循环;
  • toLocaleString 在 API 级别 1 中已弃用,请使用 DateFormat

最后建议关注this guide for traceview并确定延迟是否实际发生在 SQLite 中或紧随其后的循环中。

关于android - 加快对 SQLite 数据库的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13473780/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com