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

Getting all database entries from android database

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

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

我遇到的问题是当我尝试使用从数据库中获取所有条目的 forloop 时程序崩溃,但是当我使用希望所有条目具有相同 ID 的 for 循环时它工作得很好。我一直在评论我没有使用的for循环。

for 循环:

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

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

他们调用的方法:

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

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

我在崩溃时得到的错误是一个错误,上面写着“...MainActivity}: java.lang.NumberFormatException: Invalid int: "null"”

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

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

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

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

在您的代码中:

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

如果 cursor.getString(0) returns 为 null,则 Integer.parseInt(String str) 将抛出 NumberFormatException。 检查此行,或者您可以使用 try-catch 并在出现 NumberFormatException 时在 catch 中打印相应的消息。

异常是提示。它说字符串 null 正在被解析为数字,但失败了。

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

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

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

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

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