【问题标题】:image was taken by UIImagePickerControllerSourceTypeCamera how to save it in database in ios图像由 UIImagePickerController SourceType Camera 拍摄,如何将其保存在 ios 的数据库中
【发布时间】:2015-03-09 05:46:41
【问题描述】:

在 .m 中编码

-(IBAction) getPhoto:(id) sender {
    picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

} else {
    if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
        UIAlertView *noCameraAlert = [[UIAlertView alloc] initWithTitle:@"Error"
                                                                message:@"You don't have a camera for this device" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];

        //shows above alert if there's no camera
        [noCameraAlert show];
    }else{
        picker.sourceType    = UIImagePickerControllerSourceTypeCamera;
        picker.allowsEditing = YES;
        picker.delegate      = self;
    }
}
[self presentViewController:picker animated:YES completion:nil];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
     UIImage *img     = [info objectForKey:UIImagePickerControllerOriginalImage];
img              = [info valueForKey:UIImagePickerControllerEditedImage];
self.imageView.image  = img;
imagData         = UIImagePNGRepresentation(img);
[picker dismissViewControllerAnimated:YES completion:nil];
}

图像现在放置在图像视图中,我如何将图像保存在数据库中

我已经有数据库来插入数据 插入:

NSMutableArray *listItemsarr = [[NSMutableArray alloc] init];
        if([listItemsarr count]==0){
            NSString *insertQry=@"INSERT INTO selection_tbl (expenses_value,category,date,payment,description) VALUES(?,?,?,?,?)";
            sqlite3_stmt *stmt=[DB OpenSQL:[insertQry UTF8String]];
            if(stmt !=nil)
            {
                sqlite3_bind_text(stmt,1, [dataTextfield.text UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmt,2, [[selectionarray objectAtIndex:0]  UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmt,3, [[selectionarray objectAtIndex:1]  UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmt,4, [[selectionarray objectAtIndex:2]  UTF8String], -1, SQLITE_TRANSIENT);
                sqlite3_bind_text(stmt,5, [[selectionarray objectAtIndex:3]  UTF8String], -1, SQLITE_TRANSIENT);


                sqlite3_step(stmt);
            }
            sqlite3_finalize(stmt);
            [DB CloseSQL];

以下编码用于更新数据库值 更新:

NSInteger proeditid = [primarykeyID integerValue];
        NSString *updateQry=@"update selection_tbl set expenses_value=?,category=?,date=?,payment=?,description=? where expenses_id=?";
        sqlite3_stmt *stmt=[DB OpenSQL:[updateQry UTF8String]];
        if(stmt !=nil)
        {
            sqlite3_bind_text(stmt,1, [dataTextfield.text UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(stmt,2, [[selectionarray objectAtIndex:0] UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(stmt,3, [[selectionarray objectAtIndex:1] UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(stmt,4, [[selectionarray objectAtIndex:2] UTF8String], -1, SQLITE_TRANSIENT);
            sqlite3_bind_text(stmt,5, [[selectionarray objectAtIndex:3] UTF8String], -1, SQLITE_TRANSIENT);


            sqlite3_bind_int(stmt,6, (int)proeditid);
            sqlite3_step(stmt);
        }
        sqlite3_finalize(stmt);
        [DB CloseSQL];

【问题讨论】:

  • 但是你能告诉我如何将 UIImagePickerControllerSourceTypeCamera 拍摄的图像单独添加到数据库中吗?
  • 顺便说一下,正确使用sqlite3_bind_xxx 函数的三个快照。很多人错误地使用stringWithFormat 来构建他们的SQL,所以很高兴看到有人正确地将值绑定到? 占位符。干得好。

标签: ios objective-c xcode uiimage uiimagepickercontroller


【解决方案1】:

有两个问题:

  1. 如何获取图片的NSData表示?

  2. 如何将NSData 表示保存在 SQLite 数据库中?

    要将此NSData 保存在您的数据库中,然后使用sqlite3_bind_blob。该过程与您之前与我们共享的sqlite3_bind_xxx 函数非常相似。使用NSDatabytes 方法访问指向缓冲区的C 样式指针,并将其传递给sqlite3_bind_blob

请注意,在 SQLite 数据库中保存完整尺寸的图像是出了名的低效。 SQLite 不能很好地处理大块。通常,人们更愿意将NSData 保存到设备永久存储的Documents 文件夹中的文件中,然后将该文件的path 保存在数据库中。

【讨论】:

  • 现在看看我的问题希望现在很容易理解
  • 将代码放在问题中而不是 cmets 会好得多。谢谢。我希望我的回答同样清楚:首先获取图像的NSData 表示(使用我上面讨论的这两种技术中的任何一种),然后使用生成的NSDatabyteslength 方法并将它们传递给sqlite3_bind_blob 函数。
  • 肯定先生很快就会这样做非常感谢您的回复@Rob
【解决方案2】:

在代码中添加以下行,将图像添加到数据库中

 sqlite3_bind_blob(stmt,6, [imagData bytes], (unsigned)[imagData length], SQLITE_TRANSIENT);

最终代码如下所示:

NSMutableArray *listItemsarr = [[NSMutableArray alloc] init];

            if([listItemsarr count]==0){
                NSString *insertQry=@"INSERT INTO selection_tbl (expenses_value,category,date,payment,description,image) VALUES(?,?,?,?,?,?)";
                sqlite3_stmt *stmt=[DB OpenSQL:[insertQry UTF8String]];
                if(stmt !=nil)
                {
                    sqlite3_bind_text(stmt,1, [dataTextfield.text UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(stmt,2, [[selectionarray objectAtIndex:0]  UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(stmt,3, [dateString  UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(stmt,4, [[selectionarray objectAtIndex:2]  UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_text(stmt,5, [[selectionarray objectAtIndex:3]  UTF8String], -1, SQLITE_TRANSIENT);
                    sqlite3_bind_blob(stmt,6, [imagData bytes], (unsigned)[imagData length], SQLITE_TRANSIENT);

                    sqlite3_step(stmt);
                }
                sqlite3_finalize(stmt);
                [DB CloseSQL];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2019-05-20
    • 2014-01-14
    • 2018-07-11
    相关资源
    最近更新 更多