Лучший способ ссылки на изображение через наше приложение? - PullRequest
1 голос
/ 21 марта 2009

Мое приложение управляется базой данных. Каждая строка содержит основной столбец контента, который я отображаю в UIWebView. Большинство строк (столбец содержимого) имеют ссылку на изображение1, а некоторые на изображение2. Я конвертирую их в base64 и добавляю строку изображения в строку. Однако, если любое изображение изменяется, это означает, что мне нужно вернуться через все строки и обновить строку base64.

Я могу предоставить уникальную строку в содержимом строки, например {image1}. Это означает, что мне придется искать все содержимое этой строки и заменить его на версию base64 изображения. Эти изображения также всегда находятся внизу содержимого строки. Не уверен, как необходимость просматривать весь контент перед заменой повлияет на производительность. Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 14 мая 2009

Надеюсь, я правильно понимаю ваш вопрос.

Если изображения не очень большие, то, вероятно, можно просто использовать ключевое слово like, как в:

sqlite3_stmt *statement = nil;
if(statement == nil)
{
    const char *sql = [[NSString stringWithFormat:@"SELECT imageContent FROM imageDatabase WHERE imageContent LIKE '%@%@%@'", @"%", imageValue, @"%"] UTF8String];
    if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) != SQLITE_OK) {
        //NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(db));
        return;
    }
}
while (sqlite3_step(statement) == SQLITE_ROW) {
    // query was successful
    // perform some action on the resulting data
}
sqlite3_finalize(statement);
statement = nil;

Если вы установите imageValue = image1, image2 или что-то еще, это даст вам искомый элемент из базы данных без необходимости манипулирования строками в коде. Я предполагаю, что вы знаете SQL, так что извините, если это избыточная информация, но выше будет искать в вашей базе данных imageD чем-нибудь, что содержит image1, image2 imageValue. Найдя строку, вы можете обновить ее или использовать предложение WHERE с оператором UPDATE SQL, но я считаю, что это немного опасно из-за возможности непреднамеренного обновления нескольких строк без предварительной проверки содержимого, чтобы убедиться, что это то, что вы хотите.

Кроме того, если вы делаете обновления базы данных с этим, вы найдете значительное повышение производительности, обернув вставки и обновления транзакциями, такими как:

const char *sql = "BEGIN TRANSACTION;";
    char *errMsg;
    sqlite3_exec(db, sql, nil, 0, &errMsg);

const char *commit = "COMMIT;";
    sqlite3_exec(db, commit, nil, 0, &errMsg);

Он готовит и оптимизирует ваш запрос перед его выполнением. Я видел, что запросы на вставку и обновление выполняются в два раза быстрее с транзакциями.

Если база данных очень большая, это приведет к значительному снижению производительности, но выполнение манипуляции со строками в памяти потребует значительных затрат памяти. Если вы используете метод SQLite LIKE, поиск строк выполняется на диске последовательным способом и имеет меньше попаданий в память.

Как только вы нашли конкретный элемент, вы можете выполнять поиск по регулярному выражению и заменять только эту строку, сохраняя при этом объем памяти вашего кода.

0 голосов
/ 21 марта 2009

Почему бы не иметь изображения в таблице с image_ID (уникальное целое число) и image_data (большой двоичный объект)? Затем в вашей основной таблице сохраните только image_ID и выполните объединение, если вам нужно фактическое изображение?

Об альтернативной интерпретации вашего вопроса (если этот ответ не имеет для вас смысла), почему бы не разбить содержимое на три поля: материал перед изображением, изображение и материал после. Сохраните image_ID для средней части (не для данных - получите это с помощью sql JOIN в таблице изображений). Затем создайте окончательный контент с конкатенацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...