从android sqlite中检索多行

时间:2014-12-09 06:14:36

标签: java android sqlite

我将在Android Sqlite中获取具有特定标记的一些行。 问题是

  1. 我在cursor.getCount();获得了15分,但检索了13行。
  2. 13行只重复最后一行数据
  3. 这是我的代码

    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;
    }
    

    请帮忙。感谢

2 个答案:

答案 0 :(得分:2)

您正在为所有行使用相同的 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();
}

答案 1 :(得分: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调用)