如何在Android中的SQlite中使用预准备语句?
伙计们,
我正在寻找一种设计模式,使UI线程能够与客户端SQLite数据库交互,该数据库可能具有批量插入(需要10秒),快速插入和读取,并且不会阻止UI线程.
我想知道我是否正在使用最佳设计模式,因为我最近调试了死锁和同步问题,而且我对我的最终产品没有100%的信心.
所有数据库访问现在都通过单例类进行瓶颈.这是伪代码,显示我如何在我的单例DataManager中接近写入:
public class DataManager {
private SQLiteDatabase mDb;
private ArrayList<Message> mCachedMessages;
public ArrayList<Message> readMessages() {
return mCachedMessages;
}
public void writeMessage(Message m) {
new WriteMessageAsyncTask().execute(m);
}
protected synchronized void dbWriteMessage(Message m) {
this.mDb.replace(MESSAGE_TABLE_NAME, null, m.toContentValues());
}
protected ArrayList<Message> dbReadMessages() {
// SQLite query for messages
}
private class WriteMessageAsyncTask extends AsyncTask<Message, Void, ArrayList<Messages>> {
protected Void doInBackground(Message... args) {
DataManager.this.mDb.execSQL("BEGIN TRANSACTION;");
DataManager.this.dbWriteMessage(args[0]);
// More possibly expensive DB writes
DataManager.this.mDb.execSQL("COMMIT TRANSACTION;");
ArrayList<Messages> newMessages = DataManager.this.dbReadMessages();
return newMessages;
} …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,一项服务是从服务器获取数据并将其插入table A.
如果我去特定的UI,我需要列出来自另一个的数据,table B如果后台操作正在执行它将生成数据库锁定异常.我在两个不同的表上并行完成了两个数据库操作.
它在三星gt15801中工作正常.但是htc希望它会产生数据库锁定错误.
HTC的愿望 - 插入过程需要91秒.
三星gt15801 - 插入过程需要21秒.
所以想象一下这是我的数据库的快速模型:

数据库中的项目按列表呈现给用户,每个列表都显示在一个新片段上,这些片段显示在视图页面上。因此,假设在这种假设情况下,viewpager 上将有两个片段,第一个片段将显示first_list,第二个片段将显示second_list。这是该查询的代码:
public static Cursor getListItems (final Context context, String listName) {
if (mDatabase == null || !mDatabase.isOpen())
open(context); //This gets the writable db.
String where = LIST_NAME + " = '" + listName + "'";
return mDatabase.query(TABLE_LIST_ITEMS, PROJECTION_LIST_ITEMS,
where, null, null, null, SORT_ORDER);
}
Run Code Online (Sandbox Code Playgroud)
哪里SORT_ORDER是order_in_list,这个效果很好,与开始。
现在,列表视图可以使用 public library重新排列,它试图允许用户控制每个列表中项目的顺序。这是我遇到问题的地方,没有add(int index, Object object)光标,或者其他一些管理排序的简单方法。我一开始以为我可以简单地调用mDatabase.update()更改值,order_in_list但这有效,但结果并不如预期。例如,用户将第二项拖动到零位置,请记住:零索引值,我们现在有两个order_in_list为零的项目。虽然我可以叫mDatabase.update()上项目一个更新他的位置,一个 …
我想在开始时在我的SQLite上添加1000条记录,但问题是,当我启动APP时,它会变成白色屏幕,然后是黑屏,直到它崩溃,当我放入5条记录时,它仍然在做同样的事情.白色屏幕和黑屏,但是当添加记录时,它会向我显示所有记录的祝酒词,所以它有效...这是我的SQLiteBaseAdapter:
public class ClientsSQL extends SQLiteOpenHelper {
// Declaramos la sentencia para crear la tabla
String sqlCreate = "CREATE TABLE Clients(NIF text,cognom1 text,cognom2 text,nom text)";
public ClientsSQL(Context context, String name, SQLiteDatabase.CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sqlCreate);
db.execSQL("INSERT INTO Clients VALUES ('39410028B', 'hola1', 'Hola2', 'Jonathan')");
Log.v("INFO1", "creating db");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method …Run Code Online (Sandbox Code Playgroud)