是否可以搜索具有base64编码的SQLite数据库的某些文本字符串?

时间:2016-12-10 18:01:41

标签: objective-c sqlite base64

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

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

然而,问题是我在将数据存储到我的sqlite数据库之前编码了字符串(base64)。因此,搜索栏中的定期搜索在这种情况下无法正常工作。我有另一个解决方案,抓取所有数据并将其存储在一个数组,然后我可以预测它。但是,我想知道是否有办法使用上面的查询以某种方式搜索数据,即使字符串是由base64编码的。

1 个答案:

答案 0 :(得分:0)

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

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

相反,我根本不会对数据库中的字符串进行64位编码。数据库将更小(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];