2015-06-05 2 views
-1

Сегодня я хотел реализовать простую базу данных SQLite в своем приложении для обмена сообщениями, которое должно заботиться о сохранении сообщений, к сожалению, я не могу прочитать данные из базы данных и отобразить их в ListView.Android SQLite throws Не удалось прочитать строку 0, столбец -1 из CursorWindow

Я просмотрел базу данных через ADB на своем эмуляторе, и я увидел, что данные сохранены правильно.

Вот мой код

Инициализация таблицы с пустой колонкой

db.execSQL("CREATE TABLE IF NOT EXISTS Messages(zero);"); 

Создание столбца с чатом контактом в качестве имени столбца

public void addMessagetoDB(String message, String from) { 
    Toast.makeText(this.getApplicationContext(), "msg msg", Toast.LENGTH_LONG).show(); 
    try 
    { 
     db.execSQL("ALTER TABLE Messages ADD COLUMN '" + from + "' TEXT"); 
    } 
    catch (android.database.sqlite.SQLiteException e) 
    { 

    } 
    db.execSQL("INSERT INTO Messages ('" + from + "') VALUES('" + message + "');"); 
} 

Здесь я могу также см., что SQLite распознает имена моих столбцов, потому что когда я отправляю несколько сообщений моему клиенту, я получаю отладочные сообщения

E/SQLiteLog﹕ (1) duplicate column name: [email protected] 

Это мой отсчет, который не будет работать

public void updateView(String from) { 
     Cursor crs = zapp.rawQuery("SELECT * FROM Messages", null); 
     while (crs.moveToNext()) { 
      String name = crs.getString(crs.getColumnIndex(from)); 
      messages.add(name); 
     } 
     arrayAdapter.notifyDataSetChanged(); 
} 

Это мое исключение

06-05 22:15:45.841 4926-4926/? E/SQLiteCursor﹕ requesting column name with table name -- [email protected] 
    java.lang.Exception 
      at android.database.sqlite.SQLiteCursor.getColumnIndex(SQLiteCursor.java:180) 
      at org.reisacher.zapp.ChatActivity.updateView(ChatActivity.java:43) 
      at org.reisacher.zapp.MainActivity$1.onItemClick(MainActivity.java:52) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:305) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1146) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053) 
      at android.widget.AbsListView$3.run(AbsListView.java:3860) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
06-05 22:15:45.841 4926-4926/? E/CursorWindow﹕ Failed to read row 0, column -1 from a CursorWindow which has 5 rows, 2 columns. 
06-05 22:15:45.841 4926-4926/? D/AndroidRuntime﹕ Shutting down VM 
06-05 22:15:45.841 4926-4926/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: org.reisacher.zapp, PID: 4926 
    java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
      at android.database.CursorWindow.nativeGetString(Native Method) 
      at android.database.CursorWindow.getString(CursorWindow.java:438) 
      at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
      at org.reisacher.zapp.ChatActivity.updateView(ChatActivity.java:43) 
      at org.reisacher.zapp.MainActivity$1.onItemClick(MainActivity.java:52) 
      at android.widget.AdapterView.performItemClick(AdapterView.java:305) 
      at android.widget.AbsListView.performItemClick(AbsListView.java:1146) 
      at android.widget.AbsListView$PerformClick.run(AbsListView.java:3053) 
      at android.widget.AbsListView$3.run(AbsListView.java:3860) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5257) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Как можно видеть, SQLite пытается получить имя столбца, который соответствует одному I я сохраняю сообщения, но как-то затем читает колонку -1

Я так и не нашел на это решение

Thanks

+0

Вы как-то назвали один из столбцов: «[email protected]»? Возможно, по ошибке вы попытаетесь получить данные, используя это электронное письмо (/ id)? Я спрашиваю, потому что кажется, что вы вызываете метод updateView (String from) с этим адресом электронной почты в качестве параметра. [code] запрашивающее имя столбца с именем таблицы - [email protected] [cod] – MatBos

ответ

0

Проблема в том, что у вас есть. в имени поля и понимается двигателем как разделитель table.field.

Другими словами, getColumnIndex() пытается найти числовой индекс «org» в таблице «test @ zapp» ... еще одна причина не использовать этот тип значения для ваших имен полей.

Ключ, который дал его прочь было «E/SQLiteCursor запрашивают имя столбца с именем таблицы - [email protected]»

Я хотел бы также вопрос вашей идеи динамического добавления столбцов таблицы на основе значение «от», увеличивая таблицу горизонтально вместо обычного метода, позволяя ей расширяться вертикально. Делает его медленнее и медленнее, поскольку он становится все более громоздким.

+0

Спасибо, что получил его работу, подстроил значение «from» с символом «@». Что вы подразумеваете, расширяя его по вертикали. Я добавляю столбец для контакта, затем сообщения от или к этому контакту добавляются ниже в соответствующем столбце, в результате чего таблица растет вертикально –

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