0

简短版:从活动和启动服务访问同一数据库的最佳实践方式是什么?

长版:我有一个从活动开始持久服务的案例。当活动在屏幕上显示数据时,服务正在用数据填充数据库。它们都不是一直在运行 - 服务可以在没有活动时运行,而活动可以在服务尚未启动时运行。但是服务只能从活动中停止(它永远不会自行停止)。

我正在使用 SQLiteOpenHelper 的子类来访问数据库。我绊倒的问题是,显然在一个实例中关闭数据库SQLiteOpenHelper也会在另一个实例中关闭它

我可以想到这些选项:

  1. 单例模式(SQLiteDatabase公共静态变量中的单个实例 - 只有活动才能关闭它(因为它知道服务是否正在运行)) - 丑陋
  2. 检查服务/活动是否正在运行,然后在另一个中关闭它 - 丑陋
  3. 将获取/发布构建到 SQLiteOpenHelper 的getReadableDatabase()/close()

我会选择 3.,但这一定是一个非常常见的模式,所以我想知道是否已经有这样的内置机制 - 我不想重新发明轮子。

换句话说,正确的方法是什么?

4

2 回答 2

1

Android 上任何数据库的通常范例是让一个提供者打开数据库并将请求作为意图处理。这具有序列化请求的优点。

从不同的代码打开数据库是完全不标准的。

如果您确实需要应用程序在每次添加某些内容时都注意到,那么来自提供商的广播意图可能就是答案。

于 2012-05-30T16:52:17.323 回答
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();
        }
    }
}
于 2012-05-31T19:46:03.223 回答