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

Posted

技术标签:

【中文标题】如何在 Flutter 中使用 sqflite 插入特殊字符?【英文标题】:How to insert special character with sqflte in Flutter? 【发布时间】:2019-01-26 20:49:24 【问题描述】:

我想在 Flutter 中用 sqflite 保存 html 字符串。

但是html字符串中有很多特殊字符比如'?','=','&'......

它会抛出如下错误:DB Error: 1 "near "?": syntax error"。

我用的是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')");

【问题讨论】:

你能分享一个引发数据库错误的完整字符串的例子吗? 一件事:您不应该将 $bookName 之类的占位符放在引号中。如果 (bookName, chapterName) 是唯一键,您还可以避免插入中的整个讨厌的原因。只需使用INSERT OR IGNORE ... 【参考方案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],
);

【讨论】:

【参考方案2】:

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

可以参考this thread

我想这正是你想要的

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

【讨论】:

感谢您的回复。但我想在数据库中插入 html 标签。我已经通过 boformer 的回答解决了。

以上是关于如何在 Flutter 中使用 sqflite 插入特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中将图像数据保存到sqflite数据库以进行持久化

Flutter sqflite 打开现有数据库

使用 Flutter 插入 sqflite 时出现问题

Flutter 应用中提供程序与 sqflite 的集成

Flutter Provider 和 sqflite 集成

在 Flutter 中使用 SQFlite 将本地存储的 DB 导出为可读文件