2012-07-13 55 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