0

In my app I have to implement a form which works offline as well.

There are some images to be uploaded in the form. The way I currently implement is by first saving the image in Application directory. And saving it's file location in database then delete it when I upload. This process is too lengthy and mind boggling. What do you guys suggest? Should I save it the image as Data in sqlite instead or this approach i took is better.

This is how I implemented it:

ALAssetsLibrary *lib=[ALAssetsLibrary new];
for (int i=0; i<assets.count; i++) {
        ALAsset *asset=assets[i];

        NSString *baseDir=[fileMgr GetDocumentDirectory];
        //STORING FILE INTO LOCAL
        [lib assetForURL:asset.defaultRepresentation.url
             resultBlock:^(ALAsset *asset){
                 ALAssetRepresentation *repr = [asset defaultRepresentation];
                 CGImageRef cgImg = [repr fullResolutionImage];
                 NSString *fname = repr.filename;
                 UIImage *img = [UIImage imageWithCGImage:cgImg];
                 NSData *data = UIImagePNGRepresentation(img);
                 [data writeToFile:[baseDir stringByAppendingPathComponent:fname]
                        atomically:YES];
                 //FOR LOCAL URL OF THE IMAGE
                 NSString *imageURL = [baseDir stringByAppendingPathComponent:fname];

                 NSLog(@"%@ URL OF IMAGE ",imageURL);

                       }

            failureBlock:^(NSError *error){
            }];
    }
    NSLog(@"COPIED %lu FILE INTO LOCAL MEMORY",(unsigned long)assets.count);
Prajeet Shrestha
  • 7,978
  • 3
  • 34
  • 63

1 Answers1

0

yes you can save the image in database as a string. create an catagory NSString+NSStringAdditions.h like this.

//
//  NSString+NSStringAdditions.h
//  RemoteControl
//
//  Created by Bhaskar on 09/05/14.
//  Copyright (c) 2014 Bhaskar. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface NSString (NSStringAdditions)
+ (NSString *) base64StringFromData:(NSData *)data length:(int)length;
+ (NSData *) base64DataFromString:(NSString *)string;
@end

//
//  NSString+NSStringAdditions.m
//  RemoteControl
//
//  Created by Bhaskar on 09/05/14.
//  Copyright (c) 2014 Bhaskar. All rights reserved.
//

#import "NSString+NSStringAdditions.h"

static char base64EncodingTable[64] = {
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
};

@implementation NSString (NSStringAdditions)

+ (NSString *) base64StringFromData: (NSData *)data length: (int)length {
    unsigned long ixtext, lentext;
    long ctremaining;
    unsigned char input[3], output[4];
    short i, charsonline = 0, ctcopy;
    const unsigned char *raw;
    NSMutableString *result;

    lentext = [data length];
    if (lentext < 1)
        return @"";
    result = [NSMutableString stringWithCapacity: lentext];
    raw = [data bytes];
    ixtext = 0;

    while (true) {
        ctremaining = lentext - ixtext;
        if (ctremaining <= 0)
            break;
        for (i = 0; i < 3; i++) {
            unsigned long ix = ixtext + i;
            if (ix < lentext)
                input[i] = raw[ix];
            else
                input[i] = 0;
        }
        output[0] = (input[0] & 0xFC) >> 2;
        output[1] = ((input[0] & 0x03) << 4) | ((input[1] & 0xF0) >> 4);
        output[2] = ((input[1] & 0x0F) << 2) | ((input[2] & 0xC0) >> 6);
        output[3] = input[2] & 0x3F;
        ctcopy = 4;
        switch (ctremaining) {
            case 1:
                ctcopy = 2;
                break;
            case 2:
                ctcopy = 3;
                break;
        }

        for (i = 0; i < ctcopy; i++)
            [result appendString: [NSString stringWithFormat: @"%c", base64EncodingTable[output[i]]]];

        for (i = ctcopy; i < 4; i++)
            [result appendString: @"="];

        ixtext += 3;
        charsonline += 4;

        if ((length > 0) && (charsonline >= length))
            charsonline = 0;
    }     
    return result;
}

+ (NSData *)base64DataFromString: (NSString *)string
{
    unsigned long ixtext, lentext;
    unsigned char ch, inbuf[4], outbuf[3];
    short i, ixinbuf;
    Boolean flignore, flendtext = false;
    const unsigned char *tempcstring;
    NSMutableData *theData;

    if (string == nil)
    {
        return [NSData data];
    }

    ixtext = 0;

    tempcstring = (const unsigned char *)[string UTF8String];

    lentext = [string length];

    theData = [NSMutableData dataWithCapacity: lentext];

    ixinbuf = 0;

    while (true)
    {
        if (ixtext >= lentext)
        {
            break;
        }

        ch = tempcstring [ixtext++];

        flignore = false;

        if ((ch >= 'A') && (ch <= 'Z'))
        {
            ch = ch - 'A';
        }
        else if ((ch >= 'a') && (ch <= 'z'))
        {
            ch = ch - 'a' + 26;
        }
        else if ((ch >= '0') && (ch <= '9'))
        {
            ch = ch - '0' + 52;
        }
        else if (ch == '+')
        {
            ch = 62;
        }
        else if (ch == '=')
        {
            flendtext = true;
        }
        else if (ch == '/')
        {
            ch = 63;
        }
        else
        {
            flignore = true;
        }

        if (!flignore)
        {
            short ctcharsinbuf = 3;
            Boolean flbreak = false;

            if (flendtext)
            {
                if (ixinbuf == 0)
                {
                    break;
                }

                if ((ixinbuf == 1) || (ixinbuf == 2))
                {
                    ctcharsinbuf = 1;
                }
                else
                {
                    ctcharsinbuf = 2;
                }

                ixinbuf = 3;

                flbreak = true;
            }

            inbuf [ixinbuf++] = ch;

            if (ixinbuf == 4)
            {
                ixinbuf = 0;

                outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
                outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
                outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);

                for (i = 0; i < ctcharsinbuf; i++)
                {
                    [theData appendBytes: &outbuf[i] length: 1];
                }
            }

            if (flbreak)
            {
                break;
            }
        }
    }

    return theData;
}


@end
BHASKAR
  • 1,201
  • 1
  • 9
  • 20
  • Why is using a string better than using a blob? – trojanfoe Aug 21 '14 at 07:28
  • i dont have an idea about blob so i did this. if you give some example about blob then really thaks to you – BHASKAR Aug 21 '14 at 07:32
  • 1
    Using a string is not necessary and using a blob will save a great deal of space and time as it avoids encoding/decoding using BASE64 (see [this question](http://stackoverflow.com/questions/5039343/save-image-data-to-sqlite-database-in-iphone)). I would still prefer to leave the image on disk and store just the filename, however, which will be quicker still. – trojanfoe Aug 21 '14 at 07:42
  • yes save image in disk is faster than save in database but he want to save in database so i tell this. – BHASKAR Aug 21 '14 at 08:37
  • The OP doesn't know what he wants; he's asking if saving the image to database is an option, which of course is, but won't be any better. If the OP finds managing images on disk and entries in the database "mind boggling" then storing images in the database doesn't really make a great deal of difference, I reckon. – trojanfoe Aug 21 '14 at 08:40
  • trojanfoe how can i contact u? :) – Prajeet Shrestha Aug 21 '14 at 09:00
  • I actually pulled the image to the application directory because there was a possibility that the user might delete it from the library sometimes later in which case the link in the database wouldn't be useful. – Prajeet Shrestha Aug 21 '14 at 09:03