从Activity和已启动的服务访问DB的正确方法?

时间:2012-05-30 16:13:36

标签: android database

简短版:从活动和已启动的服务访问同一个数据库的最佳做法是什么?

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

我正在使用SQLiteOpenHelper的子类来访问数据库。我绊倒的问题显然是closing DB in one SQLiteOpenHelper instance closes it in another too

我可以想到这些选项:

  1. 单一模式(单个SQLiteDatabase实例在公共静态var-only活动中可以关闭它(因为它知道服务是否正在运行)) - 丑陋
  2. 检查服务/活动是否正在运行,然后再关闭另一个 - 丑陋的
  3. 构建获取/发布到SQLiteOpenHelper的getReadableDatabase() / close()
  4. 我会选择3.,但这必须是一个非常常见的模式,所以我想知道是否已经有这样的内置机制 - 我不想重新发明轮子。

    换句话说,做到这一点的正确方法是什么?

2 个答案:

答案 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();
        }
    }
}