Мне нужно переместить данные в одну таблицу на другую. Новая таблица будет старой, но без ограничения (при замене конфликта), чтобы колонки были одинаковыми.Android executeSQL не работает (INSERT INTO TABLE2 SELECT * FROM TABLE1)
Это запрос, Я сделать: INSERT INTO TABLE2 SELECT * FROM TABLE1
У меня большая проблема, потому что я думаю, что я не могу выполнить этот вид запроса с:
db.execSQL("INSERT INTO " + Tables.TRACKS + "_2 SELECT * FROM " + Tables.TRACKS);
ExecSQL терпит неудачу с этим ошибка (дБ 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)
Я думаю, что это потому, что я ОТБОРНОЕ в запросе .. это из документации Android: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#execSQL%28java.lang.String%29
Выполнение одной инструкции SQL, которая НЕ является SELECT или любым другим оператором SQL , который возвращает данные.
Если я использую
db.rawQuery("INSERT INTO " + Tables.TRACKS + "_2 SELECT * FROM " + Tables.TRACKS, null );
Это выполнить без ошибок, но это doens't сделать что-нибудь. Я думаю, это потому, что rawQuery используется для выполнения запросов SELECT и не записывается в базу данных.
UPDATE: Если я выбираю все записи с нормальным запросом, а затем с петлей вставить их в новую таблицу все работает, но это не оптимизирован путь, и я не хочу иметь медленное приложение модернизации
UPDATE2:
это единственные различия между этими 2 tablers:
новая таблица имеет 3 новый столбец строки, и они могут быть нулевым новая таблица не будет иметь уникальный (ON CONF LICT REPLACE), что старая таблица имеет
обе таблицы имеют это поле: BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT"
. Я должен исключить это поле из вставки? Также помните, что второй планшет пуст во время обновления (я создаю его в момент обновления)
Итак, что мне делать, чтобы выполнить запрос, который нужно писать и читать одновременно с моим?
Можете ли вы изменить свой вопрос, чтобы показать ошибку, которую вы получаете? – Pablo
Обновлено начальное сообщение – StErMi
Можете ли вы разместить инструкции 'CREATE TABLE', которые вы использовали для создания двух таблиц? При вставке вы получаете нарушение ограничений. Кроме того, 'db.rawQuery (" INSERT ..' не собирается делать ничего * - ** всегда ** использовать 'execSQL' для вставки, обновления и удаления. – Jens