1. 程式人生 > >SQLite查詢優化,提高獲取資料速度

SQLite查詢優化,提高獲取資料速度

我們在是用SQlite查詢資料,獲取某個欄位的值時,經常用到的方法是:
int age = cursor.getInt(cursor.getColumnIndex("age"));


其實我們可以優化一下,我們查詢的時候,是知道查詢資料庫返回cursor中某一欄位的索引值。
假如“age”欄位的索引值是:3。(不是資料庫當中欄位的索引值)可以優化為:
int age = cursor.getInt(3);
這樣就可以提高查詢速度了。


例子:
public class ExceciseDbHelper {
public static final String tag = "ExceciseDbHelper";
public static final String KEY_ID = "_id";
public static final String KEY_DATE = "date";
public static final String KEY_TYPE = "activity_type";
public static final String KEY_TIME = "time";
public static final String KEY_SPEED = "speed";
public static final String KEY_DISTANCE = "distance";
public static final String KEY_CALORIES = "calories";
public static final String KEY_FINISH = "isFinish";
public static final String KEY_COLA = "cola";
private static final String DATABASE_NAME = "health.db";
private static final String DATABASE_TABLE = "excercise";
private static final int DATABASE_VERSION = 1;
private static ExceciseDbHelper mHRHelper;
private static final String DATABASE_CREATE = "create table excercise (_id integer primary key autoincrement, "
+ "date date not null, activity_type integer not null,time integer not null, speed text not null, "
+ "distance text not null, calories text not null, isFinish integer not null, cola text);";
private SQLiteDatabase mDb;
private DatabaseHelper mDbHelper;



// 要查詢資料庫的欄位
public String[] projection = new String[]{KEY_ID, KEY_DATE,KEY_TYPE,KEY_TIME,KEY_SPEED,
KEY_DISTANCE,KEY_CALORIES,KEY_FINISH};
// 對應欄位的索引值 對應上面陣列的下標
public static final int ID_INDEX = 0;
public static final int DATE_INDEX = 1;
public static final int TYPE_INDEX = 2;
public static final int TIME_INDEX = 3;
public static final int SPEED_INDEX = 4;
public static final int DISTANCE_INDEX = 5;
public static final int CALORIES_INDEX = 6;
public static final int FINISH_INDEX = 7;

private ExceciseDbHelper(Context context) {
mDbHelper = new DatabaseHelper(context);
mDb = mDbHelper.getWritableDatabase();
}


public static ExceciseDbHelper getInstance(Context context) {
if (mHRHelper == null) {
mHRHelper = new ExceciseDbHelper(context);
}
return mHRHelper;
}


public void closeDatabase() {
mDbHelper.close();
}

public Cursor getAllData() {
return mDb.query(DATABASE_TABLE, projection, null, null, null, null, "_id desc");
}

public Cursor getShowData(int number) {
return mDb.query(DATABASE_TABLE, projection, null, null, null, null, "_id desc","0,"+number);
}
public List<ActivityData> getDataForshow(int number) {
List<ActivityData> data = null;
Cursor cursor = getShowData(number);
if(cursor !=null && cursor.getCount() > 0) {
data = new ArrayList<ActivityData>();
while(cursor.moveToNext()) {
//int activityType = cursor.getInt(cursor.getColumnIndex(KEY_TYPE)); 不推薦
// 直接使用索引值
int activityType = cursor.getInt(TYPE_INDEX);
int elpasedTime = cursor.getInt(TIME_INDEX);
String distance = cursor.getString(DISTANCE_INDEX);
String speed = cursor.getString(SPEED_INDEX);
String cal = cursor.getString(CALORIES_INDEX);
String date = cursor.getString(DATE_INDEX);
int finish = cursor.getInt(FINISH_INDEX);
ActivityData mActivityData = new ActivityData(activityType, elpasedTime, distance, speed, cal, date,finish);
mActivityData.id = cursor.getInt(ID_INDEX);
data.add(mActivityData);
}
}
if(cursor != null) {
cursor.close();
}
return data;

}

private static class DatabaseHelper extends SQLiteOpenHelper {


DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}


@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS excercise");
onCreate(db);
}


}

}