在活动运行的整个时间内保持本地sqlite连接打开是否有任何优势?
我通常会创建一个新连接,然后在执行数据库操作的每个方法中关闭它。它看起来像这样:
myMethod(Context context){
LocalDBHelper localDBHelper = new LocalDBHelper(context); //extended SQLiteOpenHelper
SQLiteDatabase db = localDBHelper.getWritableDatabase();
...
localDBHelper.close();
}
因此,在典型的用户会话中,这将发生大约10次。在onResume()
中创建连接是否有意义,在所有数据库访问方法中使用它,最后在onPause()
中关闭它?
答案 0 :(得分:1)
由于您的应用程序在每次连接时都在同一台计算机上工作,并且每次都访问相同的内存,因此将它打开是没有问题的。因为在相同的内存空间中,sqlite只是像主DLL一样加载主应用程序。
可能只会出现一个问题!当你想同时运行许多线程来访问数据库时(例如使用AsyncTask),它们之间的干扰迫使一些线程停止!所以最好每次都为新线程建立连接!
答案 1 :(得分:1)
在活动运行的整个时间内保持本地sqlite连接打开是否有任何优势?
您通常希望在整个过程中都有一个“连接”。特别是,您不希望在多个线程中同时使用多个“连接”。 Android中SQLite的所有线程安全逻辑都是基于对所有这些线程使用单个SQLiteDatabase
(因此,单个SQLiteOpenHelper
),因此可以进行正确的锁定。
答案 2 :(得分:1)
根据@CommonsWare的回答,我已经使用延迟实例化实现了一个Singleton模式,以便拥有LocalDBHelper
的单个应用程序范围实例。到目前为止它工作正常,并且无需为每个操作实例化和关闭帮助器/数据库。
public class MyApplication extends Application{
private static MyApplication instance;
public MyApplication(){
instance = this;
}
public static Context getContext(){
return instance;
}
}
public class LocalDBHelper extends SQLiteOpenHelper{
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_NAME = "MyDB";
private static final String LOG_TAG = "LocalDBHelper";
private static LocalDBHelper instance = null;
/*private constructor to avoid direct instantiation by other classes*/
private LocalDBHelper(){
super(MyApplication.getContext(), DATABASE_NAME, null, DATABASE_VERSION);
}
/*synchronized method to ensure only 1 instance of LocalDBHelper exists*/
public static synchronized LocalDBHelper getInstance(){
if(instance == null){
instance = new LocalDBHelper();
}
return instance;
}
...
...
}
用法:
SQLiteDatabase db = LocalDBHelper.getInstance().getWritableDatabase();
db.insert(...)
用于交易:
SQLiteDatabase db = LocalDBHelper.getInstance().getWritableDatabase();
db.beginTransaction();
try{
....
...
db.setTransactionSuccessful();
}catch(Exception e){
e.printStackTrace();
}
finally{
db.endTransaction();
}
重要提示:无需在任何地方致电localDBHelper.getInstance().close()
答案 3 :(得分:0)
我个人觉得更容易调用初始应用程序加载所需的SQL连接,存储到SQLite数据库中,并为用户设置刷新按钮以决定何时刷新数据,或者为应用程序设置定期更新间隔计时器。
通过这种方式,您可以通过将数据加载置于预定义/用户定义的时间来提高应用程序的一般使用期间的性能。
虽然我认为这取决于DB Interaction的执行频率....
这个问题可能会为您提供一些有用的答案:
Should I open() and close() my SQL database constantly or leave it open?