2012-06-04 3 views
1

Мне нужно переместить данные в одну таблицу на другую. Новая таблица будет старой, но без ограничения (при замене конфликта), чтобы колонки были одинаковыми.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". Я должен исключить это поле из вставки? Также помните, что второй планшет пуст во время обновления (я создаю его в момент обновления)

Итак, что мне делать, чтобы выполнить запрос, который нужно писать и читать одновременно с моим?

+1

Можете ли вы изменить свой вопрос, чтобы показать ошибку, которую вы получаете? – Pablo

+0

Обновлено начальное сообщение – StErMi

+1

Можете ли вы разместить инструкции 'CREATE TABLE', которые вы использовали для создания двух таблиц? При вставке вы получаете нарушение ограничений. Кроме того, 'db.rawQuery (" INSERT ..' не собирается делать ничего * - ** всегда ** использовать 'execSQL' для вставки, обновления и удаления. – Jens

ответ

4

Поскольку вы не размещая макеты таблиц, давайте начнем с следующее:

CREATE TABLE TABLE1 (
    _id INTEGER PRIMARY KEY, 
    value1 TEXT, 
    value2 TEXT 
); 

CREATE TABLE TABLE2 (
    _id INTEGER PRIMARY KEY, 
    value2 TEXT, 
    value1 TEXT, 
    value3 TEXT, 
    value4 TEXT, 
    value5 TEXT 
); 

Чтобы правильно вставить значения из TABLE1 в TABLE2 вы должны учитывать, что порядок & подсчета столбца важно & должен соответствовать (&, если у вас есть первичные ключи, всегда рекомендуется опустить их из вставки & отбирать утверждения - не ходите вокруг копирования таких вещей).

INSERT INTO TABLE2 (value1, value2) SELECT value1, value2 FROM TABLE1 
+0

Таким образом, лучший способ - также не пропустить столбцы для выбора и порядок вставки. Я дам попытку после запуска, и я отвечу вам обратно :) – StErMi

+1

Если таблицы не являются точно так же (в этом случае - зачем копировать?), вы всегда должны указывать столбцы INSERT & SELECT, чтобы они соответствовали друг другу. – Jens

+0

Я хочу удалить это ON CONFLICT REPLACE, и sqlite3 не позволит вам изменить таблицу, чтобы удалить это ограничение. единственный способ сделать это - создать новую таблицу, переместить данные, удалить старый, переименовать новую в старое имя. – StErMi

Смежные вопросы