关于第 1 点),以下代码在 中DBHelper
创建了一个单例连接(注意我只在 Main Activity 的onDestroy
方法中关闭了数据库)。
/**
* Instantiates a new Db helper.
*
* @param context the context
*/
DBHelper(Context context) {
super(context, DBConstants.DATABASE_NAME, null, 1);
}
private static DBHelper instance;
/**
* Gets helper.
*
* @param context the context
* @return the helper
*/
static synchronized DBHelper getHelper(Context context) {
if(instance == null) {
instance = new DBHelper(context);
}
return instance;
}
并且您使用以下内容来获得帮助:-
dbhelper = DBHelper.getHelper(context);
db = dbhelper.getWritableDatabase();
关于您使用的 2,db.beginTransaction();
开始事务, db.setTransactionSuccessful();
在进行数据库更改后将其标记为成功(这是应用事务所必需的。否则,结束事务将有效地否定任何已应用的更改)并 db.endTransaction();
完成交易。请注意,事务不嵌套,因此在嵌套事务时,您必须添加代码,以便beginTransaction
,setTransactionSuccessfull
和endTransaction
只应用一次。
以下是一个适合嵌套的示例:-
void deleteAisle(long aisleid, boolean intransaction) {
if (doesAisleExist(aisleid)) {
if (!intransaction) {
db.beginTransaction();
}
String whereargs[] = {Long.toString(aisleid)};
// Delete ProductUsage rows that have Aisle as a parent
pudeletes = db.delete(
DBProductusageTableConstants.PRODUCTUSAGE_TABLE,
DBProductusageTableConstants.PRODUCTUSAGE_AISLEREF_COL +
" = ?",
whereargs
);
// More done here but removed for brevity (including deletion of the Aisle)
if (!intransaction) {
db.setTransactionSuccessful();
db.endTransaction();
msg = "DB Transacion SET and ENDED for Aisle ID=" + Long.toString(aisleid);
}
}
}
上面可以单独调用,但是如果删除一个商店,那么它可以被多次调用,在这种情况下,它会在 **intransaction ** 为真的情况下被调用(所以beginTransaction
,setTransactionSuccessful
和endTransaction
将被跳过并由父级完成)。
至于有用性,如果一起执行多个操作,您只会使用事务。