user1645721
user1645721

Reputation: 653

Convert captured image in to a separate png file, and insert that png file name as a string in to sqlite data base and retrieve it

In my iPhone app I need to capture a picture and save it in to the sqlite database.

 NSString *insertQuery = [NSString stringWithFormat:@"INSERT INTO ProfileTable (NAME, MOBILE, EMAIL, ProfilePICTURE) VALUES(?, ?, ?, ?)"];

                  const char *insert = [insertQuery UTF8String];
                  if(sqlite3_prepare_v2(contactsDB, insert, -1, &insertStatement, NULL) != SQLITE_OK) {
                        NSLog(@"Error while creating insert Statement");
                  }
                  else 
                  {
                        sqlite3_bind_text(insertStatement, 1, [name UTF8String], -1, SQLITE_TRANSIENT);
                        sqlite3_bind_text(insertStatement, 2, [mobile UTF8String], -1, SQLITE_TRANSIENT);
                        sqlite3_bind_text(insertStatement, 2, [email UTF8String], -1, SQLITE_TRANSIENT);


                        sqlite3_bind_blob(insertStatement, 4, [profilePic bytes], [contactImage length], NULL);




                  }
            }


// Same Query  for insert statement also

I saved that file in the form of blob type but that cause to occupy huge memory and causes to memory warnings.

So i have an idea that.

I want to save the captured image as a png file for suppose "image1.png" and insert that title "image1.png" as a varchar type and the retrieve that file having that name when we want to display.

any help how to do this

Upvotes: 0

Views: 211

Answers (3)

Siba Prasad Hota
Siba Prasad Hota

Reputation: 4789

Every time you can Create a Random String and Rename that image Which you capture to Randomly generated string.

NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";



    NSMutableString *randomString = [NSMutableString stringWithCapacity:6];

    for (int i=0; i<6; i++) 
      {
[randomString appendFormat: @"%C", [letters characterAtIndex: arc4random() % [letters length]]];
        }



NSString *fileName = [NSString stringWithFormat:@"%@.png",randomString];

Hope this will Help.

Upvotes: 1

Paresh Navadiya
Paresh Navadiya

Reputation: 38259

Add int counter in appDelegate.h file

Also add In application didFinishLaunchingWithOptions method:

counter = 0;
if(![[NSUserDefaults standardUserDefaults] integerForKey:@"ImageNumber"])
{
   [[NSUserDefaults standardUserDefaults] setInteger:counter ForKey:@"ImageNumber"]
}
else
{
   counter = [[NSUserDefaults standardUserDefaults] integerForKey:@"ImageNumber"];
}

Also add this method in appDelegate.h file

+ (NSString *) applicationDocumentsDirectory 
{    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
    return basePath;
}

Now when ever adding captured image in database firstly add int Doc Directory like this:

appDelegate = (appDelegate *)[[UIApplication sharedApplication] delegate];
NSString *strDocDirPath = [appDelegate applicationDocumentsDirectory];
NSString *fileName = [NSString stringWithFormat:@"Image%03d.png",appDelegate.counter];
strDocDirPath = [strDocDirPath stringByAppendingPathComponent:fileName];
NSData* imgdata = UIImagePNGRepresentation(yourCapturedImage);
[imgdata writeToFile:strDocDirPath atomically:YES];
appDelegate.counter ++;
[[NSUserDefaults standardUserDefaults] setInteger:appDelegate.counter ForKey:@"ImageNumber"];
//add in database with  fileName 

Retrieve like this:

 appDelegate = (appDelegate *)[[UIApplication sharedApplication] delegate];
NSString *strDocDirPath = [appDelegate applicationDocumentsDirectory];
strDocDirPath = [strDocDirPath stringByAppendingPathComponent:@"Image001.png"]; //use your database image name here 
 UIImage *img = [[UIImage alloc]initWithContentsOfFile:strDocDirPath];

Upvotes: 1

FluffulousChimp
FluffulousChimp

Reputation: 9185

Get the document directory (or other directory that you might want to store the images):

/**
 Returns the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

Store image as png:

NSURL *documentsDirURL = [self applicationDocumentsDirectory];
NSURL *fileURL = [documentsDirURL URLByAppendingPathComponent:@"some-image-name.png"];
NSData* data = UIImagePNGRepresentation(image);
[data writeToURL:fileURL atomically:YES];
NSString *filePath = [fileURL path];

// now save your filePath as string to sqlite

Note, you'll have to fill in details, such as where the appropriate directory is in the filesystem, a naming convention, generating filenames unless they exist already etc.

EDIT:

Here's some help with serial naming of the images. There are a lot of different solutions.

Create an entry in the NSUserDefaults with the key @"lastImageNumber". When you need a new image name:

NSInteger imageNumber = [[NSUserDefaults standardUserDefaults] integerForKey:@"lastImageNumber"] + 1;
NSString *imageName = [NSString stringWithFormat:@"image%05d.png",imageNumber];
// save the new imageNumber in the `NSUserDefaults`
[[NSUserDefaults standardUserDefaults] setInteger:imageNum ForKey:@"lastImageNumber"];

Upvotes: 1

Related Questions