2012-07-13 140 views
0

這裏有一個類似的問題,但我的情況是不同的。Android SQlite插入語法錯誤

07-13 13:03:11.460: E/SQLiteDatabase(6268): Error inserting 2=Fri Jul 13 13:03:10 EDT 2012 WebView is exiting 1=Fri Jul 13 13:02:53 EDT 2012 Registering Device for Notifications 0=Fri Jul 13 13:02:41 EDT 2012 Device passed GCM requirements test 

07-13 13:03:11.460: E/SQLiteDatabase(6268): android.database.sqlite.SQLiteException: near "2": syntax error: , while compiling: INSERT INTO log(2,1,0) VALUES (?,?,?) 

我試圖插入傳遞到ContentValues的簡單字符串值。

LogOpenHelper helper = new LogOpenHelper(this); 
ContentValues values = new ContentValues(); 
for (int i = 0; i < logReporter.getSize(); i++) { 
     values.put(i + "", temp[i]); 
    } 
helper.getWritableDatabase().insert(TABLE_NAME, null, values); 
    helper.close(); 

    cursor.close(); 

以上for循環只是將所有日誌消息從字符串[]中取出。字符串[]填充整個應用程序,因爲我不需要不斷的數據庫訪問。只是插入和查詢在啓動和關機調試

我試圖插入日期+字符串的實例的字符串。是否有一個字符序列是不允許在我錯過的sqlite解析器中?我必須使用ContentValues,因爲該類型的對象是調用insert()的參數。

任何想法爲什麼錯誤?

回答

0

爲了正確插入,您必須在方法values.put()中傳遞列的名稱作爲第一個參數。

0

正如你所寫的插入行,動態數列,其數量取決於logReporter.getSize() ...這可能不是你想要的。

假設你創建了你的表:

CREATE TABLE logtable (_id INTEGER PRIMARY KEY AUTOINCREMENT, log_message_column TEXT); 

你應該嘗試這樣的事:

SQLiteDatabase database = helper.getWritableDatabase(); 

for (String logMessage: logReporter) { 
    values.put("log_message_column", logMessage); 
    database.insert("logtable", null, values); 
} 

helper.close() 

然後,你將有你的日誌信息中的列的表logtable的的LogMessage

但爲什麼你使用數據庫的日誌?爲什麼不使用簡單的Log.d()或將日誌寫入SD卡上的某個文件?

+0

這是一個想法,被扔在遠程調試。這樣用戶可以在發生崩潰時通過日誌文件向開發者發送電子郵件。這是我的第一個應用程序,所以幾乎總結了它 – 2012-07-13 19:59:26

+0

我認爲,你也有興趣在appcrash上獲取StackTrace ...這也可以通過調用[** Thread.setDefaultUncaughtExceptionHandler()**](http:/ /developer.android.com/reference/java/lang/Thread.html#setDefaultUncaughtExceptionHandler%28java.lang.Thread.UncaughtExceptionHandler%29)在你的主線程上執行你自己的exceptionHandler ...但這是另一個問題的主題已經在StackOverflow的某個地方問過了 – Prizoff 2012-07-13 20:04:24