Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 我是否需要创建/使用内容提供商_Android_Sqlite - Fatal编程技术网

Android 我是否需要创建/使用内容提供商

Android 我是否需要创建/使用内容提供商,android,sqlite,Android,Sqlite,我一直试图解决一个问题,即我的应用程序和应用程序的服务共享使用SQLiteDatabase;即,由应用程序启动的服务。该服务每30秒唤醒一次并检查数据库,然后,正如所有良好的进程所应做的那样,它在完成时关闭与数据库的连接。但是,当应用程序并发运行并尝试访问数据库时,应用程序会崩溃。logcat会显示一条消息,警告我正在尝试重新打开已关闭的数据库连接,如下所示: 05-16 16:48:30.796:E/AndroidRuntime(10610): java.lang.IllegalStateEx

我一直试图解决一个问题,即我的应用程序和应用程序的服务共享使用SQLiteDatabase;即,由应用程序启动的服务。该服务每30秒唤醒一次并检查数据库,然后,正如所有良好的进程所应做的那样,它在完成时关闭与数据库的连接。但是,当应用程序并发运行并尝试访问数据库时,应用程序会崩溃。logcat会显示一条消息,警告我正在尝试重新打开已关闭的数据库连接,如下所示:

05-16 16:48:30.796:E/AndroidRuntime(10610): java.lang.IllegalStateException:尝试重新打开已关闭的 对象:SQLiteDatabase:/data/data/com.example.myapp/databases/eRing

一次勤奋的故障排除工作表明,如果我取消了服务关闭数据库,那么一切都会好起来,sorta。。。如果我让服务周期足够长。最终,SQLiteConnectionPool会醒来并说

数据库的SQLiteConnection对象 “+data+data+com”示例“\u myapp+数据库+eRing”被泄露!请修理 您的应用程序将正确结束正在进行的事务并关闭 当不再需要数据库时,请将其删除

因此,我回到了绘图板,回顾了文档和教程。我注意到,如果不讨论ContentProviders,许多可用资源都很难提到SQLiteDatabases。但是,文档中说,如果您打算从另一个应用程序访问数据库,则只需要ContentProvider。以下是Android开发者网站上的一段话:

开始构建之前

在开始构建提供程序之前,请执行以下操作:

  • 决定是否需要内容提供商。如果要提供以下一个或多个功能,则需要构建内容提供商 特点:

    • 您希望向其他应用程序提供复杂的数据或文件
    • 您希望允许用户将复杂数据从您的应用复制到其他应用中
    • 您希望使用搜索框架提供自定义搜索建议
    如果完全在您自己的应用程序中使用SQLite数据库,则不需要提供程序

  • 从本文档中我无法判断的是:对于应用程序拥有服务,并且活动和服务都需要同时访问数据库的情况,这是否保证创建ContentProvider?我可以肯定的是,我无意与其他任何人或文档列表中的任何其他场景共享此数据库。换句话说,服务和活动是否算作两个“应用”?Android基础设施将活动和服务称为“应用程序组件”,而不是单个的“应用程序”

    请告诉我,尽一切努力创建一个自定义ContentProvider,并取消对数据库的直接访问(通过sqlitedbadapter/Helpers)是否值得

    对于Salem:下面是活动和服务调用的close方法

    public class SettingsDbAdapter {
    
    private static SQLiteDatabase mDb;
    private DatabaseHelper mDbHelper;
    
    public static class DatabaseHelper extends SQLiteOpenHelper {
       //...
    
        }
    
    //...
    public void close() {
            Log.v("close()", "Close settingsdbadapter called");
            mDbHelper.close();
        }
    
    }
    
    //The following is the Services Open method:
    
    public SettingsDbAdapter openReadable() throws SQLException {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getReadableDatabase();
    
        return this;
    }
    
    //The following is the Activities Open Method:
    public SettingsDbAdapter open() throws SQLException {
                mDb = mDbHelper.getWritableDatabase();
        if (!mDb.isWriteAheadLoggingEnabled()) {
            Log.v("SettingsDb","Trying to Enable Write Ahead Logging");
            mDb.enableWriteAheadLogging();
        }
        return this;
    }
    

    只有当数据库被另一个应用程序访问时,才需要内容提供者,因为后者根本没有打开数据库文件的权限

    在您的情况下,问题是您对
    SQLiteDatabase
    具有并发访问权限。如果您编写了服务,您的活动也应该使用它

    编辑:我的评论看起来很混乱,我把它删除了。我建议以下4个部分:

    • 一种
      BroadcastReceiver
      ,在手机启动后(通过
      AlarmManager
      )注册报警并关闭
    • 另一个广播接收器,接收来自警报的滴答声(警报是由Android实现的服务)并检查数据
    • 显示/允许编辑数据的活动
    后两种方法通过

    • 提供在数据库中读取/持久化业务对象的方法的服务

    能否提供打开/关闭连接的代码片段?@Salem请参阅上面的修订。尝试替换
    mDbHelper.close()
    ,则使用
    进行编码>。可能重复@Salem,我想您是指mDb.isOpen?它产生了同样的结果。你可能让我大吃一惊。您是说我需要重新构建它,以便服务将数据传递给活动?如果是,如果服务在启动时启动(如此处://),这是否有效?活动是否仍然可以到达服务?是的。该服务可以提供操作数据和管理底层SQLiteDatabase连接的服务。根据您的偏好和活动所需的数据量,您可以选择低级服务或
    IntentService
    。Yep:Mind=blow。我将处理这些概念。我将尝试提出的解决方案,因为它与文档不一致,但仍然希望知道是否可以使用ContentProvider代替服务来管理数据库,从而实现一个有效的解决方案。