Предотвращение экранирования sqlite обратной косой черты

У меня есть столбец varchar в базе данных sqlite. Конкретная строка текста имеет обратную косую черту, которая используется с "\n" для возврата каретки в UITextView. Когда значение читается из базы данных через SELECT:

myobject.text = [NSString stringWithUTF8String: (char *)sqlite3_column_text(selectstmt, 2)];

Обратная косая черта экранирована и выглядит так:

"\\n" rather than "\n"

который не интерпретируется как возврат каретки. Если я добавлю в текст две черные косые черты, вторая также будет экранирована и в конечном итоге приведет к исключению, когда текстовое представление будет добавлено в качестве подпредставления:

Завершение работы приложения из-за необработанного исключения «NSUnknownKeyException», причина: «[ setValue: forUndefinedKey:]: этот класс не соответствует кодированию значения ключа для теста ключа».

Есть ли способ предотвратить эти побеги или мне нужно будет очистить его вручную?


person 4thSpace    schedule 31.05.2009    source источник


Ответы (1)


Обратная косая черта, без сомнения, находится прямо в тексте столбца — вы «видите» ее как двойную, потому что именно так отображаются обратные косые черты (во избежание путаницы с управляющими последовательностями). sqlite не меняет текст, который вы помещаете туда при запросе, но, возможно, текст в базе данных не тот, который вы хотите получить.

Что вам нужно сделать, так это заменить два символа обратной косой черты-n на один символ newline, и вы можете это сделать либо в базе данных (раз и навсегда, либо в каждом запросе), либо в вашем коде Objective-C (на каждом запросе). запрос) в зависимости от ваших конкретных потребностей.

person Alex Martelli    schedule 31.05.2009
comment
Что вы подразумеваете под символом новой строки? Я вижу, что вы говорите о двойной обратной косой черте. Однако, если я возьму тот же текст в базе данных и назначу его UITextView непосредственно в качестве теста, он будет отображаться с возвратом каретки. При выходе из базы данных отображается литерал \n без возврата каретки. В чем разница? - person 4thSpace; 31.05.2009
comment
новая строка — один символ, ascii 10; он часто вводится в строковом литерале в виде двух символов обратной косой черты и n в так называемой управляющей последовательности, а строки, содержащие символы новой строки, часто отображаются как управляющая последовательность (в зависимости от того, как вы их отображаете). Я имею в виду, что вы, вероятно, НЕ берете один и тот же текст в базе данных — вы берете текст с символом новой строки, который вы вводите как escape-последовательность. Вероятно, это связано с тем, как двухсимвольные последовательности оказались в БД в первую очередь, в зависимости от того, как вы их ВСТАВИЛИ. - person Alex Martelli; 31.05.2009
comment
Я вводил \n вручную в БД с помощью инструкции INSERT. Однако я обнаружил, что простое нажатие клавиши возврата в тексте, где я хочу, чтобы возврат каретки выполнялся, когда он выходит из БД. - person 4thSpace; 31.05.2009
comment
Хорошо! Ясно, что когда вы вводили \n, ничто не интерпретировало это как escape-последовательность (и точно так же ничто не интерпретировало CR как означающее что-то иное, кроме самого себя). Значит, проблема решена? Или вам нужна помощь в исправлении того, что уже есть в вашей БД? Например. вы можете выполнить REPLACE вручную в БД, если это необходимо. - person Alex Martelli; 31.05.2009
comment
Проблема определенно решена. Простое нажатие клавиши возврата — самый простой случай, и все, что мне нужно. Спасибо. - person 4thSpace; 31.05.2009