How to store image in sqlite database in iphone? [closed]

a 夏天 提交于 2020-01-25 00:46:10

问题


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"image.sqlite"];


    if (sqlite3_open_v2([path UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK)
    {


        if(selectStmt == nil)
        {
            const char *sql = "insert into imagetb(imagename,image) Values(?,?)";
            if(sqlite3_prepare_v2(database, sql, -1, &selectStmt, NULL) != SQLITE_OK)
                //              NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
                NSLog(@"%s",sqlite3_errmsg(database));
        }



        sqlite3_bind_text(selectStmt, 1, [@"test.png" UTF8String], -1, SQLITE_TRANSIENT);

         sqlite3_bind_blob(selectStmt, 2, [data1 bytes], [data1 length], SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(selectStmt))
            NSLog(@"get: %s",sqlite3_errmsg(database));
        else
            NSLog(@"scan data added");


    }

    //showimage
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
    {
        const char *sql = "select * from imagetb";// LIMIT 0,100 ";// where status = 1 ";
        sqlite3_stmt *selectstatment;

        if (sqlite3_prepare_v2(database, sql, -1, &selectstatment, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(selectstatment) == SQLITE_ROW)
            {

                NSString *getorgstrid = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstatment, 0)];
                NSLog(@"id->%@",getorgstrid);

                [getid addObject:getorgstrid];

                NSString *getorgstrname = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstatment, 1)];
                NSLog(@"name->%@",getorgstrname);
                [getname addObject:getorgstrname];


                NSData *getorgstrimage = [[NSData alloc] initWithBytes:sqlite3_column_blob(selectstatment,2)length:sqlite3_column_bytes(selectstatment, 2)];

                [getimage addObject:getorgstrimage];

            }
        }
        sqlite3_finalize(selectstatment);

    }
    //[tblorgland reloadData];

    UIImage *image1 = [UIImage imageWithData:[getimage lastObject]];

    NSLog(@"image%@",image1);

    [getImageview setImage:image1];
    [pool release];


==============================================================================

- (NSString *) getDBPath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    return [documentsDir stringByAppendingPathComponent:@"image.sqlite"];
}

- (void)viewDidLoad
{
    [super viewDidLoad];

    getid=[[NSMutableArray alloc]init];
    getname=[[NSMutableArray alloc]init];
    getimage=[[NSMutableArray alloc]init];

    [self downloadimage];
    [self makeDBCopyAsNeeded];
}
-(void)downloadimage
{
    NSLog(@"Downloading...");

    UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://0.tqn.com/d/graphicssoft/1/7/g/A/5/psptubezdotcom_003.png"]]];

    NSLog(@"%f,%f",image.size.width,image.size.height);


    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];


    NSLog(@"%@",docDir);

    NSLog(@"saving png");
    pngFilePath = [NSString stringWithFormat:@"%@/test.png",docDir];
    data1 = [NSData dataWithData:UIImagePNGRepresentation(image)];

    img=[[UIImage alloc]initWithData:data1];



    [data1 writeToFile:pngFilePath atomically:YES];


    NSLog(@"saving jpeg");
    NSString *jpegFilePath = [NSString stringWithFormat:@"%@/test.jpeg",docDir];

    NSLog(@"jpegFilePath:%@",jpegFilePath);
    data2 = [NSData dataWithData:UIImageJPEGRepresentation(image, 1.0f)];

    [data2 writeToFile:jpegFilePath atomically:YES];

    NSLog(@"saving image done");

    [image release];


}
- (void) makeDBCopyAsNeeded
{
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"image.sqlite"];
    success = [fileManager fileExistsAtPath:writableDBPath];

    NSString *dbPath = [self getDBPath];
    NSLog(@"%@",dbPath);

    if (success)
    {
        NSLog(@"Database Success Created");
        return;
    }
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"image.sqlite"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
    if (!success)
    {
        NSLog(@"Database:->%s",sqlite3_errmsg(database));
    }
}

回答1:


It is not recommended to store the image data in the sqlite. But if you want to store the image data then use this link

Save image data to sqlite database in iphone

Hope this will helps you..




回答2:


You better use caches to store your images, and use database to store their names or some unique id's




回答3:


Just write following code in -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo: if you are getting image from gallery or Camera otherwise skip code under if (imageData != nil) and just use below code to save image in sqlite

NSData * imageData = UIImageJPEGRepresentation(image, 0.8);
    NSLog(@"Image data length== %d",imageData.length);

if (imageData != nil)
    {
        UIImage *resizedImg = [self scaleImage:[UIImage imageWithData:imageData] toSize:CGSizeMake(150.0f,150.0f)];

        NSData * imageData = UIImageJPEGRepresentation(resizedImg, 0.2);
        NSLog(@"*** Image data length after compression== %d",imageData.length);

        NSString *nameofimg=[NSString stringWithFormat:@"%@",resizedImg];

        NSString *substring=[nameofimg substringFromIndex:12];
        NSString *new=[substring substringToIndex:7];// Get image name

        NSArray *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *documentdirectory=[path objectAtIndex:0];

        NSString *newFilePath = [NSString stringWithFormat:[documentdirectory stringByAppendingPathComponent: @"/%@.png"],new];

        [imageData writeToFile:newFilePath atomically:YES];

        imgpath=[[NSString alloc]initWithString:newFilePath];
        NSLog(@"doc img in img method === %@",imgpath);
    }


     databasepath=[app getDBPath]; // i have this method in delegate
        if (sqlite3_open([databasepath UTF8String], &dbAssessor) == SQLITE_OK)
        {
            NSString *selectSql = [NSString stringWithFormat:@"insert into imagetb(imagename,image) VALUES(\"%@\",\"%@\") ;",yourImgName,imgpath];

            NSLog(@"Query : %@",selectSql);

            const char *sqlStatement = [selectSql UTF8String];
            sqlite3_stmt *query_stmt;
            sqlite3_prepare(dbAssessor, sqlStatement, -1, &query_stmt, NULL);

            if(sqlite3_step(query_stmt)== SQLITE_DONE)
            {
                NSLog(@"home image updated. :)");
                app.houseImage=imgpath;
            }
            else
            {
                UIAlertView *alert = [[UIAlertView alloc]
                                      initWithTitle:@"Sorry" message:@"Failed To Save Home Image." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [alert show];
                [alert release];
            }
            sqlite3_finalize(query_stmt);
        }
        sqlite3_close(dbAssessor);


来源:https://stackoverflow.com/questions/15263501/how-to-store-image-in-sqlite-database-in-iphone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!