简短版:从活动和已启动的服务访问同一个数据库的最佳做法是什么?
长版本:我有一个案例,我从活动开始持久服务。当活动在屏幕上显示数据时,服务正在使用数据填充数据库。它们都没有一直在运行 - 服务可以在没有活动时运行,并且活动可以在服务尚未启动时运行。但是服务只能从活动中停止(它永远不会停止)。
我正在使用SQLiteOpenHelper的子类来访问数据库。我绊倒的问题显然是closing DB in one SQLiteOpenHelper
instance closes it in another too。
我可以想到这些选项:
SQLiteDatabase
实例在公共静态var-only活动中可以关闭它(因为它知道服务是否正在运行)) - 丑陋getReadableDatabase()
/ close()
我会选择3.,但这必须是一个非常常见的模式,所以我想知道是否已经有这样的内置机制 - 我不想重新发明轮子。
换句话说,做到这一点的正确方法是什么?
答案 0 :(得分:1)
Android上任何数据库的通常范例是让一个提供程序打开数据库并将请求作为意图处理。这具有序列化请求的优点。
从不同代码打开数据库是完全不标准的。
如果你真的需要一个应用程序来注意每次添加某些东西,提供者的广播意图可能就是答案。
答案 1 :(得分:0)
我使用保留/释放计数器解决了这个问题:
public class DBHandler extends SQLiteOpenHelper
{
private static int retainCount = 0;
@Override
public synchronized SQLiteDatabase getReadableDatabase()
{
DBHandler.retainCount++;
return super.getReadableDatabase();
}
@Override
public synchronized SQLiteDatabase getWritableDatabase()
{
DBHandler.retainCount++;
return super.getWritableDatabase();
}
@Override
public synchronized void close()
{
DBHandler.retainCount--;
if (DBHandler.retainCount == 0)
super.close();
}
}
}