1

I am unable to create sqlite database in my documents directory. Here is the code:

NSString *fileDir;
    NSArray *dirPaths;


//Get the documents directory

dirPaths = NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask, YES);

fileDir = [dirPaths objectAtIndex:0];

// Build the database path
databasePath = [[NSString alloc]initWithString:[fileDir stringByAppendingPathComponent:@"student.sql"]];

NSFileManager *fileMgr = [NSFileManager defaultManager];

    if([fileMgr fileExistsAtPath:databasePath] == NO)
    {
        const char *dbPath = [databasePath UTF8String];

        if (sqlite3_open(dbPath, &database) == SQLITE_OK)
        {
            char *errMsg;
            const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS(ID INTEGER PRIMARY KEY , NAME TEXT, ADDRESS TEXT, MOBILE INTEGER)";
            if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) {
               _status.text = @"Failed to create table";                
            }
            sqlite3_close(database);

        }
        else
        {

            _status.text = @"Failed to open/create database";
        }
    }

I have debug the code and found that the compiler is not going under this condition. sqlite3_open(dbPath, &database) == SQLITE_OK

I don't know what i am doing wrong. Any help will be appreciated...

Thanks,

4
  • Uh, what return code is sqlite3_open returning? And what does sqlite3_errmsg report? Commented Dec 19, 2013 at 12:36
  • (BTW, assuming you really are "debugging" to find out where it's failing, the compiler is not involved.) Commented Dec 19, 2013 at 12:39
  • i think you have to change file extension i.e. student.sqlite. just try Commented Dec 19, 2013 at 12:41
  • Print out the path where you're trying to open and make sure it exists. (I've never seen NSDemoApplicationDirectory used.) Commented Dec 19, 2013 at 12:46

3 Answers 3

1

Check you code to get dirPath, you are getting right path or not, I used following way in my code and its working for me :

dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// dirPaths = NSSearchPathForDirectoriesInDomains(NSDemoApplicationDirectory, NSUserDomainMask,YES);
  fileDir = dirPaths[0];

// Build the database path
databasePath = [[NSString alloc]initWithString:[fileDir stringByAppendingPathComponent:@"student.sqlite"]];
Sign up to request clarification or add additional context in comments.

Comments

1

this is how i managed it.

DataBaseAccess.m

static sqlite3 *database=nil;

-(id)init
{
if(self=[super init])
{
    self.user_data=@"user_data.db";
}
return self;
}


-(void)createUserDataDatabase
{
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:user_data];
success = [fileManager fileExistsAtPath:writableDBPath];
if (success) return;

// construct database from external ud.sql

NSString *filePath=[[NSBundle mainBundle]pathForResource:@"ud" ofType:@"sql"];
NSString *sqlStatement=[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error];
if(sqlite3_open([writableDBPath UTF8String], &database)==SQLITE_OK)
{
    sqlite3_exec(database, [sqlStatement UTF8String], NULL, NULL, NULL);
    sqlite3_close(database);
}
}

Your external sql file must contain the sql queries:

CREATE TABLE quantityInSubCountries ( 
refID    INT,
quantity INT 
);

CREATE TABLE quantityInSubRegions ( 
refID    INT,
quantity INT 
); ....

Hope it will help.

Comments

0

This is common methods used for Database

    -(void)updateTable:(NSString *)tableName setname:(NSString *)Name setImagePath:(NSString *)imagePath whereID:(NSInteger)rid{

        NSString *sqlString=[NSString stringWithFormat:@"update %@ set name='%@' where id=%ld",tableName,Name,rid];

        char *error;
        if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
            [self closeDatabase];
            NSLog(@"Faield to update");
        }
        else{

            NSLog(@"update successfully");
        }
    }

    -(void)deleteFrom:(NSString *)tablename whereName:(NSInteger )rid {
       NSString *sqlString=[NSString stringWithFormat:@"delete from %@ where id=%ld",tablename,(long)rid];

        char *error;
        if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
            [self closeDatabase];
            NSLog(@"faield to Delete");
        }
        else{

            NSLog(@"Deleted successfully");
        }
    }

    -(void)insertInTable:(NSString *)tableName withName:(NSString *)name withImagePath:(NSString *)imagePath
    {


        NSString *sqlString=[NSString stringWithFormat:@"insert into %@(name,path)values('%@','%@')",tableName,name,imagePath];
        char *error;
        if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
            [self closeDatabase];
            NSLog(@"Failed to insert");

        }
        else{
            NSLog(@"Inserted succesfully");

        }

    }

    -(NSString *)path
    {
        NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentDir=[paths objectAtIndex:0];
        return [documentDir stringByAppendingPathComponent:@"Storage.db"];

    }
    -(void)open{
        if(sqlite3_open([[self path] UTF8String], &db)!=SQLITE_OK)
        {
            sqlite3_close(db);
            NSLog(@"your database table has been crash");
        }
        else{
            NSLog(@"Database open successfully");
        }

    }
    -(void)closeDatabase
    {
        sqlite3_close(db);
        NSLog(@"Database closed");
    }

    -(void)copyFileToDocumentPath:(NSString *)fileName withExtension:(NSString *)ext{
        NSString *filePath=[self path];
        NSFileManager *fileManager=[NSFileManager defaultManager];
        if (![fileManager fileExistsAtPath:filePath]) {
            NSString *pathToFileInBundle=[[NSBundle mainBundle] pathForResource:fileName ofType:ext];
            NSError *err=nil;
            BOOL suc=[fileManager copyItemAtPath:pathToFileInBundle toPath:filePath error:&err];
            if (suc) {
                NSLog(@"file copied successfully");
            }
            else
            {
                NSLog(@"faield to copied");
            }
        }
        else
        {
            NSLog(@"File allready present");
        }

    }


    -(NSMutableArray *)AllRowFromTableName:(NSString *)tableName{
        NSMutableArray *array=[[NSMutableArray alloc] init];
        NSString *sqlString=[NSString stringWithFormat:@"select *from %@",tableName];
        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(db, [sqlString UTF8String], -1, &statement, nil)==SQLITE_OK) {
            while (sqlite3_step(statement)==SQLITE_ROW) {
              Database *tempDatabase=[[Database alloc] init];
              tempDatabase.Hid=sqlite3_column_int(statement, 0);
              tempDatabase.Hname =[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
              tempDatabase.Hpath=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(statement, 2)];
              [array addObject:tempDatabase];
            }
        }
        return array;
    }

-(void)test
{

//Pet photos
    NSString *sqlString=[NSString stringWithFormat:@"create table if not exists StorageTable(id integer primary key autoincrement,name text,path text)"];

    char *error;
    if (sqlite3_exec(db, [sqlString UTF8String], NULL, NULL, &error)!=SQLITE_OK) {
        [self closeDatabase];
        NSLog(@"Faield to blanck 1 %s",error);
    }
    else{
        NSLog(@"Test On StorageTable Database successfully");
    }
}

Comments

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.