我有一个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;
List<Assignment> list = db.getAllAssignments();
for (int i = 0; i < list.size();i++)
{
allDeliveries.add(list.get(i));
}
&#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;
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;
我在崩溃时得到的错误是一个错误,表示&#34; ... MainActivity}:java.lang.NumberFormatException:无效的int:&#34; null&#34;&#34;
答案 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
值上引发错误(但错误消息可能提供更多信息)。