2016-12-10 3 views
1

Я знаю, что вы можете запросить базу данных, как такМожно ли искать базу данных SQLite с закодированными в base64 текстовыми строками?

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

Однако проблема, я закодирован строки (base64) перед сохранением данных в моей базе данных SQLite. Поэтому регулярные поисковые запросы из строки поиска не будут работать в этой ситуации. У меня есть другое решение, которое захватывает все данные и сохраняет его в массиве, тогда я могу его предикатировать. Тем не менее, мне интересно, есть ли способ поиска данных с использованием вышеприведенного запроса, даже когда строки закодированы base64.

+0

Я использовал base64 расшифровывать, чтобы укоротить строку. Строки могут быть очень длинными. – Weakman10122

+0

@Rob Я извиняюсь, я получил здесь свою терминологию совершенно неправильно. Сегодня я не совсем проснулся. Я закодировал огромные строки, используя базу 64, прежде чем вставлять свою базу данных sql. Другими словами, строки в моей базе данных кодируются base64, а не base64. – Weakman10122

+0

Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/130307/discussion-between-rob-and-weakman10122). – Rob

ответ

0

В 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 

Но это потерпит неудачу, если заголовок содержал апостроф: Wake

Финнегана

Да, base64-кодирование может обойти эту проблему, но, лучше, вы мог бы просто заменить это на SQL с помощью заполнителей ? тоже:


Кстати, для поиска, вы также хотите использовать ? заполнители:

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