我正在一个Android应用程序中使用SQLite,该应用程序除其他外还存储一个记录用户情绪的表格。表架构如下所示
CREATE TABLE moods
(
dow INTEGER,
tsn INTEGER,
lato INTEGER,
agitation TEXT DEFAULT '{}',
preoccupancy TEXT DEFAULT '{}',
tensity TEXT DEFAULT '{}',
taps TEXT DEFAULT '{}'
);
与Postgres不同,SQLite没有专用的jsonb
存储类型。引用
向后兼容性约束意味着SQLite仅能存储NULL,整数,浮点数,文本和BLOB的值。无法添加第六种“ JSON”类型。
SQLite JSON1 extension documentation
在SQLite命令行处理器上,我可以使用诸如此类的简单INSERT语句填充该表
INSERT INTO moods (dow,tsn,lato,agitation,preoccupancy,tensity,taps)
VALUES(1,0,20,'{"A2":1}','{"P4":2}','{"T4":3}','{"M10":4}');
因为它接受字符串的单引号和双引号。
为了在我的Hybrid Android应用中完成同样的事情,我执行以下操作
String ag = JOString("A" + DBManage.agitation,1);
String po = JOString("P" + (DBManage.preoccupancy + 15),1);
String te = JOString("T" + DBManage.tensity,1);
它返回诸如{"P4":2}
之类的字符串。我的下一步如下
ContentValues cv = new ContentValues();
cv.put("dow",0);
cv.put("tsn",1);
cv.put("lato",2);
cv.put("agitation",ag);
cv.put("preoccupancy",po);
cv.put("tensity",te);
long rowid = db.insert("moods",null,cv);
有效。但是,检查存储的值后,我发现实际上是进来的
{"dow":0,"tsn":5,"lato":191,"tensity":"{\"T0\":1}","agitation":"
{\"A1\":1}","preoccupancy":"{\"P15\":1}","taps":"{}"}]
除非我对这里的某些东西有误解,但基础的ContentValues.put
或SQLiteDatabase.insert
实现已将其自身用于转义引用的字符串。考虑到使用SQLiteDatabase.insert
进入ContentValues
路由的好处是可以防止SQL注入攻击,因此这也许是可以预期的。但是,在当前情况下,这是一个障碍而不是帮助。
通过execSQL
执行原始SQL的简短方法是否还有另一种方法可以将JSON放入SQLite数据库表中?
我应该补充一点,只需将双引号替换为单引号
String ag = JOString("A" + DBManage.agitation,1);
ag = ag.replaceAll("\"","'");
将不起作用,因为随后尝试从表中提取JSON
SELECT ifnull((select json_extract(preoccupancy,'$.P4') from moods where dow = '1' AND tsn = '0'),0);
将导致SQLite JSON1扩展发出格式错误的JSON 错误。