[英]Android SQLite database query issue
我一直在開發一個小型android應用程序,卻遇到了一個我無法解決的怪異問題。 在故障排除中,我通過一點測試代碼來縮小范圍。 我正在為該行獲取一個NullPointerException:字符串check = test.getName()。
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.******.triptracker.Trip.getName()' on a null object reference
Trip是我使用ID和名稱創建的對象。 trips是Trip對象的數組列表。
tripListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
clickedItemIndex = position;
Trip test = trips.get(clickedItemIndex);
int testID = test.getID();
test = dbHandler.getTrip(testID);
String check = test.getName();
}
});
arraylist行程來自一個名為DatabaseHandler的類,該類還具有“ getTrip()”方法,該方法從SQLite數據庫中提取實際行程,這就是我想象的問題所在:
/** PURPOSE: Return trip from database with given ID **/
public Trip getTrip(int id)
{
SQLiteDatabase db = getReadableDatabase();
Trip trip = null;
String[] args = new String[] { KEY_TRIP_ID };
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRIPS + " WHERE ? = " + id, args);
if (cursor.moveToFirst())
{
trip = new Trip(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3));
}
cursor.close();
db.close();
return trip;
}
顯然,我得到了NullPointerException,因為getTrip發送回null,這意味着游標返回為空,我一生都無法弄清楚為什么會這樣。
DatabaseHandler創建行程arraylist:
/** PURPOSE: Fetch all trips in database
RETURNS: List of all trips **/
public List<Trip> getAllTrips()
{
SQLiteDatabase db = getWritableDatabase();
List<Trip> trips = new ArrayList<Trip>();
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRIPS, null);
if (cursor.moveToFirst())
{
do {
trips.add(new Trip(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3)));
}
while (cursor.moveToNext());
}
cursor.close();
db.close();
return trips;
}
那就是在tripListView中顯示的相同arraylist。 因此,所單擊的旅程必須存在,否則您將無法單擊它。 然后,唯一的另一種可能性是getID返回錯誤的ID,但是對於Trip類,這種簡單的操作我也不知道怎么可能。
public class Trip {
private int id;
private String name, startDate, endDate;
public Trip(int id, String name, String startDate, String endDate)
{
this.id = id;
this.name = name;
this.startDate = startDate;
this.endDate = endDate;
}
// Accessors
public int getID() { return id; }
public String getName() { return name; }
}
我在這里扯掉頭發,試圖找出答案,以便也許有一雙新鮮的眼睛能抓住它。 讓我知道您是否在這里看到任何東西。
這些行很奇怪:
String[] args = new String[] { KEY_TRIP_ID };
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRIPS + " WHERE ? = " + id, args);
通常,args將是查詢的值 ,因此我希望看到以下內容:
String[] args = new String[] { Integer.toString(id) };
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRIPS + " WHERE " + KEY_TRIP_ID + " = ?", args);
我認為查詢仍然可以按照您的方式工作。
編輯:
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
clickedItemIndex = position;
Trip test = trips.get(clickedItemIndex); // so if you have the Trip here...
int testID = test.getID();
test = dbHandler.getTrip(testID); // why are you retrieving it here?
String check = test.getName(); // shouldn't they be exactly the same?
}
就像上面建議的那樣,問題似乎是id為int。 但是我根本無法使其與args一起使用,這是不幸的,因為我真的很想弄清楚如何利用該功能。 無論如何,這似乎是唯一可行的方法:
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_TRIPS + " WHERE " + KEY_TRIP_ID + " = " + Integer.toString(id), null);
奇怪的是,在其他方法中使用參數int id可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.