簡體   English   中英

Android SQLite數據庫查詢問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM