Android 我是否需要创建/使用内容提供商
我一直试图解决一个问题,即我的应用程序和应用程序的服务共享使用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开发者网站上的一段话: 开始构建之前 在开始构建提供程序之前,请执行以下操作:Android 我是否需要创建/使用内容提供商,android,sqlite,Android,Sqlite,我一直试图解决一个问题,即我的应用程序和应用程序的服务共享使用SQLiteDatabase;即,由应用程序启动的服务。该服务每30秒唤醒一次并检查数据库,然后,正如所有良好的进程所应做的那样,它在完成时关闭与数据库的连接。但是,当应用程序并发运行并尝试访问数据库时,应用程序会崩溃。logcat会显示一条消息,警告我正在尝试重新打开已关闭的数据库连接,如下所示: 05-16 16:48:30.796:E/AndroidRuntime(10610): java.lang.IllegalStateEx
- 您希望向其他应用程序提供复杂的数据或文件
- 您希望允许用户将复杂数据从您的应用复制到其他应用中
- 您希望使用搜索框架提供自定义搜索建议
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实现的服务)并检查数据
- 显示/允许编辑数据的活动
- 提供在数据库中读取/持久化业务对象的方法的服务
mDbHelper.close()如果(mDbHelper!=null&&mDbHelper.isOpen()){mDbHelper.close();}
,则使用进行编码>。可能重复@Salem,我想您是指mDb.isOpen?它产生了同样的结果。你可能让我大吃一惊。您是说我需要重新构建它,以便服务将数据传递给活动?如果是,如果服务在启动时启动(如此处://),这是否有效?活动是否仍然可以到达服务?是的。该服务可以提供操作数据和管理底层SQLiteDatabase连接的服务。根据您的偏好和活动所需的数据量,您可以选择低级服务或IntentService
。Yep:Mind=blow。我将处理这些概念。我将尝试提出的解决方案,因为它与文档不一致,但仍然希望知道是否可以使用ContentProvider代替服务来管理数据库,从而实现一个有效的解决方案。