简体   繁体   English

将图像从UIImagePicker保存到Sqlite DB

[英]Saving image from UIImagePicker to Sqlite DB

So what I'm doing is the user is picking an image from the camera roll and I'm setting an imageView with that image. 因此,我正在做的是用户从相机胶卷中拾取图像,然后使用该图像设置imageView。 So far so good. 到现在为止还挺好。 Now I need to save this image to my Database.So when the view loads next time I have that chosen image again. 现在我需要将该图像保存到数据库中,因此当视图下次加载时,我再次选择了该图像。 Problem is my image view is not being set with the image.Probably because its not being saved properly to my database. 问题是我的图像视图没有设置图像,可能是因为它没有正确保存到数据库中。 From what Ive read NSData is best to use and its what I'm using but no success. 从我读过的内容来看, NSData最好使用,而我正在使用,但没有成功。 Can someone help fix my problem? 有人可以帮助解决我的问题吗?

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

    [self dismissViewControllerAnimated:YES completion:nil];
    fsImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];
    fsUIImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    imgData = UIImagePNGRepresentation(fsUIImage);
    [self saveImageToDatabase];

}

------Here I save my image to the DB------- ------这里我将图像保存到数据库中------

-(void)saveImageToDatabase{

    [self openDB];

    sqlite3_stmt *newstatement;

    int originalTotalCount = sqlite3_total_changes(db);

    NSString *sql = [NSString stringWithFormat:@"UPDATE Annotation SET image = '%@' WHERE title ='%@'", imgData, fsTitleName];
    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &newstatement, nil) != SQLITE_OK) {
        NSLog(@"%s: prepare failed: %s", __FUNCTION__, sqlite3_errmsg(db));
    } else {
        if (sqlite3_step(newstatement) != SQLITE_DONE) {
            NSLog(@"%s: step failed: %s", __FUNCTION__, sqlite3_errmsg(db));
        } else {
            int rowsUpdated = sqlite3_total_changes(db) - originalTotalCount;

            NSString *message;

            if (rowsUpdated == 1)
                message = @"Updated one row";
            else if (rowsUpdated == 0)
                message = @"No rows updated";
            else
                message = [NSString stringWithFormat:@"Updated %d rows", rowsUpdated]; 

            NSLog(@"%@", message);

            sqlite3_step(newstatement);
        }

        sqlite3_finalize(newstatement);
    }
    sqlite3_close(db);

}

------Here I pull my image from the DB------- Gets called when viewLoads.. ------这里是我从数据库中拉出我的图像的-------当viewLoads被调用时。

-(void)setImage{

    [self openDB];

    NSString *sql = [NSString stringWithFormat:@"SELECT image FROM Annotation WHERE title = '%@'",fsTitleName];

    sqlite3_stmt *statement;

    if(sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK){

        int rc;
        if ((rc = sqlite3_step(statement)) == SQLITE_ROW) {
            char *field1 = (char *) sqlite3_column_text(statement, 0);
            NSString *field1Str = [[NSString alloc]initWithUTF8String:field1];
            imgData = [field1Str dataUsingEncoding:NSUTF8StringEncoding];
            [fsImageView setImage:[UIImage imageWithData: imgData]];

        } else if (rc != SQLITE_DONE) {
            NSLog(@"%s: sqlite3_step failed: %s", __FUNCTION__, sqlite3_errmsg(db));
        }
    } else {
        NSLog(@"%s: sqlite3_prepare_v2 failed: %s", __FUNCTION__, sqlite3_errmsg(db));
    }

    sqlite3_finalize(statement);
    sqlite3_close(db);


}

In your case your getting image from UIImagePicker successfully and converting it into NSData to be stored in sqlite, the only problem your facing is storing the NSData into sqlite. 在您的情况下,从UIImagePicker成功获取图像并将其转换为NSData以存储在sqlite中,您面临的唯一问题是将NSData存储到sqlite中。

Saving NSData into sqlite database requires it to be saved as bytes in sqlite, so either you store NSData in bytes or convert it into Base64 string and then strore the Base64 string in sqlite. 将NSData保存到sqlite数据库中要求将其保存为sqlite中的字节,因此,您可以将NSData存储为字节,或将其转换为Base64字符串,然后在sqlite中使用Base64字符串。

To store NSData in sqlite as bytes you can refer below links: 要将NSData作为字节存储在sqlite中,可以引用以下链接:

1) How to retrieve string from NSData stored in sqlite? 1) 如何从存储在sqlite中的NSData检索字符串?

2) Retrieve nsdata from sqlite stored in Blob data type for iPhone App 2) 从存储在iPhone应用程序的Blob数据类型中的sqlite中检索nsdata

To store NSData in sqlite as Base64 you can use below Base64 library which is very easy to use. 要将NSData存储在sqlite中作为Base64,可以在Base64库下面使用,该库非常易于使用。

https://github.com/nicklockwood/Base64 https://github.com/nicklockwood/Base64

Now to convert a NSData to Base64 just use below code: 现在要将NSData转换为Base64,只需使用以下代码:

NSString *aStrData = [theNSDataObject base64EncodedString];

And then after you fetch it from database convert back the Base64 string to NSData like below: 然后,从数据库中获取它之后,将Base64字符串转换回NSData,如下所示:

NSData *theNSDataObject = [aStrData base64DecodedData];

I prefer using Base64 string is a good way, so if in future if you want to send the image to any web service you can send it in base64 format also. 我更喜欢使用Base64字符串,这是一个好方法,因此,如果将来要将图像发送到任何Web服务,也可以以base64格式发送它。

// Use this Code for insertion //使用此代码进行插入

  NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO <Table Name> (Image) VALUES (?)"];

        const char *insert_stmt = [insertSQL UTF8String];

        if(sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL)== SQLITE_OK)
        {

            sqlite3_bind_blob( statement, 1, [imageData bytes],(unsigned int) [imageData length], SQLITE_TRANSIENT);
        }

// Use this Code for retrieving //使用此代码进行检索

if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {

        NSString *querySQL = [NSString stringWithFormat:
                              @"SELECT * FROM <Table Name>" ];
        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(contactDB,
                               query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(statement) == SQLITE_ROW)
            {


                int blobBytesLength = sqlite3_column_bytes(statement, 1);
                NSData *blobData = [[NSData alloc]initWithBytes:sqlite3_column_blob(statement, 1)length:blobBytesLength];

                UIImage *imagetest = [[UIImage alloc] initWithData:blobData];//this is your Image
          }
       }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM