光标没有移动到第一个?

时间:2015-03-11 14:49:01

标签: java android sqlite arraylist android-studio

所以我构建了一个返回我在项目中使用的类的ArrayList的方法,问题是添加到ArrayList的唯一项是数据库中的第二个。我知道,因为我提取了数据库文件并浏览了它,还有' c.getCount()'返回值为2。

所以我知道我的数据库包含2个条目,我的Cursor获得2个条目...但由于某种原因,他选择在创建它之后关注开头的第2行 - 从而退出while循环,甚至以为我打电话给c.moveToFirst();

也许我只是感到疲倦而且没有清楚地知道我做错了什么...因为我将它与我的代码中的其他方法进行了比较,这些方法运行正常,我无法区分它们之间的区别。

我的方法如下:

    public ArrayList<Kiosk> getKiosks () {
    ArrayList<Kiosk> kioskArrayList = new ArrayList<>();
    db = dbHandler.getWritableDatabase();

    String[] columns = {Tags.TAG_LOCAL_ID, Tags.TAG_ID_SERVER, Tags.TAG_NAME,
                        Tags.TAG_PHONE_NUMBER, Tags.TAG_CONTACT_NAME, Tags.TAG_SCHOOL_ID};
    Cursor c = db.query(DatabaseHandler.TABLE_KIOSK, columns, null, null, null, null, null);
    c.moveToFirst();

    Log.i("tagg", "Size of the cursor is: " + c.getCount());

    while (c.moveToNext()) {
        Kiosk kiosk = new Kiosk();
        kiosk.setLOCAL_ID(c.getInt(c.getColumnIndex(Tags.TAG_LOCAL_ID)));
        kiosk.setIdServer(c.getInt(c.getColumnIndex(Tags.TAG_ID_SERVER)));
        kiosk.setName(c.getString(c.getColumnIndex(Tags.TAG_NAME)));
        kiosk.setPhoneNumber(c.getString(c.getColumnIndex(Tags.TAG_PHONE_NUMBER)));
        kiosk.setContactName(c.getString(c.getColumnIndex(Tags.TAG_CONTACT_NAME)));
        kiosk.setSchoolId(c.getInt(c.getColumnIndex(Tags.TAG_SCHOOL_ID)));
        c.moveToNext();
        kioskArrayList.add(kiosk);
        Log.w("taggg", "Added this to the kiosk Array: " + kiosk.getName() +
                "Local ID: " + kiosk.getLOCAL_ID());

    }
    Log.w("tagg", "getKioskhere, size of the array I sent is: " + kioskArrayList.size());

    c.close();
    db.close();
    return kioskArrayList;
}        

我的日志清楚地说明光标的大小是2但是ArrayList是1:

     03-11 14:18:37.334: W/(18369): School id of the client is: 1
     03-11 14:18:37.336: I/(18369): Size of the cursor is: 2
     03-11 14:18:37.336: W/(18369): Added this to the kiosk Array: PitaKioskLocal ID: 2
     03-11 14:18:37.336: W/(18369): getKioskhere, size of the array I sent is: 1

有什么建议吗?提前谢谢

3 个答案:

答案 0 :(得分:1)

首先转到第一个元素:

c.moveToFirst();

然后在你处理第一个之前移动到第二个:

while (c.moveToNext()) {

最后,你打电话

c.moveToNext();
在你的while循环中

,这会导致忽略每一个条目。

解决方案:删除循环中的调用,并处理第一个元素,然后再转到第二个元素。最简单的方法是将while(){}更改为do{} while()

答案 1 :(得分:0)

设置查询的排序顺序。你也可以在任何工作之前做一个moveToNext()。

Cursor c = db.query(DatabaseHandler.TABLE_KIOSK, columns, null, null, null, null, Tags.TAG_LOCAL_ID + " desc");

// stuff
do {

    // Iterate over cursor

} while (c.moveToNext());

答案 2 :(得分:0)

看起来你打电话moveToNext()的次数太多了。

您可以通过电话moveToFirst()从第一行开始。然后,当您输入while循环时,再次调用moveToNext()。因此,当您进入循环时,您已经坐在第二行。然后,在循环内部,您拨打moveToNext()并将kiosk添加到kioskArrayList

当您第二次点击while循环的顶部时,您的索引为2,因此c.moveToNext()评估为false,因此您只需添加到列表一次。