0

次のコード スニペットは、SQLite テーブルから重複を削除することになっています。

public int removeDuplicates(String table, String column, String idcolumn) {
    if (mDB.isReadOnly()) return -1;
    String idcol = idcolumn == null ? "_id" : idcolumn;
    String sql = String.format(Locale.US, "DELETE from %s where %s in " + "(select %s from %s JOIN "
            + "(select min(%s) as id_keep,%s,count(*) as dups from %s group by %s) AS A "
            + "ON A.%s=%s.%s where %s<>id_keep)", table, idcol, idcol, table, idcol, column, table, column, column,
            table, column, idcol);
    SQLiteStatement sqlcmd = mDB.compileStatement(sql);
    int result = sqlcmd.executeUpdateDelete();
    return result;
}

問題は、テストSQLiteReadOnlyDatabaseExceptionに合格したにもかかわらず、 a がスローされることです。!db.isReadOnly()

すべてがICSに対してコンパイルされているため、この問題はこの質問に関連しているとは思いません。および他のアプリ (クエリを駆動する ContentProvider を使用) は、DB に書き込むことができます。

DB は SD カードの public フォルダーにあります。

スタック トレースは次のとおりです。

11-02 14:48:24.596 E/AndroidRuntime(12324): android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteStatement.native_executeSql(Native Method)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:90)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1899)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1839)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteDatabase.beginTransaction(SQLiteDatabase.java:661)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteDatabase.beginTransactionNonExclusive(SQLiteDatabase.java:576)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:247)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:84)
11-02 14:48:24.596 E/AndroidRuntime(12324):     at za.co.nimbus.druids.DatabaseTools.removeDuplicates(DatabaseTools.java:139)

何か案は?

4

1 に答える 1

1

SD 上に存在するデータベースに書き込むには、外部メモリへの書き込み権限が必要です。以下をマニフェストに追加するだけです。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
于 2012-11-02T14:39:08.353 に答える