2015-05-18 133 views
0

我有一个android项目,数据库中的条目被记录为具有相同ID的对。从android数据库获取所有数据库条目

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

我遇到的问题是,当我尝试使用从数据库中获取所有条目的forloop时,程序崩溃,但当我使用for循环要求所有具有相同ID的条目时,它工作得很好。我一直在评论出未使用的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:无效INT:” null“”

+0

这个解析错误发生在哪里?在'assignment.setID(Integer.parseInt(cursor.getString(0)));'? – inmyth

回答

1

我的猜测是,在您的数据库定义中,您没有指定ID列为INTEGER NOT NULL。所以,当你选择的每一行,其中一个或多个行具有空ID,您正在试图解析为int这里:

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

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

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

+0

我会试试这个,然后回来。弹出的问题是我如何设法在我的数据库中获得空值。我测试过的唯一两个条目的ID值为1. – Flowdorio

+0

在重置数据并在id后使用NOT NULL约束之后,此问题已修复,谢谢 – Flowdorio

0

在您的代码:

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

如果cursor.getString(0)返回null,则的Integer.parseInt(字符串str)将抛出NumberFormatException异常。 选中此行,或者您可以使用try-catch并在catch中打印适当的消息,如果您将得到NumberFormatException。

+0

,它将修复崩溃问题,但不是根本问题。 –

0

异常是提示。它说,一个字符串null被解析为一个数字,并且失败。

在你的代码中有它发生在哪里的地方是:

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

首先,你从游标得到一个字符串,然后你把它传递给Integer.parseInt解析。

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

此外,您的代码不必要的复杂和低效。而不是Integer.parseInt(cursor.getString(0))你可以写cursor.getInt(0)直接得到一个int。这也可能会在null值上引发错误(但错误消息可能更具信息性)。