从android数据库获取所有数据库条目

时间:2015-05-18 18:41:54

标签: android sqlite android-sqlite sqliteopenhelper

我有一个android项目,有一个数据库,其中条目以具有相同ID的对记录。

我有两个for循环,一个用于获取特定ID的所有条目,另一个用于获取表中的所有条目。然后将这些自动填充到列表视图中。

我遇到的问题是当我尝试使用获取数据库中所有条目的forloop时程序崩溃,但是当我使用想要具有相同ID的所有条目的for循环时,它完全正常。我一直在评论for循环我不使用。

for循环:



        List<Assignment> list = db.getPickupDelivery(1);
        for (int i = 0; i < list.size();i++)
            {
                allDeliveries.add(list.get(i));
            }
&#13;
&#13;
&#13;

&#13;
&#13;
        List<Assignment> list = db.getAllAssignments();
        for (int i = 0; i < list.size();i++)
        {
            allDeliveries.add(list.get(i));
        }
&#13;
&#13;
&#13;

他们称之为的方法:

&#13;
&#13;
public List<Assignment> getPickupDelivery(int i) {
        List<Assignment> assignments = new LinkedList<Assignment>();

        //bygg query
        String query = "SELECT * FROM " + TABLE_ASSIGNMENTS + " WHERE id = " + i;

        //fa referens
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);

        //iterera och bygg och lagg till
        Assignment assignment = null;
        if (cursor.moveToFirst()) {
            do {
                assignment = new Assignment();
                assignment.setID(Integer.parseInt(cursor.getString(0)));
                assignment.setType(cursor.getString(1));
                assignment.setSenderreceiver(cursor.getString(2));
                assignment.setAdress(cursor.getString(3));
                assignment.setTime(cursor.getString(4));
                assignment.setZipcode(cursor.getString(5));
                assignment.setContact(cursor.getString(6));
                assignment.setPhone(cursor.getString(7));
                assignment.setInstructions(cursor.getString(8));

                //lagg till
                assignments.add(assignment);
            } while (cursor.moveToNext());
        }
        cursor.close();
        Log.d("getPickupDelivery()", assignments.toString());
        return assignments;
    }
&#13;
&#13;
&#13;

&#13;
&#13;
public List<Assignment> getAllAssignments() {
        List<Assignment> assignments = new LinkedList<Assignment>();

        //bygg query
        String query = "SELECT * FROM " + TABLE_ASSIGNMENTS;

        //fa referens
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);

        //iterera och bygg och lagg till
        Assignment assignment = null;
        if (cursor.moveToFirst()) {
            do {
                assignment = new Assignment();
                assignment.setID(Integer.parseInt(cursor.getString(0)));
                assignment.setType(cursor.getString(1));
                assignment.setSenderreceiver(cursor.getString(2));
                assignment.setAdress(cursor.getString(3));
                assignment.setTime(cursor.getString(4));
                assignment.setZipcode(cursor.getString(5));
                assignment.setContact(cursor.getString(6));
                assignment.setPhone(cursor.getString(7));
                assignment.setInstructions(cursor.getString(8));

                //lagg till
                assignments.add(assignment);
            } while (cursor.moveToNext());
        }
        cursor.close();
        Log.d("getAllAssignments()", assignments.toString());
        return assignments;
    }
&#13;
&#13;
&#13;

我在崩溃时得到的错误是一个错误,表示&#34; ... MainActivity}:java.lang.NumberFormatException:无效的int:&#34; null&#34;&#34;

3 个答案:

答案 0 :(得分:1)

我的猜测是,在您的数据库定义中,您没有将ID列指定为INTEGER NOT NULL。因此,当您选择每一行时,这些行中的一行或多行都有一个空ID,您在此处尝试将其解析为int:

assignment.setID(Integer.parseInt(cursor.getString(0)));

更改数据库定义以要求ID列不为空。您需要卸载或清除应用程序上的数据,以便重新创建数据库。

另外一个提示 - Android的SQLITE实现会强制您有一个名为"_id"的列,所以我建议使用它,而不是"id"。否则,你最终会得到一个你不需要的额外列。

答案 1 :(得分:0)

在您的代码中:

                assignment.setID(Integer.parseInt(cursor.getString(0)));

如果cursor.getString(0)返回null,则Integer.parseInt(String str)将抛出NumberFormatException。 检查这一行,或者你可以使用try-catch并在catch中打印相应的消息,如果你得到NumberFormatException。

答案 2 :(得分:0)

例外是提示。它表示字符串null被解析为数字,但这会失败。

在你的代码中,它发生的地方是:

assignment.setID(Integer.parseInt(cursor.getString(0)));

首先从光标中获取一个字符串,然后将其传递给Integer.parseInt进行解析。

因此问题的原因是您希望第一列中没有null值,但至少有一个。

此外,您的代码不必要地复杂且效率低下。您可以编写Integer.parseInt(cursor.getString(0))来直接获取int,而不是cursor.getInt(0)。这也可能会在null值上引发错误(但错误消息可能提供更多信息)。