2010-04-05 79 views
2

我想在Android中設置一個簡單的SQLite數據庫,通過SQLiteOpenHelper的子類來處理模式。但是,當我查詢我的表格時,我認爲插入的列從不存在。Gotchas在Android上插入SQLite?

也就是說,在SQLiteOpenHelper的onCreate(SQLiteDatabase db)方法,我用db.execSQL()運行CREATE TABLE命令,然後試圖既db.execSQLdb.insert()對我剛剛創建的表運行INSERT命令。這看起來運行良好,但是當我嘗試查詢它們時,我總是返回0行(用於調試,我正在運行的查詢很簡單,SELECT * FROM table並檢查遊標的getCount())。

有人遇到過這樣的事情嗎?這些命令似乎在命令行sqlite3上運行。它們是我缺少的陷阱(例如,INSERTS必須/不能以分號結尾,或涉及多個表的問題)?我附上了一些下面的代碼。

感謝您的時間,並讓我知道如果我可以進一步澄清。


@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.execSQL("CREATE TABLE "+ LEVEL_TABLE +" (" + 
       " "+ _ID +" INTEGER PRIMARY KEY AUTOINCREMENT," + 
       " level TEXT NOT NULL,"+ 
       " rows INTEGER NOT NULL,"+ 
       " cols INTEGER NOT NULL);"); 

    db.execSQL("CREATE TABLE "+ DYNAMICS_TABLE +" (" + 
       " level_id INTEGER NOT NULL," + 
       " row INTEGER NOT NULL,"+ 
       " col INTEGER NOT NULL,"+ 
       " type INTEGER NOT NULL);"); 

    db.execSQL("CREATE TABLE "+ SCORE_TABLE +" (" + 
       " level_id INTEGER NOT NULL," + 
       " score INTEGER NOT NULL,"+ 
       " date_achieved DATE NOT NULL,"+ 
       " name TEXT NOT NULL);"); 
    this.enterFirstLevel(db); 
} 

而且我目前使用插入代碼,獲取enterFirstLevel()稱爲樣本(一些值硬編碼只是爲了讓它運行...):

private void insertDynamic(SQLiteDatabase db, int row, int col, int type) 
{ 
    ContentValues values = new ContentValues(); 

    values.put("level_id", "1"); 
    values.put("row", Integer.toString(row)); 
    values.put("col", Integer.toString(col)); 
    values.put("type", Integer.toString(type)); 

    db.insertOrThrow(DYNAMICS_TABLE, "col", values); 
} 

最後,查詢代碼如下所示:

private Cursor fetchLevelDynamics(int id) 
{ 
    SQLiteDatabase db = this.leveldata.getReadableDatabase(); 
    try { 
     String fetchQuery = "SELECT * FROM " + DYNAMICS_TABLE; 
     String[] queryArgs = new String[0];   
     Cursor cursor = db.rawQuery(fetchQuery, queryArgs); 

     Activity activity = (Activity) this.context; 
     activity.startManagingCursor(cursor); 
     return cursor; 
    } 
    finally { 
     db.close(); 
    } 
} 

回答

0

它對我來說確實夠好。

要排除故障,我會建議至少向queryArgs添加一列。我不確定發送空列表的效果。這有可能導致即使有結果也不會返回行。

沒有必要將您的Integer值轉換爲ContentValues中的字符串。嘗試更換values.put("row", Integer.toString(row));只是values.put("row", row);可能不是你的問題的原因,但它會拋出一個異常,如果它反對的字符串。

我從來沒有使用SQLiteDatabase.rawQuery(),也許嘗試更常用的.query()?

我看不到你的代碼用fetchLevelDynamics()返回的'遊標',所以我不能排除那裏的邏輯錯誤。

+0

雖然這WASN擺脫了一些錯誤的從技術上講,答案(我找到了,並將其作爲問題的單獨答案寫出來),我讚賞調試提示,希望標記爲已回答的問題,併爲您提供信譽點。感謝您的幫助^ _^ – 2010-04-21 18:35:16

+0

不客氣。很高興我能幫上忙。 – 2010-04-21 20:58:24

0

嘗試

db.insertOrThrow(DYNAMICS_TABLE, "col", values); 
2

使用空第二個參數想通了,這是一些不同的東西。首先,主要是,查詢碼:a Cursor只能導航什麼是開放數據庫。所以上面的查詢方法將返回一個Cursor,然後關閉finally塊中的數據庫。

雖然它不能正常工作,但如果在封閉的數據庫下運行,Cursor不會拋出錯誤。它只會說它返回了0行(這就是爲什麼我認爲錯誤在INSERT代碼中)。

而且,我忘了幾個SQL的東西,即rowcol不表字段偉大的名字,我能夠被他們更名爲row_numcol_num