如何在iphone中的sqlite数据库中存储图像?

时间:2013-03-07 05:06:20

标签: iphone ios objective-c sqlite

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));
    }
}

3 个答案:

答案 0 :(得分:0)

不建议将图像数据存储在sqlite中。但是,如果您想存储图像数据,请使用此链接

Save image data to sqlite database in iphone

希望这会对你有所帮助..

答案 1 :(得分:0)

只需编写以下代码 - (void)imagePickerController:(UIImagePickerController *)选取器        didFinishPickingImage :( UIImage *)图片                  editingInfo:(NSDictionary *)editingInfo:如果你从图库或相机获取图像,否则跳过if(imageData!= nil)下的代码,并使用下面的代码在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);

答案 2 :(得分:0)

您最好使用缓存来存储图像,并使用数据库存储其名称或某些唯一ID