NSImage для BLOB и BLOB для NSImage (SQLite, NSData) - PullRequest
7 голосов
/ 01 мая 2011

Прежде всего, я знаю, что я не должен использовать базу данных SQLite для хранения изображений, но я храню только значки веб-сайтов, которые действительно очень малы.

Моя проблема в том, что я пытаюсь вставить эти значки в базу данных (кажется, работает), я преобразовываю значки в NSData с помощью метода -tiffrepresentation NSimage, а затем вставляю их в базу данных в BLOB-объект колонка:

 NSImage *favico = [webview mainFrameIcon];
[appDelegate insertBookmark:[titleField stringValue] url:[urlfield stringValue] data:[favico TIFFRepresentation]]

Метод SQLite выглядит следующим образом:

-(void)insertBookmark:(NSString *)title url:(NSString *)url data:(NSData *)data
{
    NSData *imagedata = [[NSData alloc]initWithData:data]; 
    sqlite3 *database;
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSString *query = [NSString stringWithFormat:@"INSERT INTO Bookmarks (title, url, image) VALUES ('%@', '%@', '%@')",title, url, data];
        const char *querychar = [query UTF8String]; 
        sqlite3_stmt *statement; 
        if (sqlite3_prepare_v2(database, querychar, -1, &statement, NULL) == SQLITE_OK)
        {
            int row =  3;
            sqlite3_bind_blob(statement, row, [imagedata bytes], [imagedata length], NULL);
            sqlite3_step(statement);
            sqlite3_finalize(statement);

        }
        else
        {
            NSLog(@"Error"); 
        }

        [databasePath retain]; 
        [databaseName retain]; 
    }
    sqlite3_close(database);
    [imagedata release]; 

}

Когда я заглядываю в базу данных, у меня есть значение в столбце изображения между <data> (нормально?)

Теперь, когда я извлекаю BLOB-объект из базы данных и пытаюсь поместить его в свой объект, я получаю значение NULL в NSimage:

-(void) readDatabase {
// Setup the database object
sqlite3 *database;

bookmarks = [[NSMutableArray alloc] init];

// Open the database from the users filessytem
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    // Setup the SQL Statement and compile it for faster access
    const char *sqlStatement = "SELECT * FROM Bookmarks ORDER BY title ASC";
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        // Loop through the results and add them to the feeds array
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
            // Read the data from the result row
            NSString *aTitle = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
            NSString *aUrl = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
            NSData *data = [[NSData alloc] initWithBytes:sqlite3_column_blob(compiledStatement, 3) length:sqlite3_column_bytes(compiledStatement, 3)];
            NSImage *image = [[NSImage alloc]initWithData:data];
            bookmarkObject *bookmark = [[bookmarkObject alloc] initWithName:aTitle url:aUrl favico:image]; 

            [bookmarks addObject:bookmark];
            [bookmark release];
            [data release];
            [image release]; 



        }
    }
    // Release the compiled statement from memory
    sqlite3_finalize(compiledStatement);
    sqlite3_close(database); 
    [databasePath retain]; 
    [databaseName retain]; 


}

}

Заранее спасибо

1 Ответ

4 голосов
/ 01 мая 2011

< и > вокруг ваших фактических данных поступают из NSData.Используя %@ в строке формата и указав data, NSString отправляет description на data.[NSData description] переносит содержимое между < и >.

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

  • Либо используйте stringWithFormat: для создания полного оператора запроса
  • или используйте запрос типа INSERT INTO Bookmarks (title ...) VALUES (? ...) в сочетании с sqlite3_bind_blob

Синтаксис параметров, поддерживаемый SQLite, можно найти здесь: http://www.sqlite.org/c3ref/bind_blob.html

...