Проблема Android SQL

1

Я не могу понять, что не так с этим запросом в Android:

INSERT INTO current 
(channel_name, channel, id_language, title, start, length, catergory, genre, sortOrder)   VALUES 
('3SAT', '3SAT', '27', 'Frizija', '2011-05-16 13:45:00', '45', '8', '103', '0'), 
('A Kanal', 'AKANAL', '2', 'Varna hiša', '2011-05-16 13:40:00', '110', '1', '71', '1'), 
('ABMoteurs', 'ABMOTEURS', '12', 'Garažna pošast', '2011-05-16 14:00:00', '60', '11', '81', '2'), 
('ARD', 'ARD', '27', 'Dnevnik', '2011-05-16 14:00:00', '10', '7', '6', '3'), 
('ARTE', 'ARTE', '27', 'Sanje o podeželju: Normandija', '2011-05-16 14:00:00', '45', '8', '103', '4');

Когда я делаю это так:

    newTaskValues.put(KEY_CURRENT_CHANNEL_NAME  , channel_name);
    newTaskValues.put(KEY_CURRENT_CHANNEL       , channel);
    newTaskValues.put(KEY_CURRENT_ID_LANG       , id_language);
    newTaskValues.put(KEY_CURRENT_TITLE         , title);
    newTaskValues.put(KEY_CURRENT_START         , start);
    newTaskValues.put(KEY_CURRENT_LENGTH        , length);
    newTaskValues.put(KEY_CURRENT_CATEGORY      , category);
    newTaskValues.put(KEY_CURRENT_GENRE         , genre);
    newTaskValues.put(KEY_CURRENT_ORDER         , sort);
    db.insert(DATABASE_TABLE_CURRENT            , null, newTaskValues);

он работает нормально... Но я хочу сделать несколько вложений с одним запросом, потому что есть около 160 вставок сразу...

Любые идеи... Спасибо, что помогли мне!


Я всегда получаю это от LogCat:

05-16 14:07:59.601: ERROR/AndroidRuntime(15153): FATAL EXCEPTION: main
05-16 14:07:59.601: ERROR/AndroidRuntime(15153): android.database.sqlite.SQLiteException: near ",": syntax error: , while compiling: INSERT INTO current (channel_name, channel, id_language, title, start, length, catergory, genre, sortOrder) VALUES ('3SAT', '3SAT', '27', 'Frizija', '2011-05-16 13:45:00', '45', '8', '103', '0'), ('A Kanal', 'AKANAL', '2', 'Varna hiša', '2011-05-16 13:40:00', '110', '1', '71', '1'), ('ABMoteurs', 'ABMOTEURS', '12', 'Garažna pošast', '2011-05-16 14:00:00', '60', '11', '81', '2'), ('ARD', 'ARD', '27', 'Dnevnik', '2011-05-16 14:00:00', '10', '7', '6', '3'), ('ARTE', 'ARTE', '27', 'Sanje o podeželju: Normandija', '2011-05-16 14:00:00', '45', '8', '103', '4');
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at com.TVSpored.ToDoDBAdapter.insertCurrent(ToDoDBAdapter.java:416)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at com.TVSpored.Currently$LoadCurrent.onPostExecute(Currently.java:269)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at com.TVSpored.Currently$LoadCurrent.onPostExecute(Currently.java:1)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.os.AsyncTask.finish(AsyncTask.java:417)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.os.AsyncTask.access$300(AsyncTask.java:127)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:429)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.os.Looper.loop(Looper.java:130)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at android.app.ActivityThread.main(ActivityThread.java:3683)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at java.lang.reflect.Method.invokeNative(Native Method)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at java.lang.reflect.Method.invoke(Method.java:507)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
05-16 14:07:59.601: ERROR/AndroidRuntime(15153):     at dalvik.system.NativeStart.main(Native Method)
05-16 14:07:59.609: WARN/ActivityManager(109):   Force finishing activity com.TVSpored/.TVSpored

Код (я получаю JSONArray в функции):

    String SQL = "INSERT INTO " + DATABASE_TABLE_CURRENT + " " +  
    "(" + KEY_CURRENT_CHANNEL_NAME + ", " + KEY_CURRENT_CHANNEL + ", " + KEY_CURRENT_ID_LANG + ", " + 
    KEY_CURRENT_TITLE + ", " + KEY_CURRENT_START + ", " + KEY_CURRENT_LENGTH + ", " + 
    KEY_CURRENT_CATEGORY + ", " + KEY_CURRENT_GENRE + ", " + KEY_CURRENT_ORDER + ") VALUES ";

  for (int i = 0; i <= CShows.length() && i < 5; i++) 
    {
        JSONObject jsonObject;
        try {
              jsonObject = CShows.getJSONObject(i);
              String start = jsonObject.getString("start");
              Integer duration = jsonObject.getInt("length");
              String title = jsonObject.getString("shortTitle");
              String epg_channel = jsonObject.getString("channel");
              String channel_name = jsonObject.getString("channel_name");
              Integer emission_id = jsonObject.getInt("id_emission");
              Integer id_language = 0;
              Integer id_category = 0;
              Integer id_genre = 0;
              if(jsonObject.getString("id_language").length() > 0)
              {
                  id_language = jsonObject.getInt("id_language");
              }
              if(jsonObject.getString("id_category").length() > 0)
              {
                  id_category = jsonObject.getInt("id_category");
              }
              if(jsonObject.getString("id_genre").length() > 0)
              {
                  id_genre = jsonObject.getInt("id_genre");
              }

              SQL += "(" + "'" + channel_name   + "', " + "'" + epg_channel + "', " + "'" + id_language + "', " + 
                  "'" + title           + "', " + "'" + start + "', "       + "'" + duration + "', " 
                + "'" + id_category     + "', " + "'" + id_genre + "', "    + "'" + i + "')";
            if(CShows.length() != (1 + i) && i != 4)
            {
                Log.d("TV Spored++", "I je enako: " + i);
                SQL = SQL + ", ";
            }

        } catch (JSONException e) {
            e.printStackTrace();
        }


    }
  SQL = SQL + ";";

    Log.d("TV Spored++", SQL.toString());
    db.rawQuery(SQL, null);
  • 0
    Дайте нам сообщение об ошибке, и мы можем помочь.
  • 0
    Извините .. забыл добавить ... теперь добавлено в вопрос ...
Показать ещё 3 комментария
Теги:

2 ответа

2
Лучший ответ

Вставка в форму VALUES (xxx), (yyy) не отображается, которая будет поддерживаться SQLite, вместо этого вы можете:

INSERT INTO current (channel_name, channel, id_language, title, start, length, catergory, genre, sortOrder) 
  SELECT '3SAT', '3SAT', '27', 'Frizija', '2011-05-16 13:45:00', '45', '8', '103', '0'
  UNION ALL SELECT 'A Kanal', 'AKANAL', '2', 'Varna hiša', '2011-05-16 13:40:00', '110', '1', '71', '1'
  UNION ALL SELECT 'ABMoteurs', 'ABMOTEURS', '12', 'Garažna pošast', '2011-05-16 14:00:00', '60', '11', '81', '2'
  • 0
    Большой! Спасибо за спасение моего дня! :) Работает нормально и намного быстрее!
  • 0
    Я думаю, это не работает ... Вставка завершена гладко, но после доступа к данным я получаю 0 строк с этим решением ...
Показать ещё 1 комментарий
0

Почему вы разместили часть ContentValues, если ее даже не использовали?;) Как я уже сказал, вы генерируете недопустимый SQL (возможно, снова прочитайте основы). Подходом будет сохранение переменной SQL и работа в цикле с новой.

В псевдокоде:

for i in elements
    String insertSQL = SQL
    insertSQL += newValues
    insert()
  • 0
    Я довольно хорошо знаком с mySQL, но я не понимаю, в чем суть ... ContentValues был прокомментирован, но теперь он удален ... поэтому он не имеет никакого влияния ... как я уже сказал ... генерация для одной записи работает нормально : INSERT INTO current (channel_name, channel, id_language, title, start, length, catergory, genre, sortOrder) VALUES ('3SAT', '3SAT', '27', 'Frizija', '2011-05-16 13:45:00', '45', '8', '103', '0') (независимо от того, что это за запись), но делаем это: (СЛЕДУЮЩИЙ КОММЕНТАРИЙ)
  • 0
    INSERT INTO current (channel_name, channel, id_language, title, start, length, catergory, genre, sortOrder) VALUES ('3SAT', '3SAT', '27', 'Frizija', '2011-05-16 13:45:00', '45', '8', '103', '0'), ('A Kanal', 'AKANAL', '2', 'Varna hiša', '2011-05-16 13:40:00', '110', '1', '71', '1') делает мое приложение раздавленным (опять же, независимо от того, какие значения)
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню