1

Hello I have been trying to retrieve image from sql database named informationdb.sql but I am not able to,could anyone help with that.Here is my code

- (NSData*) LoadImagesFromSql
{
    NSData* data = nil;
    directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsDirectory = [directoryPaths objectAtIndex:0];
    NSString * databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"informationdb.sql"]];

    int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, SQLITE_OPEN_READWRITE , NULL);
    if (openDatabaseResult == SQLITE_OK) {
         const char* sqlite3Query = "SELECT PHOTO FROM PICTURES";
        int sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL);
    if( sqlite3Prepare == SQLITE_OK )
    {
        const char *myData = sqlite3_column_blob(sqlite3Statement, 1);
        int myDataSize = sqlite3_column_bytes(sqlite3Statement, 1);
        data = [NSData dataWithBytes:myData length:myDataSize];
        sqlite3_step(sqlite3Statement);
    }
         sqlite3_finalize(sqlite3Statement);
    }
    sqlite3_close(sqlite3DatabaseObject);
    return data;

}

Thank you.

19
  • Simple questions: Do you pass the two if test? What's wrong exactly with your code? Also, please name your method starting with a lower case. Commented Apr 11, 2017 at 12:24
  • @Simeryn Denis in data you got any return value or not Commented Apr 11, 2017 at 12:27
  • @simeryn please refer this link stackoverflow.com/questions/43339680/… Commented Apr 11, 2017 at 12:31
  • Possible duplicate of Image not store in sqlite Commented Apr 11, 2017 at 12:31
  • yes the if test was successful but "myData" is showing NULL. Commented Apr 11, 2017 at 12:32

2 Answers 2

2

first delete database in document directory than change all three method to my code

-(void)database
{

    directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsDirectory = [directoryPaths objectAtIndex:0];
    NSString * databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"informationdb.sql"]];
    NSLog(@"database path=%@",databasePath);
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:databasePath] == NO) {
        const char *dbPath = [databasePath UTF8String];
        if (sqlite3_open(dbPath, &sqlite3DatabaseObject)== SQLITE_OK) {
            char * errorMessage;
            const char *sqlite3Query = "CREATE TABLE IF NOT EXISTS  PICTURES (PHOTO BLOB,Id integer PRIMARY KEY)";
            if (sqlite3_exec(sqlite3DatabaseObject, sqlite3Query, NULL, NULL, &errorMessage)!= SQLITE_OK) {
                NSLog(@"failed = %@",sqlite3DatabaseObject);
            }
            sqlite3_close(sqlite3DatabaseObject);
        }else{
            NSLog(@"failed to create database");
        }
    }
}



- (void) SaveImagesToSql: (NSData*) imgData  {

    directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsDirectory = [directoryPaths objectAtIndex:0];
    NSString * databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"informationdb.sql"]];
    NSLog(@"database path=%@",databasePath);
    const char* sqlite3Query = "INSERT INTO PICTURES (PHOTO) VALUES (?)";
    int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, SQLITE_OPEN_READWRITE , NULL);
    if (openDatabaseResult == SQLITE_OK) {
        int sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, sqlite3Query, -1, &sqlite3Statement, NULL);
        if( sqlite3Prepare == SQLITE_OK ) {
            sqlite3_bind_blob(sqlite3Statement, 1, [imgData bytes], [imgData length], SQLITE_TRANSIENT);
            sqlite3_step(sqlite3Statement);
        }
        else
        {
            NSLog(@"Error is: %s", sqlite3_errmsg(sqlite3DatabaseObject));
        }
        sqlite3_finalize(sqlite3Statement);

    }
    else NSLog( @"Error is:  %s", sqlite3_errmsg(sqlite3DatabaseObject) );
    sqlite3_close(sqlite3DatabaseObject);
}


- (NSData*)LoadImagesFromSql
{
    NSData* data = nil;
    directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsDirectory = [directoryPaths objectAtIndex:0];
    NSString * databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"informationdb.sql"]];
    sqlite3_stmt *compiledStmt;
    sqlite3 *db;
    int i = 1;
    if(sqlite3_open([databasePath UTF8String], &db)==SQLITE_OK){
        NSString *insertSQL = [NSString stringWithFormat:@"SELECT PHOTO FROM PICTURES WHERE Id = %d",i];
        if(sqlite3_prepare_v2(db,[insertSQL cStringUsingEncoding:NSUTF8StringEncoding], -1, &compiledStmt, NULL) == SQLITE_OK) {
            while(sqlite3_step(compiledStmt) == SQLITE_ROW) {

                int length = sqlite3_column_bytes(compiledStmt, 0);
                data = [NSData dataWithBytes:sqlite3_column_blob(compiledStmt, 0) length:length];

                NSLog(@"Length : %lu", (unsigned long)[data length]);

//                if(imageData == nil)
//                    NSLog(@"No image found.");
//                else
//                    imgView.image = [UIImage imageWithData:imageData];
            }
        }
        sqlite3_finalize(compiledStmt);
    }
    sqlite3_close(db);
    return data;
}
Sign up to request clarification or add additional context in comments.

5 Comments

@Simeryn Denis check my answer
it says table doesn't exist.
no buddy still it's not working.I deleted these 3 methods and replace with your code. It's SAYING Error is: no such table: PICTURES
@SimerynDenis debug create table function and check PICTURES table create or not
2

solved it by this:

- (NSData*) LoadImagesFromSql
{
    directoryPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsDirectory = [directoryPaths objectAtIndex:0];
    NSString * databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"informationdb.sql"]];

    NSData* data = nil;
    //  int i=0;

    NSString* sqlite3Query = [NSString stringWithFormat:@"SELECT PHOTO FROM PICTURES "];

    int openDatabaseResult = sqlite3_open_v2([databasePath UTF8String], &sqlite3DatabaseObject, SQLITE_OPEN_READWRITE , NULL);
    if (openDatabaseResult == SQLITE_OK)
    {
        int sqlite3Prepare = sqlite3_prepare_v2(sqlite3DatabaseObject, [sqlite3Query UTF8String], -1, &sqlite3Statement, NULL);
        if( sqlite3Prepare == SQLITE_OK )
        {
            while (sqlite3_step(sqlite3Statement) == SQLITE_ROW) {
                const char *myData = sqlite3_column_blob(sqlite3Statement, 0);
                int myDataSize = sqlite3_column_bytes(sqlite3Statement, 0);
                data = [NSData dataWithBytes:myData length:myDataSize];
            }
            sqlite3_finalize(sqlite3Statement);
        }
    }
    sqlite3_close(sqlite3DatabaseObject);
    return data;

}

and updated viewWillAppear as :

-(void)viewWillAppear:(BOOL)animated{

    dbmClass = [[DBManager alloc]init];
    if (imgPic.image != nil) {
        imgPic.image = nil;
    }
    imgPic.image = [UIImage imageWithData:[dbmClass LoadImagesFromSql]];
    NSLog(@"%@",[dbmClass LoadImagesFromSql]);


}

2 Comments

in your code try to save 2 or more image than check.you does not get image in imageview
No it works i tried saving 2 images it works perfectly.The method every time gets the last image which I upload in the database.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.