データをあるテーブルから別のテーブルに移動する必要があります。新しいテーブルは古いテーブルと同じになりますが、(競合の置換時に)制約がないため、列は同じです。
これは私がしなければならないクエリです:INSERT INTO TABLE2 SELECT * FROM TABLE1
この種のクエリは次のように実行できないと思うので、大きな問題があります。
db.execSQL("INSERT INTO " + Tables.TRACKS + "_2 SELECT * FROM " + Tables.TRACKS );
execSQLは次のエラーで失敗します(db onUpgrade):
06-04 12:25:50.000: D/SqliteDatabaseCpp(17817): Registering sqlite logging func: /data/data/com.musixmatch.android.lyrify/databases/library.db
06-04 12:25:50.000: D/SqliteDatabaseCpp(17817): DB info: open db, path = /data/data/com.musixmatch.android.lyrify/databases , key = lafvYvq, flag = 6, file size = 101376
06-04 12:25:50.000: D/SqliteDatabaseCpp(17817): DB info: path = /data/data/com.musixmatch.android.lyrify/databases , key = lafvYvq, handle: 0x1bd8bd8, type: w, r/w: (0,1), mode: delete, disk free size: 1243 M
06-04 12:25:50.010: D/SqliteDatabaseCpp(17817): DB info: close db, path = /data/data/com.musixmatch.android.lyrify/databases , key = lafvYvq, handle = 0x1bd8bd8, type = w, r/w = (0, 0)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): Couldn't open library.db for writing (will try read-only):
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:95)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2008)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1948)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at com.designfuture.music.provider.MusicDatabase.alterTrackFragmentForFileIDSupport(MusicDatabase.java:316)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at com.designfuture.music.provider.MusicDatabase.onUpgrade(MusicDatabase.java:242)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:188)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:249)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at com.designfuture.music.provider.MusicProvider.query(MusicProvider.java:199)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.content.ContentProvider$Transport.query(ContentProvider.java:189)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.content.ContentResolver.query(ContentResolver.java:315)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:94)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.os.Handler.dispatchMessage(Handler.java:99)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.os.Looper.loop(Looper.java:156)
06-04 12:25:50.030: E/SQLiteOpenHelper(17817): at android.os.HandlerThread.run(HandlerThread.java:60)
06-04 12:25:50.030: D/SqliteDatabaseCpp(17817): DB info: open db, path = /data/data/com.musixmatch.android.lyrify/databases , key = lafvYvq, flag = 1, file size = 101376
06-04 12:25:50.030: D/SqliteDatabaseCpp(17817): DB info: path = /data/data/com.musixmatch.android.lyrify/databases , key = lafvYvq, handle: 0x1bec760, type: r, r/w: (1,0), mode: delete, disk free size: 1243 M
06-04 12:25:50.030: D/SqliteDatabaseCpp(17817): DB info: close db, path = /data/data/com.musixmatch.android.lyrify/databases , key = lafvYvq, handle = 0x1bec760, type = r, r/w = (0, 0)
06-04 12:25:50.040: W/AsyncQuery(17817): Exception thrown during handling EVENT_ARG_QUERY
06-04 12:25:50.040: W/AsyncQuery(17817): android.database.sqlite.SQLiteException: Can't upgrade read-only database from version 7 to 9: /data/data/com.musixmatch.android.lyrify/databases/library.db
06-04 12:25:50.040: W/AsyncQuery(17817): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:262)
06-04 12:25:50.040: W/AsyncQuery(17817): at com.designfuture.music.provider.MusicProvider.query(MusicProvider.java:199)
06-04 12:25:50.040: W/AsyncQuery(17817): at android.content.ContentProvider$Transport.query(ContentProvider.java:189)
06-04 12:25:50.040: W/AsyncQuery(17817): at android.content.ContentResolver.query(ContentResolver.java:315)
06-04 12:25:50.040: W/AsyncQuery(17817): at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:94)
06-04 12:25:50.040: W/AsyncQuery(17817): at android.os.Handler.dispatchMessage(Handler.java:99)
06-04 12:25:50.040: W/AsyncQuery(17817): at android.os.Looper.loop(Looper.java:156)
06-04 12:25:50.040: W/AsyncQuery(17817): at android.os.HandlerThread.run(HandlerThread.java:60)
クエリにSELECTを設定したためだと思います。これはAndroidのドキュメント(http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#execSQL%28java.lang)からのものです。文字列%29
SELECTまたはデータを返す他のSQLステートメントではない単一のSQLステートメントを実行します。
使用する場合
db.rawQuery( "INSERT INTO " + Tables.TRACKS + "_2 SELECT * FROM " + Tables.TRACKS, null );
エラーなしで実行されますが、何も実行されません。これは、rawQueryがSELECTクエリを実行するために使用され、データベースに書き込まないためだと思います。
更新:通常のクエリですべてのレコードを選択した場合、ループを使用してそれらを新しいテーブルに挿入するとすべてが機能しますが、これは最適化された方法ではなく、アップグレードの遅いアプリは必要ありません
UPDATE2:
これら2つのテーブルの違いは次のとおりです。
新しいテーブルには3つの新しい文字列列があり、それらはnullになる可能性があります。新しいテーブルには、古いテーブルにある一意の(ON CONFLICT REPLACE)制約がありません。
両方のテーブルに次のフィールドがありますBaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT"
。そのフィールドを挿入から除外する必要がありますか?また、アップグレード時に2番目のタブレットが空であることを忘れないでください(アップグレード時に作成しています)
では、自分の書き込みと読み取りを同時に行う必要があるクエリを実行するには、どうすればよいでしょうか。