如何使用rawQuery()方法插入记录?

时间:2011-09-19 12:12:48

标签: android sqlite

我需要使用rawQuery()方法存储记录,因为我想插入当前日期和时间(datetime()),但我还需要插入包含引号的字符串。

所以我写了这段代码:

String sql="INSERT INTO sms VALUES ( null, ?1, ?2, ?3, datetime())";
dbw.rawQuery(sql, new String[]{str1,str2,str3});

但它没有存储任何东西......出了什么问题?

[编辑]

这样我就不会收到错误,但是没有插入记录。

String mitt="mitt", dest="dest", text="text";
String sql="INSERT INTO sms VALUES ( null, ?, ?, ?, datetime('NOW'))";
dbw.rawQuery(sql, new String[]{mitt,dest,text});

此时,唯一可以插入记录(带引号问题)的方法是execSQL(String s)

4 个答案:

答案 0 :(得分:18)

SQLite没有本机日期时间数据存储类型。它可以存储字符串或日期的整数表示。

要转换您的值,您可以使用Sqlite Date and Time functions documentation

中详述的日期时间函数

您的初始尝试几乎是正确的,但您的datetime()函数调用需要'NOW'的参数。

String sql="INSERT INTO sms VALUES ( null, ?, ?, ?, datetime('NOW'))";

此外,您应该致电execSQL而不是rawQuery,而这需要返回记录集。

dbw.execSQL(sql, new String[]{str1,str2,str3});

如果不插入所有值,您可以通过在查询中的表名后插入字段列表来指定插入数据的各个列

String sql = "INSERT INTO sms(f1, f2, f3, f4)"
           + "VALUES ( null, ?, ?, ?, datetime('NOW'))";

可能的另一个选择是using a default timestamp in SQLite,虽然我没有在android中尝试过这个。

答案 1 :(得分:3)

我用这种方式解决了问题:

String sql="INSERT INTO sms VALUES (null,?,?,?,datetime('NOW'))";
dbw.execSQL(sql,new Object[]{mitt,dest,text});

最后,我可以毫无问题地存储每个字符!!!

答案 2 :(得分:-2)

试试这样:

ContentValues values;
values=new ContentValues();

// values.put("field_name",value);
values.put("id", 5); 
values.put("name", name);
dbw.insert("table_name", null, values);

答案 3 :(得分:-2)

String sql="INSERT INTO sms VALUES ( null, '"+str1+"', '"+str2+"', '"+str3+"', datetime())";
dbw.rawQuery(sql, null);

标记单引号。