2011-11-08 28 views
3

我試圖查詢我在代碼中創建的單個表數據庫。據我所知,數據庫正在被正確創建。該查詢應該用於填充ListView,但是當我嘗試使用從查詢產生的光標創建SimpleCursorAdapter時,它會崩潰:java.lang.IllegalArgumentException:column'_id'不存在。我假設這可以追溯到遊標,並且遊標似乎是空的。從Android中的數據庫填充列表

數據庫在以下方式中的onCreate內我實施SQLiteOpenHelper的創建():

db.execSQL("CREATE TABLE " + TABLE_NAME + " (_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, title TEXT NOT NULL, path TEXT NOT NULL);"); 

然後實際的查詢是建立和執行我的DataHelper類,這是用於互動與數據庫:

public Cursor selectEntryStartsWith(String partialName , String title) 
{ 
    String where = "name LIKE '" + partialName + "%' AND title LIKE '" + title + "'"; 

    if (title== null || title.equals("")){ 
     where = "name LIKE '" + partialName + "%'"; 
    } 
    Cursor cur = mDatabase.query(TABLE_NAME, new String[] {"_id", "name", "title"}, where, null, null, null, "name"); 

    return cur; 
} 

使用該光標的代碼如下:

Cursor cursor = mDataHelper.selectEntryStartsWith("ex", null); //get all entries that start with "ex" 
String [] from = new String [] { "name", "title" }; 
int [] to = new int [] { R.id.name, R.id.title }; 
SimpleCursorAdapter adapter = new SimpleCursorAdapter(mContext, R.layout.listview_entry, cursor, from, to); 

songList.setAdapter(adapter); 

我使用製表符來最後一段代碼來自片段的onActivityCreated();我不是說擴展ListFragment可能會更好,但我不認爲這是特別的問題。

對不起,如果我錯過了您可能需要的信息,我一直在這個問題上撞了一段時間。

回答

1

你知道數據實際上在數據庫中嗎?運行'adb shell',cd到你的數據目錄'/ data/data/[app package name]/databases'。然後運行sqlite3 [db文件名]。運行一些直接的sql查詢並確保數據存在。

如果那裏有數據,而不是直接轉到SimpleCursorAdapter,請在代碼中運行一些文本查詢,並查看您是否可以訪問結果。

一旦完成所有這些,添加ListView的東西作爲最後一步。

有些事情要提。如果用戶輸入查詢值,則需要轉義這些語句值。在查詢語句中使用selectionArgs:

http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#query(java.lang.String,java.lang.String [],java.lang.String,java.lang.String [],java.lang.String,java.lang.String,java。 lang.String)

或者使用我的精簡的apache commons-lang和StringEscapeUtils類。

http://www.touchlab.co/blog/android-mini-commons/

另一個要考慮的,但如果你沒有遇到問題,它可能不是一個問題。 '名稱'和'標題'在sql語句中可能是棘手的關鍵字。

+0

我不知道,我知道如何來決定是否應該有我的數據庫中的數據。我的平板電腦沒有植根,我沒有權限通過eclipse中的文件資源管理器訪問/ data文件夾,我錯過了什麼或有其他方法嗎?我假設那裏有數據,但是像你說的我應該先嚐試並確定。感謝您的幫助 – cpretty

+0

在模擬器中試試它,您將可以訪問該文件夾。你也可以跳過第1部分,並在代碼中查詢你的數據庫,只是試着循環代碼中的結果,而不是把它放到適配器中,只是爲了確保你有數據。但能夠看到數據庫更好。另一種獲取數據庫的方法是將java代碼中的文件複製到SD卡中。你應該可以訪問它。 –

+0

因此,由於某些原因,我仍然無法通過模擬器訪問文件。至於查詢我的代碼中的數據庫,這就是我一直在嘗試做的事情,但返回的遊標似乎不是有效的。在調試過程中查看遊標,查詢數據庫後mCount爲-1​​,這對返回的遊標是什麼意思? – cpretty

1

問題的確是數據庫沒有正確設置,我嘗試了另一種插入數據的方法,即使用ContentValues並直接插入到數據庫中,而不是使用之前使用的預編譯插入語句。

插入方法現在看起來是這樣的:

public long insert(String name, String title) 
{ 
    ContentValues cv = new ContentValues(); 
    cv.put("name", name); 
    cv.put("title", title); 
    return mDatabase.insert(TABLE_NAME, null, cv); 

    /* The old code was using this precompiled statement 
    mInsertStatement.bindString(1, name); 
    mInsertStatement.bindString(2, title); 
    return mInsertStatement.executeInsert(); 
    */ 
}