我想在Flutter中使用sqflite保存html字符串。
但是html字符串中有很多特殊字符,例如'?','=','&'......
它将引发错误,例如:DB错误:1“在“?”附近:语法错误”。
我正在使用iOS模拟器,因此它基于FMDB。
这是我的代码:
await database.execute("INSERT INTO ChapterCache(bookName,chapterName,content) select '$bookName','$chapterName','$content' where not exists (select * from ChapterCache where bookName = '$bookName' and chapterName='$chapterName')");
答案 0 :(得分:1)
我不确定您的查询应该做什么,它看起来有些奇怪,尤其是第一个select语句。我想您只想在数据库中不存在新行时就将其插入。
通常,您在做什么很危险!黑客可以使用SQL注入轻松劫持您的数据库。
为解决您的问题并消除SQL注入的危险,您必须在插入查询中使用准备好的语句(?
占位符,然后将这些值作为单独的列表提供。这也使您可以在数据库中插入特殊字符。
sqflite会自动为您执行此操作。将新行插入数据库的最安全方法:
final values = <String, dynamic>{
'bookName': bookName,
'chapterName': chapterName,
'content': content,
};
await database.insert('ChapterCache', values, conflictAlgorithm: ConflictAlgorithm.ignore);
如果行不存在,它将插入行;如果行已经存在(忽略),则不执行任何操作。
此外,您可能想为表设置复合主键:
CREATE TABLE `ChapterCache` (
`bookName` text NOT NULL,
`chapterName` text NOT NULL,
`content` text NOT NULL,
PRIMARY KEY(`bookName`, `chapterName`)
)
这将确保bookName
-chapterName
的每种组合仅存在一行。
现在,如果您想编写自己的SQL查询来执行与上面的insert
调用完全相同的操作,则可以安全地这样做:
await database.execute(
"INSERT OR IGNORE INTO `ChapterCache` (`bookName`, `chapterName`, `content`) VALUES (?, ?, ?)",
[bookName, chapterName, content],
);
答案 1 :(得分:0)