gpt4 book ai didi

Android 数据库事务

转载 作者:IT老高 更新时间:2023-10-28 13:09:18 27 4
gpt4 key购买 nike

我已经创建了一个数据库。我想做交易。 SaveCustomer() 包含多个语句,用于将记录插入到当时的 Customer, CustomerControl, Profile, Payment 表中。

当用户调用 SaveCustomer() 方法时,该数据将转到这 4 个表中。那么我该如何进行交易?如果一个表插入失败,则需要回滚所有内容。比如第三张表插入记录时出错,那么还需要回滚前两张表的插入记录。

查看我的代码:

public void saveCustomer(){
DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(RetailerOrderKeyActivity.this);
dbAdapter.openDataBase();
ContentValues initialValues = new ContentValues();
initialValues.put("CustomerName",customer.getName());
initialValues.put("Address",customer.getAddress());
initialValues.put("CustomerPID",strPID);
initialValues.put("Date",strDateOnly);
long n = dbAdapter.insertRecordsInDB("Customer", null, initialValues);

}

同样还有其他声明。

DBAdpter 代码是:

public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) {
long n =-1;
try {
myDataBase.beginTransaction();
n = myDataBase.insert(tableName, nullColumnHack, initialValues);

myDataBase.endTransaction();
myDataBase.setTransactionSuccessful();
} catch (Exception e) {
// how to do the rollback
e.printStackTrace();
}

return n;
}

这是完整的代码:

public class DBAdapter extends SQLiteOpenHelper {

private static String DB_PATH = "/data/data/com.my.controller/databases/";
private static final String DB_NAME = "customer";
private SQLiteDatabase myDataBase;
private final Context myContext;
private static DBAdapter mDBConnection;


private DBAdapter(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
DB_PATH = "/data/data/"
+ context.getApplicationContext().getPackageName()
+ "/databases/";
// The Android's default system path of your application database is
// "/data/data/mypackagename/databases/"
}


public static synchronized DBAdapter getDBAdapterInstance(Context context) {
if (mDBConnection == null) {
mDBConnection = new DBAdapter(context);
}
return mDBConnection;
}


public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
if (dbExist) {
// do nothing - database already exist
} else {
// By calling following method
// 1) an empty database will be created into the default system path of your application
// 2) than we overwrite that database with our database.
this.getReadableDatabase();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}


private boolean checkDataBase() {
SQLiteDatabase checkDB = null;

try {
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READONLY);

} catch (SQLiteException e) {
// database does't exist yet.
}
if (checkDB != null) {
checkDB.close();
}
return checkDB != null ? true : false;
}


private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
myOutput.close();
myInput.close();
}

/**
* Open the database
* @throws SQLException
*/
public void openDataBase() throws SQLException {
String myPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
}


@Override
public synchronized void close() {
if (myDataBase != null)
myDataBase.close();
super.close();
}

/**
* Call on creating data base for example for creating tables at run time
*/
@Override
public void onCreate(SQLiteDatabase db) {
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("ALTER TABLE WMPalmUploadControl ADD Testing int");

}

public void upgradeDb(){
onUpgrade(myDataBase, 1, 2);
}

public Cursor selectRecordsFromDB(String tableName, String[] tableColumns,
String whereClase, String whereArgs[], String groupBy,
String having, String orderBy) {
return myDataBase.query(tableName, tableColumns, whereClase, whereArgs,
groupBy, having, orderBy);
}


public ArrayList<ArrayList<String>> selectRecordsFromDBList(String tableName, String[] tableColumns,
String whereClase, String whereArgs[], String groupBy,
String having, String orderBy) {

ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>();
ArrayList<String> list = new ArrayList<String>();
Cursor cursor = myDataBase.query(tableName, tableColumns, whereClase, whereArgs,
groupBy, having, orderBy);
if (cursor.moveToFirst()) {
do {
list = new ArrayList<String>();
for(int i=0; i<cursor.getColumnCount(); i++){
list.add( cursor.getString(i) );
}
retList.add(list);
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
return retList;

}


public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) {
long n =-1;
try {
myDataBase.beginTransaction();
n = myDataBase.insert(tableName, nullColumnHack, initialValues);

myDataBase.endTransaction();
myDataBase.setTransactionSuccessful();
} catch (Exception e) {
// how to do the rollback
e.printStackTrace();
}

return n;
}


public boolean updateRecordInDB(String tableName,
ContentValues initialValues, String whereClause, String whereArgs[]) {
return myDataBase.update(tableName, initialValues, whereClause,
whereArgs) > 0;
}

public int updateRecordsInDB(String tableName,
ContentValues initialValues, String whereClause, String whereArgs[]) {
return myDataBase.update(tableName, initialValues, whereClause, whereArgs);
}


public int deleteRecordInDB(String tableName, String whereClause,
String[] whereArgs) {
return myDataBase.delete(tableName, whereClause, whereArgs);
}


public Cursor selectRecordsFromDB(String query, String[] selectionArgs) {
return myDataBase.rawQuery(query, selectionArgs);
}


public ArrayList<ArrayList<String>> selectRecordsFromDBList(String query, String[] selectionArgs) {
ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>();
ArrayList<String> list = new ArrayList<String>();
Cursor cursor = myDataBase.rawQuery(query, selectionArgs);
if (cursor.moveToFirst()) {
do {
list = new ArrayList<String>();
for(int i=0; i<cursor.getColumnCount(); i++){
list.add( cursor.getString(i) );
}
retList.add(list);
} while (cursor.moveToNext());
}
if (cursor != null && !cursor.isClosed()) {
cursor.close();
}
return retList;
}

}

database lock issue in HTC Desire .

如果插入表格数据时出现任何问题,我想回滚。

请帮帮我

谢谢。

我看了同样的相关问题:

最佳答案

其实你做错了。如果您有多个记录要插入数据库或如果在其中一个数据库表中插入数据时出现问题,则必须从其他表回滚数据。

例如

你有两张 table

  1. 一个
  2. B

现在您想在这两个表中插入数据,但如果在表中插入数据时出现任何错误,则必须回滚事务。

现在您已成功在表 A 中插入数据,现在您正尝试在表 B 中插入数据。现在如果在表 B 中插入数据时出错,则必须从表 A 中删除相关数据这意味着您必须回滚事务。

如何在 Android 中使用数据库事务

  1. 如果要启动事务有一个方法beginTransaction()
  2. 如果你想提交事务有一个方法setTransactionSuccessful()这将提交数据库中的值
  3. 如果你已经启动了事务,你需要关闭事务,所以有一个方法 endTransaction()这将结束您的数据库事务

现在主要有两点

  1. 如果你想设置交易成功你需要写setTransactionSuccessful()然后 endTransaction()之后 beginTransaction()
  2. 如果您想回滚事务,则需要 endTransaction()未通过 setTransactionSuccessful() 提交事务.

您可以从 here 获取有关 SQLite 数据库事务的详细信息。

你的情况

您可以在 try 和 catch block 中调用 saveCustomer() 函数

db.beginTransaction();
try {
saveCustomer();
db.setTransactionSuccessful();
} catch {
//Error in between database transaction
} finally {
db.endTransaction();
}

关于Android 数据库事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8147440/

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