2013-08-01 1 views
0

Я хочу сохранить изображение в Database и получать изображение в database.i я конвертировать изображение в NSData и образ магазина успешно в базе данных, но когда я выборки что изображение из базы данных, то это crash.it дать это предупреждение обFetch Image Из Sqllite базы данных в Iphone

Предупреждение: - - [__ NSCFString байт]: непризнанные селектор направлен например 0x7916000

Ниже кода для сохранения изображения в базе данных

NSData *dataImage1 = UIImagePNGRepresentation(image3.image); 
NSString *str = [NSString stringWithFormat:@"Insert into Gallery(ImageName) VALUES ('%@')",dataImage1]; 
[Database executeQuery:str]; 

//Database.m

+(NSString*)getDatabasePath{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"Database"]; 
    return writableDBPath; 

} 

+(NSMutableArray *)executeQuery:(NSString*)str{ 

    sqlite3_stmt *statement= nil; 
    sqlite3 *database; 
    NSString *strPath = [self getDatabasePath]; 
    NSMutableArray *allDataArray = [[NSMutableArray alloc] init]; 
    if (sqlite3_open([strPath UTF8String],&database) == SQLITE_OK) { 
     if (sqlite3_prepare_v2(database, [str UTF8String], -1, &statement, NULL) == SQLITE_OK) { 


      while (sqlite3_step(statement) == SQLITE_ROW) { 
          NSInteger i = 0; 
       NSInteger iColumnCount = sqlite3_column_count(statement); 
       NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
       while (i< iColumnCount) { 
        NSString *str = [self encodedString:(const unsigned char*)sqlite3_column_text(statement, i)]; 


       NSString *strFieldName = [self encodedString:(const unsigned char*)sqlite3_column_name(statement, i)]; 

        [dict setObject:str forKey:strFieldName]; 
        i++; 
       } 

       [allDataArray addObject:dict]; 
       [dict release]; 
      } 
     } 

     sqlite3_finalize(statement); 
    } 
    sqlite3_close(database); 
    return allDataArray; 
} 

// Fetch изображение

NSString *str =[NSString stringWithFormat:@"Select * from Gallery where id = 1"]; 
NSMutableArray *arra =[Database executeQuery:str]; 
NSData *d =[[arra objectAtIndex:0] valueForKey:@"ImageName"]; 
UIImage *img = [[UIImage alloc] initWithData:d]; 
NSLog(@"%@",img); 

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

+0

Вставить - Вставить sqlite3_bind_blob (stm, 2, [image bytes], [длина изображения], NULL); – Rajneesh071

+0

для получения NSData * imageData = [[NSData alloc] initWithBytes: sqlite3_column_blob (statement, 1) length: sqlite3_column_bytes (statement, 1)]; – Rajneesh071

ответ

0

я думаю, что вы получаете байты в строке печатать

[[arra objectAtIndex:0] valueForKey:@"ImageName"]; 

поэтому сначала получите строку, а затем преобразуйте ее в данные.

попробовать так:

NSData* data = [[[arra objectAtIndex:0] valueForKey:@"ImageName"] dataUsingEncoding:NSUTF8StringEncoding]; 
+0

да, я получаю байты, но все равно даю мне нулевое значение – Rushabh

+0

сделать как отредактированный код. –

+0

NSString * str = [NSString stringWithFormat: @ "Выбрать * из галереи, где id = 1"]; NSMutableArray * arra = [Database executeQuery: str]; NSData * data = [[[arra objectAtIndex: 0] valueForKey: @ "ImageName"] dataUsingEncoding: NSUTF8StringEncoding]; UIImage * img = [[UIImage alloc] initWithData: data]; NSLog (@ "% @", img); – Rushabh

1

Ваша проблема заключается в том, что вы не можете вставить двоичные данные путем построения SQL заявление с stringWithFormat. Вы вставляете NSData (двоичные данные) в поле с именем ImageName, и вы не можете использовать stringWithFormat для создания этого оператора SQL.

Вы действительно хотели вставить изображение? В этом случае вы должны использовать SQL, как показано ниже, с помощью заполнителя ?, а затем используйте sqlite3_bind_blob для номера столбца 1 с NSData, прежде чем звонить по телефону sqlite3_step. Таким образом, SQL будет выглядеть следующим образом:

Insert into Gallery(ImageName) VALUES (?) 

(Кстати, я не поклонник выбора ImageName для фактических данных изображения я бы либо использовать Image для фактических данных изображения. ., или ImageName для имени образа)

А затем, после подготовки вашего SQL, вы тогда звоните:

sqlite3_bind_blob(statement, 1, [dataImage1 bytes], [dataImage1 length], SQLITE_TRANSIENT); 

вы можете вызвать sqlite3_step, как обычно, для выполнения SQL для вставьте данные.

При получении данных, после того как вы успешно sqlite3_step, вы будете использовать соответствующие sqlite3_column_blob функции:

const void *bytes = sqlite3_column_blob(statement, 0); 
int len = sqlite3_column_bytes(statement, 0); 
NSData *data = [NSData dataWithBytes:bytes length:len]; 
UIImage *image = [UIImage imageWithData:data]; 

Сказав, что, SQLite, как известно, неэффективно в хранении больших объемов данных BLOB.Возможно, вы захотите сохранить изображение в папке «Документы», а затем просто сохраните имя файла в поле ImageName.

 Смежные вопросы

  • Нет связанных вопросов^_^