【问题标题】:Is it possible to search SQLite database that has base64-encoded some text strings?是否可以搜索具有 base64 编码的某些文本字符串的 SQLite 数据库?
【发布时间】:2016-12-10 18:01:41
【问题描述】:

我知道你可以像这样查询数据库

 NSString *strSelectQuery = [NSString stringWithFormat: @"SELECT * FROM Songs WHERE songname LIKE '%%%@%%'", str];

但是,问题是我在将数据存储到我的 sqlite 数据库之前对字符串 (base64) 进行了编码。因此,在这种情况下,搜索栏的常规搜索将不起作用。我有另一个解决方案,它可以获取所有数据并将其存储在一个数组中,然后我可以对其进行谓词。但是,我想知道是否有一种方法可以使用上面的查询来搜索数据,即使字符串是由 base64 编码的。

【问题讨论】:

  • 我使用 base64 解码来缩短字符串。字符串可以很长。
  • @Rob 抱歉,我的术语在这里完全错误。今天我还没有完全清醒。在放入我的 sql 数据库之前,我使用 base 64 编码了巨大的字符串。换句话说,我数据库中的字符串是 base64 编码的,而不是 base64 解码的。
  • 以前的开发人员这样做了,我相信(不是 100% 肯定)与所有的语法错误有关,因为它都是 JSON 数据。我删除了编码,但遇到了语法问题。

标签: objective-c sqlite base64


【解决方案1】:

chat with you 中,很明显以前的开发人员在将值插入数据库时​​遇到了问题,因此他选择对这些字符串进行 base64 编码。

底线,在 base64 字符串中搜索子字符串在技术上是可行的,但令人惊讶的是复杂且效率极低。我不建议尝试这样做。

相反,我根本不会对数据库中的字符串进行 base64 编码。数据库会更小(base64 编码的字符串比原始有效负载大 33%),代码会更简单,现在可以毫不费力地进行搜索。


您提到在尝试将文本值插入数据库时​​遇到错误。这是因为使用stringWithFormat 构建SQL 会导致问题。考虑:

NSString *sql = [NSString stringWithFormat: @"INSERT INTO book (title) VALUES ('%@')", title];
BOOL success = [db executeUpdate:sql];   // FMDB method

但如果标题包含撇号,那将失败:

芬尼根的觉醒

是的,base64 编码可以解决这个问题,但更好的是,您也可以用带有? 占位符的 SQL 替换它:

NSString *sql = @"INSERT INTO book (title) VALUES (?)";
BOOL success = [db executeUpdate:sql, title];

顺便说一句,要搜索,您还需要使用? 占位符:

NSString *sql = @"SELECT * FROM book WHERE title LIKE ?";
NSString *searchTerm = [NSString stringWithFormat:@"%%%@%%", searchString];
FMResultSet *rs = [db executeQuery:sql, searchTerm];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多