从Service和onClick访问sqlite数据库android时发生冲突

在我的应用android中,我可以从以下位置访问我的sqlite数据库

1)每60秒为android服务一次.

2)按下按钮后(onclik)

如果我在服务访问数据库时按下按钮,则会发生错误.

因此,在访问数据库之前,我先在onclickListener中插入对stopService()的调用

但是冲突仍然存在,因为,即使我在访问数据库之前调用stopService(),此后该服务也会停止!

我尝试使用:

private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager)  getSystemService(Context.ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if ("com.example.MyService".equals(service.service.getClassName())) {
           return true;
        }
    }
    return false;
 }

How to check if a service is running on Android?中建议

我试图以这种方式在访问数据库之前调用方法

    while(isMyServiceRunning())
    {
        // do nothing
    }

    // *** access to my database ***

为了确保在访问数据库之前我的服务已停止,该怎么办?

错误是:

10-30 21:05:43.360: E/sqliteDatabase(13960): Failed to open the database. closing it.
10-30 21:05:43.360: E/sqliteDatabase(13960):        android.database.sqlite.sqliteDatabaseLockedException: database is locked
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.database.sqlite.sqliteDatabase.native_setLocale(Native Method)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.database.sqlite.sqliteDatabase.setLocale(sqliteDatabase.java:2115)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.database.sqlite.sqliteDatabase.openDatabase(sqliteDatabase.java:984)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.database.sqlite.sqliteDatabase.openDatabase(sqliteDatabase.java:956)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.database.sqlite.sqliteDatabase.openorCreateDatabase(sqliteDatabase.java:1021)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.app.ContextImpl.openorCreateDatabase(ContextImpl.java:753)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.content.Contextwrapper.openorCreateDatabase(Contextwrapper.java:221)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at android.database.sqlite.sqliteOpenHelper.getWritableDatabase(sqliteOpenHelper.java:149)
10-30 21:05:43.360: E/sqliteDatabase(13960):    at host.database.DB_DatabaseManager.open(DB_DatabaseManager.java:134)

解决方法:

您可以覆盖服务的onDestroy()事件,然后尝试访问该服务上的数据库

@Override
public void onDestroy() {
    // *** access to my database ***
    super.onDestroy();
}

相关文章

SQLite架构简单,又有Json计算能力,有时会承担Json文件/RES...
使用Python操作内置数据库SQLite以及MySQL数据库。
破解微信数据库密码,用python导出微信聊天记录
(Unity)SQLite 是一个软件库,实现了自给自足的、无服务器...
安卓开发,利用SQLite实现登陆注册功能