4

さて、私のアプリはAndroid 2.3で完全に動作し、4.0.4でクラッシュします。

XMLを解析し、S​​QLiteデータベースにデータを保存しています。

これは毎回発生するわけではありませんが、実際には頻繁に発生します。ボタンのクリック時に、新しいアクティビティのスタートアップで発生することもあります...など

クラッシュ例外:

11-16 15:16:41.231: E/SQLiteQuery(6398): exception: library routine called out of sequence; query: SELECT _id, name, tipus, azonosito, gpsx, gpsy, pictures, telefonok, webcim, email, nyitvatartas, cim, orszag, befogadokepesseg, szolgaltatasok, arkategoria, leiras, ertekeles, pontszam, facebook, keywords, rating FROM shops_top20

11-16 15:16:41.241: E/AndroidRuntime(6398): FATAL EXCEPTION: main
11-16 15:16:41.241: E/AndroidRuntime(6398): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.KeySoft.OpenGuide/com.KeySoft.OpenGuide.Activities.Top20}: android.database.sqlite.SQLiteMisuseException: library routine called out of sequence
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.os.Looper.loop(Looper.java:137)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.ActivityThread.main(ActivityThread.java:4507)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at java.lang.reflect.Method.invokeNative(Native Method)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at java.lang.reflect.Method.invoke(Method.java:511)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at dalvik.system.NativeStart.main(Native Method)
11-16 15:16:41.241: E/AndroidRuntime(6398): Caused by: android.database.sqlite.SQLiteMisuseException: library routine called out of sequence
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.database.sqlite.SQLiteQuery.nativeFillWindow(Native Method)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:86)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:164)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:156)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:161)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:201)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at com.KeySoft.OpenGuide.Activities.Top20.SqlShopsVissza(Top20.java:546)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at com.KeySoft.OpenGuide.Activities.Top20.listakKirajzolasaEsValtas(Top20.java:165)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at com.KeySoft.OpenGuide.Activities.Top20.onCreate(Top20.java:113)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.Activity.performCreate(Activity.java:4469)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
11-16 15:16:41.241: E/AndroidRuntime(6398):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)

編集:わかりました、それで私は私のアプリのすべてのデータベース接続を閉じる直前にすべてのカーソルを閉じました、そして今私はこの例外を得ました:

    11-16 20:00:28.409: E/AndroidRuntime(7548): FATAL EXCEPTION: main
11-16 20:00:28.409: E/AndroidRuntime(7548): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.KeySoft.OpenGuide/com.KeySoft.OpenGuide.Activities.Top20}: java.util.ConcurrentModificationException
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1968)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1993)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1159)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.os.Handler.dispatchMessage(Handler.java:99)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.os.Looper.loop(Looper.java:137)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.ActivityThread.main(ActivityThread.java:4507)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at java.lang.reflect.Method.invokeNative(Native Method)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at java.lang.reflect.Method.invoke(Method.java:511)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:978)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:745)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at dalvik.system.NativeStart.main(Native Method)
11-16 20:00:28.409: E/AndroidRuntime(7548): Caused by: java.util.ConcurrentModificationException
11-16 20:00:28.409: E/AndroidRuntime(7548):     at java.util.WeakHashMap$HashIterator.next(WeakHashMap.java:165)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1250)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.database.sqlite.SQLiteDatabase.close(SQLiteDatabase.java:1220)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.database.sqlite.SQLiteOpenHelper.close(SQLiteOpenHelper.java:265)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at com.KeySoft.OpenGuide.DB_Adapter.close(DB_Adapter.java:273)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at com.KeySoft.OpenGuide.Activities.Top20.SqlShopsVissza(Top20.java:558)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at com.KeySoft.OpenGuide.Activities.Top20.listakKirajzolasaEsValtas(Top20.java:165)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at com.KeySoft.OpenGuide.Activities.Top20.onCreate(Top20.java:113)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.Activity.performCreate(Activity.java:4469)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1052)
11-16 20:00:28.409: E/AndroidRuntime(7548):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1932)

私のコードの問題のある部分は、私のTop20アクティビティの関数であり、現在は次の関数です。

protected void getShopsFromSql(String whichTable){


            db.open();
            Cursor c;

            if(whichTable.equals("Top20")){
                c = db.getAllTop20Titles();
            }
            else if (whichTable.equals("Latest10")){
                c = db.getAllLatest10Titles();
            }
            else{
                c = db.getAllShopsFullTitles();
            }

                if (c.moveToFirst())  {
                    do  {

                        addShopToList(c.getString(1), c.getString(2), c.getString(4), c.getString(5), c.getString(12), c.getString(11), c.getString(3));
                    }while (c.moveToNext());
                }

                c.close(); 
                db.close(); //App Crashes here... why?
        }

dbは確かに私のデータベースです、私はこのエラーをグーグルで検索しました、そしてもちろん私がスレッドの値を編集し、他のスレッド(今回はバックグラウンドAsyncTask)によって同じ値を繰り返したいときに起こりますが、私はシングルトンデータベースアダプターを持っていますそして、この種のデータベース実装がAndroidアプリに最適であることをスタックで読みました。

私は単一のデータベースを持つ拡張アプリケーションクラスを持っており、このデータベースを毎回呼び出します。

public class MyApp extends Application {

 private static DB_Adapter globalDatabase;


    @Override
    public void onCreate() {
        super.onCreate();

        globalDatabase = new DB_Adapter(this);
    }

    public static DB_Adapter getDB() {

        return globalDatabase;
    }

}

このような私のアプリのデータベースへの参照:

public class Top20 extends Activity 
{


    private DB_Adapter db;
    private MyApp myApp;

    @Override
    public void onCreate(Bundle savedInstanceState){



        super.onCreate(savedInstanceState);
        setContentView(R.layout.top20);


        myApp = (MyApp) getApplication();

        db = myApp.getDB();

                    //...........morecode...etc..

それで:

私の質問は次のとおりです。

このエラーが発生したのはなぜですか?私はこのシングルトンデータベースの実装を正しく行っていますか?

アドバイスありがとう、アダム

4

1 に答える 1

4

ConcurrentModificationException他のスレッドがデータベースにアクセスしようとしているときにデータベースを閉じようとしているため、を取得しているように見えます。コードの残りの部分を見ないと、DBにアクセスしている他のスレッドがわからないため、他に何が起こっているのかを判断するのは困難です。

余談ですが、おそらくより良い解決策として、それを閉じようとしている理由はありますか?GoogleFWエンジニアのDianneHackbornが言うように、プロセスが強制終了されるとデータベースは自動的に閉じられるため、データベースを閉じる必要はありません。彼女がこれについてコメントしている複数の投稿については、リンク#1リンク#2を参照してください。

于 2014-01-07T23:04:11.130 に答える