从 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
值上引发错误(但错误消息可能会提供更多信息)。
我有一个 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
值上引发错误(但错误消息可能会提供更多信息)。