如何在Flutter中使用sqflte插入特殊字符?

时间:2018-08-20 17:10:25

标签: ios sqlite flutter fmdb

我想在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')");

2 个答案:

答案 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)

我找到了一种方法,可以从字符串中删除这些特定的HTML标签并将其设置为平面文字。

您可以参考this thread

我想这正是您想要的

您可以删除这些标记并将字符串插入数据库