我对如何使用Begin Transaction
进行数据库操作表示怀疑我有2个数据源对象:ClientDataSource和MovementsDataSource
每个都有自己的SQLitedabase对象,该对象使用Open()方法设置,并使用可写数据库设置其数据库私有对象。
现在,我必须将记录从移动表发送到服务器,然后从同一服务器请求更新的客户端。
在我的课程中,我首先发送新动作,然后如果成功,从SQLite中删除所有客户端,最后从服务器检索新的更新客户端并将它们插入数据库。
每个数据源都有一个Get()方法来获取它们各自的数据库对象,但它实际上是它们运行的同一个数据库,我不知道如何使用BaginTransction,Endtransaction方法来确保数据的一致性
这是Async Task的代码
@Override
protected Boolean doInBackground(String... url) {
try {
clientDataSource.open();
movementDataSource.open();
} catch (SQLException e) {
//Treat SQL Exception
}
try {
if(sendMovements()) {
clientDataSource.deleteAllClients();
}
updateDatabase(url[0]);
} catch (JSONException e) {
//Treat Json Exception
} catch (IOException e) {
//Treat IOException
}
return true;
}
答案 0 :(得分:0)
我必须举一个例子,然后知道如何运作...
public static void Insert(ArrayList<Model_CategoryMaster> categoryMasters) {
SQLiteDatabase sqldb = EGLifeStyleApplication.sqLiteDatabase;
sqldb.beginTransaction();
for (Model_CategoryMaster model : categoryMasters) {
ContentValues values = new ContentValues();
values.put(CATEGORY_ID, model.Category_Id);
values.put(CATEGORYNAME, model.CategoryName);
values.put(DESCRIPTION, model.Description);
values.put(ISACTIVE, model.IsActive);
values.put(CREATEDON, model.CreatedOn);
values.put(CREATEDBY, model.CreatedBy);
values.put(UPDATEDON, model.UpdatedOn);
values.put(UPDATEDBY, model.UpdatedBy);
values.put(ISDELETED, model.IsDeleted);
values.put(DELETEDON, model.DeletedOn);
values.put(DELETEDBY, model.DeletedBy);
values.put(PK_CATEGORYMASTER, model.PK_CategoryMaster);
if (!CommonMethod.CheckIsDataAlreadyInDBorNot(Table_Name,
CATEGORY_ID, model.Category_Id)) {
sqldb.insert(Table_Name, null, values);
} else {
sqldb.update(Table_Name, values, "Category_Id=?",
new String[] { model.Category_Id });
}
}
sqldb.setTransactionSuccessful();
sqldb.endTransaction();
}// End insert method
开始事务意味着数据将获得arraylist然后db将打开一次并且sql.begintansaction()用于获得更快的数据库操作。因为db没有打开或关闭更多次。