2014-12-09 2 views
0

Я собираюсь получить некоторые строки с определенным тегом в android Sqlite. Проблемыизвлекать несколько строк из андроида sqlite

  1. я получил 15 с cursor.getCount(); но 13 извлекаемых строк.
  2. в 13 строк просто повторяют последние строки данных

вот мой код

public ArrayList<HashMap<String, String>> getTodo(String tag) { 
    ArrayList<HashMap<String,String>> arList = new ArrayList<HashMap<String,String>>(); 
    HashMap<String, String> todo = new HashMap<String, String>(); 
    String selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " 
       + COLUMN_TAG + " = ?"; 
    String[] args={tag}; 

    SQLiteDatabase db = this.getReadableDatabase(); 
    Cursor cursor = db.rawQuery(selectQuery, args); 
    // Move to first row 
    cursor.moveToFirst(); 
    System.out.println(cursor.getCount()); 
    if (cursor.getCount() > 0) { 
     do { 
      todo.put(COLUMN_ID, cursor.getString(cursor.getColumnIndex(COLUMN_ID))); 
      todo.put(COLUMN_FROM, cursor.getString(cursor.getColumnIndex(COLUMN_FROM))); 
      todo.put(COLUMN_TO, cursor.getString(cursor.getColumnIndex(COLUMN_TO))); 
      todo.put(COLUMN_TITLE, cursor.getString(cursor.getColumnIndex(COLUMN_TITLE))); 
      todo.put(COLUMN_TAG, cursor.getString(cursor.getColumnIndex(COLUMN_TAG))); 

      arList.add(todo); 
     } while (cursor.moveToNext()); 
    } 
    cursor.close(); 
    db.close(); 
    // return todo 
    return arList; 
} 

Пожалуйста, помогите. Спасибо

ответ

1

Вы используете тот же объектtodo для всех строк, поэтому вы получаете множество ссылок на один и тот же объект.

Создать новую для каждой строки в цикле:

Cursor cursor = db.rawQuery(selectQuery, args); 
try { 
    while (cursor.moveToNext()) { 
     HashMap<String, String> todo = new HashMap<String, String>(); 
     todo.put(...); 
     ... 
     arList.add(todo); 
    } 
finally { 
    cursor.close(); 
} 
2

Это лучше сделать список задач вы хотите приобрести в объекты

public class Todo { 
    public String id, from, to, title, tag; 

    //setters and getters (not necessary) 
} 

public ArrayList<MyData> getTodo(String tag) { 
    ArrayList<MyData> arList = new ArrayList<MyData>(); 
    String selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE " 
      + COLUMN_TAG + " = ?"; 
    String[] args={tag}; 


    try { 
     SQLiteDatabase db = this.getReadableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, args); 
     // Move to first row 
     if (!cursor.moveToFirst()) 
      return arList; 
     do { 
      Todo todo = new Todo(); 
      todo.id = cursor.getString(cursor.getColumnIndex(COLUMN_ID)); 
      todo.from = cursor.getString(cursor.getColumnIndex(COLUMN_FROM)); 
      todo.to = cursor.getString(cursor.getColumnIndex(COLUMN_TO)); 
      todo.title = cursor.getString(cursor.getColumnIndex(COLUMN_TITLE)) 
      todo.tag = cursor.getString(cursor.getColumnIndex(COLUMN_TAG)); 
      arList.add(todo); 
     } while(cursor.moveToNext()); 
     cursor.close(); 
     db.close(); 
     return arList; 
    } 
    finally { 
     cursor.close(); 
     db.close(); 
    } 
} 

Вы продолжаете ввод новых строк в уже созданный hashmap, но вы продолжаете использовать одни и те же ключи, и поэтому многие записи заменяются. Объект Todo сохраняет ваш код доступным для чтения. Вы также должны проверить, может ли курсор перейти к первой записи (что делает ненужным вызов getCount)

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