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

sup*_*iox 8 sqlite android

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

所以我写了这段代码:

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

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

[编辑]

这样我就不会出错,但是没有插入记录.

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

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

Mer*_*lin 20

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

要转换您的值,您可以使用Sqlite日期和时间函数文档中详述的日期时间函数

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

String sql="INSERT INTO sms VALUES ( null, ?, ?, ?, datetime('NOW'))";
Run Code Online (Sandbox Code Playgroud)

你应该调用execSQL而不是rawQuery期望返回记录集.

dbw.execSQL(sql, new String[]{str1,str2,str3});
Run Code Online (Sandbox Code Playgroud)

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

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

另一个可能的选择是在SQLite中使用默认时间戳,虽然我没有在android中尝试过这个.