5

私のアプリでは、多くの状況でDBを使用していますが、毎回ではなく、例外が発生し、それを(まだ)再現できる状況が1つあります。

これは、OSバージョン2.3.7および2.1-update-1でのみ発生します。

コード:

public void removeOldOccurrences() {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Long oldTime = System.currentTimeMillis() - VALID_OCCURRENCE_TIME;
        String query = "";
        try {
            query = "DELETE FROM " + LOCATIONS_TABLE + " WHERE not ("
                    + REMEMBERED_FIELD + "=1) " + "and (" + LAST_FIELD + "<"
                    + oldTime + ");";
            db.execSQL(query);
        } catch (Exception e) {
            Log.e(TAG, query);
            e.printStackTrace();
        } finally {
            if (db != null) {
                db.close();
            }
        }
    }

例外トレースは次のとおりです。

android.database.sqlite.SQLiteException: not an error
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1849)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:573)
at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)

助けてください。

4

5 に答える 5

4

このエラーは、データベースを作成または開こうとしているステートメント getWritableDatabase から発生しています。

あなたが与えたコードセグメントから、操作ごとにデータベースを開こうとしていることがわかります。

これは正しい方法ではありません。DB を閉じる前に一度だけ開く必要があります。通常の練習では、他の初期化中に開いて、アプリを終了する前に閉じてください。開いたらdbコンテキストを保存し、それを他のすべての操作で使用します

たとえば、次のようなデータベース manegr クラスを使用できます。

public DataBaseManager open() throws SQLException {
    try {
        mDbHelper = new DatabaseHelper(mCtx);
        mDb = mDbHelper.getWritableDatabase();

    } catch (Exception ex) {
        ex.printStackTrace();
        Utils.getHomeActivityinstance().finish();

    }
    return this;
}

現在、delte を呼び出す必要がある場合は、再度 open を呼び出さないでください

public boolean deleteRow(String tableName, long rowId) {

    return mDb.delete(tableName, ID + "=" + rowId, null) > 0;
}
于 2012-05-06T13:27:32.423 に答える
1

でのクエリが正しくないようnotです。

SQLite Docsを見ると、それらによると、notあなたがそれを使用しようとしている方法にはありません(あなたの場所の否定として)。

あなたの選択肢は次のようです:

NOT LIKE
NOT GLOB
NOT REGEXP
NOT MATCH
NOT BETWEEN
NOT IN
IS NOT

そしてそれらのほとんどは、それらの前に式を必要とします。

WHERE xxxx NOT MATCH yyyy
于 2012-05-06T12:52:59.280 に答える
-1

この問題の解決策を探すのに 2 時間を費やしました。それが原因で、SQLite データベースにテーブルを作成できませんでした。

私のエラーは、「is_selected」属性があり、これにより NOT AN ERROR エラーが発生したことでした。属性の名前を変更すると、機能しました。

于 2012-11-22T20:43:51.657 に答える