首先,我知道我不应该使用sqlite数据库来存储图像,但我只存储非常小的网站图标.
我的问题是我尝试将这些favicon插入数据库(似乎工作),我使用NSimage的-tiffrepresentation方法将favicon转换为NSData,然后将其插入我的数据库中的blob列:
NSImage *favico = [webview mainFrameIcon]; [appDelegate insertBookmark:[titleField stringValue] url:[urlfield stringValue] data:[favico TIFFRepresentation]]
-(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,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>之间的image列中有值. (正常吗?)
现在,当我从数据库中提取blob并尝试将其放入我的对象时,我在NSimage中得到了null:
-(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,&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]; }
}
提前致谢