Search code examples
iphoneios5xcode4

Inserting Image to sqlite iphone


Hi All I'm New to Xcode I'm trying to insert image from UITableView to database(sqlite3) in ios 5 i tried below code

-(void)addItemCUR
{

    if(addStmt == nil) {
        const char *sql = "insert into Table(C_Name, C_Image) Values(?,?)";
        if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(addStmt, 1, [C_Name UTF8String], -1, SQLITE_TRANSIENT);

    NSData *ImageData = [[NSData alloc] initWithData:UIImagePNGRepresentation(self.C_Image)];
    int returnValue = -1;
    if(self.C_Image != nil)
       returnValue =        sqlite3_bind_blob(addStmt, 3, [ImageData bytes], [ImageData length], NULL);
    else
        returnValue =         sqlite3_bind_blob(addStmt, 4, nil, -1, NULL);



    if(SQLITE_DONE != sqlite3_step(addStmt))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
    else
        //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
        rowid = sqlite3_last_insert_rowid(database);

    //Reset the add statement.
    sqlite3_reset(addStmt);
}

I'm getting Error like

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString CGImage]: unrecognized selector sent to instance 0xb7c0'
*** First throw call stack:
(0x158f052 0x1720d0a 0x1590ced 0x14f5f00 0x14f5ce2 0xf8b6c 0x5c65 0x3182 0x7030 0x16d71d 0x16d952 0x9f586d 0x1563966 0x1563407 0x14c67c0 0x14c5db4 0x14c5ccb 0x1478879 0x147893e 0xdda9b 0x2ac8 0x2a25)
terminate called throwing an exceptionsharedlibrary apply-load-rules all
(gdb

Please any one help me to get through this thanks in advance.


Solution

  • Try to store the images in local document directory.Then store the image path in sqlite.Following code will help you.

    NSData *imageData = UIImagePNGRepresentation(photo);//photo - your image
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    NSString *pngFilePath = [NSString stringWithFormat:@"%@/photo.png",documentsDir]; 
    [imageData writeToFile:pngFilePath atomically:YES];
    
    NSArray *sysPaths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
    NSString *docDirectory = [sysPaths objectAtIndex:0];
    NSString *filePath = [NSString stringWithFormat:@"%@/photo.png", docDirectory];
    
    sqlite3 *database;
    @try 
    {
        NSString *query = [NSString stringWithFormat:@"INSERT INTO Photos(PhotoPath) VALUES('%@')",filePath];
        NSString *databasePath;
        NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDir = [documentPaths objectAtIndex:0];
        databasePath = [documentsDir stringByAppendingPathComponent:@"GolfElite.sqlite"];
        if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)    
        {
            NSLog(@"DB opened...");
            sqlite3_exec(database, [query UTF8String], NULL, NULL, NULL);   
        }
    
    }
    @catch (NSException * e) 
    {
        NSLog(@"Exception = %@", e);
    }
    @finally
    {
        sqlite3_close(database);
    }
    NSLog(@"Photos inserted successfully..");