Android 从活动和已启动的服务访问数据库的正确方法?

Android 从活动和已启动的服务访问数据库的正确方法?,android,database,Android,Database,短版本:从活动和已启动的服务访问同一数据库的最佳做法是什么 Long version:我有一个从活动开始持久服务的案例。当活动在屏幕上显示数据时,服务正在用数据填充数据库。它们都不是一直运行的—服务可以在没有活动时运行,活动可以在服务尚未启动时运行。但服务只能从活动中停止(它从不自行停止) 我正在使用SQLiteOpenHelper的子类访问数据库。我被绊倒的问题显然是 我可以想到以下几种选择: singleton模式(公共静态变量中的singleSQLiteDatabase实例-只有活动可以关

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

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

我正在使用SQLiteOpenHelper的子类访问数据库。我被绊倒的问题显然是

我可以想到以下几种选择:

  • singleton模式(公共静态变量中的single
    SQLiteDatabase
    实例-只有活动可以关闭它(因为它知道服务是否正在运行))-丑陋
  • 在另一个窗口中关闭服务/活动之前,请检查服务/活动是否正在运行
  • 将acquire/release构建到SQLiteOpenHelper的
    getReadableDatabase()
    /
    close()
  • 我会选择3,但这一定是一个非常常见的模式,所以我想知道是否已经有了这样一个内置的机制-我不想重新发明轮子


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

    Android上任何数据库的通常模式都是让一个提供者打开数据库并按意图处理请求。这具有序列化请求的优点

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


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

    我已使用保留/释放计数器解决了此问题:

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

    在本例中,服务正在收集数据,而活动正在显示数据(在图形中)。请注意,当服务正在收集数据时,“活动”可能未运行,稍后它必须显示暂停期间的数据历史记录。我可以绕过这些限制,但在这种情况下,它会使应用程序更加复杂。经过进一步思考,我开始喜欢你的想法。。。我已经用第三个选项解决了这个问题,但我将重构我的应用程序以使用广播意图(而不是重复DB读取)。谢谢你,先生,还有+1