Android SQLite在TEXT列中插入带有转义双引号的JSON

时间:2018-07-11 14:06:20

标签: android json sqlite sqlite-json1

我正在一个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.putSQLiteDatabase.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 错误。

0 个答案:

没有答案