例如考虑这个功能
public void insertRow(CoolObject coolObject) {
ContentValues values = new ContentValues();
values.put("some field name", coolObject.getSomeValue());
//and so on and so on
mDatabase.open();
mDatabase.insertWithOnConflict("CoolTable",
null,
values,
SQLiteDatabase.CONFLICT_IGNORE);
mDatabase.close();
}
我打开数据库,使用数据库执行某种SQL命令,然后再次关闭数据库。
现在考虑一下:
public void insertRows(List<CoolObject> coolObjectList) {
mDatabase.beginTransaction();
try {
for (CoolObject coolObject : coolObjectList) {
insertRow(coolObject);
}
mDatabase.setTransactionSuccessful();
}
finally {
mDatabase.endTransaction();
}
}
在这种情况下,我运行一个循环,重复调用insertRow()
,但是在单个数据库事务的框架内。
我的问题:
这是一个我打开和关闭的问题吗?它可能对单个调用有意义,但我担心如果我一遍又一遍地调用插入行,那就是大量的开启和关闭。
如果数据库在我完成行操作时关闭,我是否必须再次打开它,即使是mDatabase.beginTransaction();
或mDatabase.setTransactionSuccessful();
或mDatabase.endTransaction();
之类的东西?
我也不能只是打开和关闭insertRow()
并将其添加到insertRows()
方法的开头和结尾,因为那时它是,好吧,不是insertRow()
1}}现在如果我想单独调用该函数,我就不再打开/关闭了。
解决这些错误的可接受方法是什么?
答案 0 :(得分:0)
这是一个我打开和关闭的问题吗?它可能对单个调用有意义,但我担心如果我一遍又一遍地调用插入行,那就是大量的开启和关闭。
根据数据库的不同,每次都会打开一个新的进程或线程,这个进程或线程并不是真正有效的,而且它可能无法正常关闭......
尝试组合插入,这将有助于保持较低的资源。
如果您有机会并且仍希望采用第一种方式,请实施一个连接池,以保持连接打开。
答案 1 :(得分:0)
public void insertRow(CoolObject coolObject) {
ContentValues values = new ContentValues();
values.put("some field name", coolObject.getSomeValue());
//and so on and so on
mDatabase.open();
try {
// Do whatever you want to do with your connection
mDatabase.insertWithOnConflict("CoolTable",
null,
values,
SQLiteDatabase.CONFLICT_IGNORE);
}catch(Exception err) {
// handle error
}finally {
mDatabase.close();
}
}
在我看来,上面的代码可以让你处理大多数情况。在上面的方法中,如果mDatabase.open()
抛出错误,那将是一个问题。要处理这种情况,您可以将connection
作为资源参数传递给try方法。