2017-02-22 23 views
1

У меня проблема с чтением данных из SQLite, я хочу сохранить всю информацию в массив объектов (узлов), которые я уже определил.Получить все строки SQLite Android Studio

Мой конструктор и структура для этого объекта:

public node(int id, String name, String address, double x, double y, String type, String date){ 
    //Initialization 
    //.... 
} 

Примечания: Класс этого объекта, очевидно, уже определил атрибуты, сеттер и добытчик. И база данных имеет одинаковую структуру этого объекта (Int, String, String, Double, Double, String, String).

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

public nodo[] getNodes() { 
    String selectQuery = "SELECT * FROM " + NAME_NODES; 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, null); 
    node[] nodes = new node[cursor.getCount()]; 
    int con = 0; 

    if (cursor.moveToFirst()) { 
     while (cursor.moveToNext()) { 
      node temp = new node(
        cursor.getInt(1), 
        cursor.getString(2), 
        cursor.getString(3), 
        cursor.getDouble(4), 
        cursor.getDouble(5), 
        cursor.getString(6), 
        cursor.getString(7)); 
      nodes[con++] = temp; 
     } 
    } 
    cursor.close(); 
    db.close(); 
    Log.d(TAG, "SQLite data: " + nodes.toString()); 

    return nodes; 
} 

А потом в другом классе я называю этот предыдущий метод, что-то вроде:

node[] nodes = db.getNodes(); 
String temp = node[0].getName(); 

Но после того, как что я получаю ошибку:

<code>E/CursorWindow: Failed to read row 1, column 7 from a CursorWindow which has 2 rows, 7 columns. 
E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.motusk.AppMonitoreo, PID: 4410 
    java.lang.IllegalStateException: Couldn't read row 1, col 7 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 com.motus.AppMonitoreo.Controladores.SQLiteHandler.getNodes(SQLiteHandler.java:186)</code> 

Я думаю, что основная проблема заключается в использовании курсора

+1

пожалуйста, проверьте, что вы получите в Cursor = курсор db.rawQuery (SelectQuery, нуль); курсор? и индекс курсора начинается с 0, и вы начинаете его с 1. Пожалуйста, проверьте –

+0

[щелкните по этому значку. я надеюсь, что это поможет вам] (http://stackoverflow.com/a/41615670/7399521) –

+0

Да, было то, что индекс курсора начинается с 0, но теперь я получаю только 1 строку –

ответ

1

Индекс должен начинаться с позиции .

   cursor.getInt(0), 
       cursor.getString(1), 
       cursor.getString(2), 
       cursor.getDouble(3), 
       cursor.getDouble(4), 
       cursor.getString(5), 
       cursor.getString(6)); 

Удалите старое приложение и запустите снова.

FYI

if (cursor.moveToFirst()) { 
      do { 

       node temp = new node 
       cursor.getInt(0), 
       ......... 
       ADD_ARRAY_LIST.add(temp); 

      } while (cursor.moveToNext()); 
     } 
+1

Это решило проблему что он не может читать строки 1 до столбца 7, но у меня есть две строки в этой базе данных, и я получаю только один. Возможно, что до и после if, мне нужно создать первый элемент массива и следующие элементы в то время? –

+0

вы можете это сделать –

+1

Спасибо, что сработало! –