冲突访问SQLite数据库的Andr​​oid,从服务和的onClick [英] Conflict accessing sqlite database android, from Service and onClick

查看:131
本文介绍了冲突访问SQLite数据库的Andr​​oid,从服务和的onClick的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的应用程序的Andr​​oid,我可以访问我的SQLite数据库:

1)服务机器人,每60秒。

2)在$ P $按钮pssure(onclik)

如果我preSS的按钮,而我的服务正在访问出现错误的数据库。

所以,我插在onclickListener,进入数据库之前,调用stopService()

但是冲突仍然,因为,即使我进入数据库之前调用stopService(),该服务后,该停止了!

我试过了,使用:

 私人布尔isMyServiceRunning(){
    ActivityManager经理=(ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    对于(RunningServiceInfo服务:manager.getRunningServices(Integer.MAX_VALUE的)){
        如果(com.example.MyService.equals(service.service.getClassName())){
           返回true;
        }
    }
    返回false;
 }
 

安卓建议:检查,如果服务正在运行

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

 而(isMyServiceRunning())
    {
        // 没做什么
    }

    // ***访问我的数据库***
 

我能做些什么,以确保我的服务正在访问数据库之前停止?

该错误是:

  10-30 21:05:43.360:E / SQLiteDatabase(13960):无法打开数据库。关闭它。
10-30 21:05:43.360:E / SQLiteDatabase(13960):android.database.sqlite.SQLiteDatabaseLockedException:数据库已锁定
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.database.sqlite.SQLiteDatabase.native_setLocale(本机方法)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:2115)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:984)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:753)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
10-30 21:05:43.360:E / SQLiteDatabase(13960):在host.database.DB_DatabaseManager.open(DB_DatabaseManager.java:134)
 

解决方案

您可以覆盖的onDestroy()事件服务,并尝试访问该数据库就可以了:

@覆盖 公共无效的onDestroy(){     // ***访问我的数据库***     super.onDestroy(); }

In my app android, I can access to my sqlite database from:

1) Service android, every 60 seconds.

2) After pressure of button (onclik)

If I press the button while my service is accessing the database an error occurs.

So I insert in the onclickListener, before access to database, a call to stopService()

but the conflict remains, because, even if I call stopService() before access to database, the service is stopped after this!

I tried, using :

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

suggested in android: check if a service is running

I tried to call this method, before access to database, in this manner:

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

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

What can I do in order to be sure that my service is stopped before accessing to database?

The error is:

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)

解决方案

You can override the onDestroy() event for the service and try to access the database on it:

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

这篇关于冲突访问SQLite数据库的Andr​​oid,从服务和的onClick的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆