[英]Android SQLite querys are too slow
大家好 我的應用程序中有一個查詢,該查詢經常被調用,這需要很多時間。 我的數據庫是使用SQLiteCipher加密的(我知道這會降低性能,所以我只調用和打開一次DB)。 所以實際上我有一個帶有自定義適配器的列表視圖,其中列出了模具名稱,lastMassage和lM的時間。 所以我必須做這項工作:
public Massage getLastMassage(String ChatNumber) {
String[] args = {ChatNumber};
//String selectQuery="SELECT * FROM " + MassageDBHelper.DATABASE_NAME + " WHERE PhoneNumber=?";
//Cursor cursor=database.rawQuery(selectQuery,args);
Cursor cursor = database.query(MassageDBHelper.DATABASE_NAME, columns, "PhoneNumber=?", args, null, null, null);
cursor.moveToLast();
Massage massage = cursorToMassage(cursor);
cursor.close();
return massage;
}
那是我的databaseHelperClass中稱為MassageDataSource的代碼,我也嘗試過查詢字符串,但是Performance並沒有區別。 在我的CustomAdapter中,我必須為每個聊天(每個被寫的人)執行以下操作:
Massage lastMassage = massageDataSource.getLastMassage(kontaktItem.getNummer());
Date date = lastMassage.getTimeAsDate();
cal.setTime(date);
int Jahr = cal.get(Calendar.YEAR);
int Monat = cal.get(Calendar.MONTH);
int Tag = cal.get(Calendar.DAY_OF_MONTH);
int Stunden = cal.get(Calendar.HOUR_OF_DAY);
int Minuten = cal.get(Calendar.MINUTE);
if (Jahr < Kalenderjahr || Monat < Kalendermonat || Tag + 1 < Kalendertag) {
viewHolder.Uhrzeit.setText(String.format("%02d", Tag) + "." + String.format("%02d", Monat) + "." + Jahr % 1000);
} else if (Tag < Kalendertag) {
viewHolder.Uhrzeit.setText(R.string.gestern);
} else {
viewHolder.Uhrzeit.setText(String.format("%02d", Stunden) + ":" + String.format("%02d", Minuten));
}
viewHolder.Kontaktname.setText(kontaktItem.getName());
viewHolder.Chatsnippet.setText(lastMassage.getMassageText());
//set Image from server
return view;
編輯這里也是cursorToMassage函數,稱為:
private Massage cursorToMassage(Cursor cursor) {
int idPhoneNumber = cursor.getColumnIndex(MassageDBHelper.COLUMN_PHONENUMBER);
int idType = cursor.getColumnIndex(MassageDBHelper.COLUMN_TYPE);
int idMassagetext = cursor.getColumnIndex(MassageDBHelper.COLUMN_MASSAGETEXT);
int idAttachment = cursor.getColumnIndex(MassageDBHelper.COLUMN_ATTACHMENTID);
int idTime = cursor.getColumnIndex(MassageDBHelper.COLUMN_TIME);
int idPosition = cursor.getColumnIndex(MassageDBHelper.COLUMN_POSITION);
String phoneNumber = cursor.getString(idPhoneNumber);
String type = cursor.getString(idType);
String massagetext = cursor.getString(idMassagetext);
String attachment = cursor.getString(idAttachment);
String time = cursor.getString(idTime);
Boolean position = Boolean.valueOf(cursor.getString(idPosition));
Massage massage;
if (type.equals("text")) {
massage = new Massage(position, massagetext, phoneNumber, time);
} else {
massage = new Massage(position, attachment, type, phoneNumber, time);
}
return massage;
}
嘗試交易。 Android數據庫交易
public Massage getLastMassage(String ChatNumber) {
database.beginTransaction();
Massage massage = null;
try {
String[] args = {ChatNumber};
//String selectQuery="SELECT * FROM " + MassageDBHelper.DATABASE_NAME + " WHERE PhoneNumber=?";
//Cursor cursor=database.rawQuery(selectQuery,args);
Cursor cursor = database.query(MassageDBHelper.DATABASE_NAME, columns, "PhoneNumber=?", args, null, null, null);
cursor.moveToLast();
massage = cursorToMassage(cursor);
cursor.close();
} catch {
//Error in between database transaction
} finally {
database.endTransaction();
return massage;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.