列表返回方法返回一个空列表(尽管列表已填充)

时间:2019-04-02 16:46:32

标签: java android list sqlite object

我正在开发一个使用SQLite数据库将数据加载到列表并显示它的Android应用。我有一个DatabaseHelper类,用于处理数据库的CRUD方法。我正在尝试查找给定日期的特定结果,尽管我的查询返回了预期结果并填写了要返回的列表,但我无法在Main活动中返回此列表。

我的查询方法:

public List<Earthquake>getListByDate(LocalDate dateInput){

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE " + PUB_DATE + " = " + "'"+dateInput+"'", null);

        Log.e("Cursor", ""+data.getColumnCount());
        Log.e("QueryReturnList", ""+QueryReturnList(data));

        return QueryReturnList(data);
    }
  

日志:

     

E /光标:12

     

E / returnList:[对象,对象,对象...]

     

E / QueryReturnList:[对象,对象,对象...]



QueryReturnList :(此方法从输入光标构建对象列表)

    private List<Earthquake>QueryReturnList(Cursor data){

            List<Earthquake>returnList = new ArrayList<>();

            int titleIndex = data.getColumnIndex(TITLE_COL),
                    descIndex = data.getColumnIndex(DESC_COL),
                    //... ;

            while(data.moveToNext()){
                Earthquake e = new Earthquake(
                        data.getString(titleIndex),
                        data.getString(descIndex),
                        //... ;
                );
                returnList.add(e);
            }
            Log.e("returnList",""+returnList);
            return returnList;
        }
  

日志:

     

E / returnList:[对象,对象,对象...]



当我记录这些结果时,它们将在DatabaseHelper中按预期方式工作。找到正确的结果,并且QueryReturnList返回预期的列表对象。


但是,当我从主要活动中调用此列表并将其设置为新列表时,在登录(或调试)时该列表似乎为空。

List<Earthquake>earthquakes = mDatabaseHelper.getListByDate(currentDateSelection);
Log.e("earthquakesByDate", ""+earthquakes);
  

日志:

     

E / returnList:[]

     

E / earthquakesByDate:[]


为什么返回时返回空列表并最初在我的DatabaseHelper中记录一个填充列表?

注意:似乎以意外顺序运行时多次记录“ returnList”和“ QueryReturnList”。这些方法是否没有时间获取所有数据并返回?

1 个答案:

答案 0 :(得分:1)

此行:

Log.e("QueryReturnList", ""+QueryReturnList(data));

调用QueryReturnList(data),因此完成此操作后,游标将被迭代,原因如下:

while(data.moveToNext())

光标的指针在最后一行之后。
然后:

return QueryReturnList(data);

再次呼叫QueryReturnList(data),并在到达此时间时

while(data.moveToNext())

它跳过循环,因为moveToNext()返回false
因此最好删除此行:

Log.e("QueryReturnList", ""+QueryReturnList(data));

或这样重写getListByDate()

public List<Earthquake>getListByDate(LocalDate dateInput){
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor data = db.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE " + PUB_DATE + " = " + "'"+dateInput+"'", null);
    Log.e("Cursor", ""+data.getColumnCount());
    List<Earthquake> list = QueryReturnList(data);
    Log.e("QueryReturnList", ""+list);
    return list;
}