Alsmayer
Alsmayer

Reputation: 256

insert sqlite statement successful but no data added to database

I have an application that uses sqlite database. I successfully retrieved all data from database but when I try to insert data to the database the code is correct and no problem with debugging. However, when I check the database, no new row are added. even if I use the (sqlite3_last_insert_rowid) method I always get 0! I have tried many solutions provided here to similar problems as mine but had no luck. Most of the solutions were mentioning that the database directory path should be writable and I used the snippets of code they provided but the problem remains.

here is my code for the insert to the database:

-(void)openConnection
{
    paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    documentsDir = [paths objectAtIndex:0];
    dbPath = [documentsDir stringByAppendingPathComponent:@"databaseFile.sqlite"];
    NSLog(@"%@",dbPath);
    fileManager = [NSFileManager defaultManager];


BOOL success = [fileManager fileExistsAtPath:dbPath];

if (success)
    NSLog(@"we have the database");
else
{

    NSLog(@"we have no database");
    defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"TLCWorkshopsApp.sqlite"];
    BOOL moved = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:nil];
    if (moved)
        NSLog(@"database copied");

}

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
{
    NSLog(@"OPENED DB");
    void *v = NULL;
    char *errmsg;
    const char *sq = "PRAGMA foreign_keys = NO";
    if (sqlite3_exec(database, sq , 0, v, &errmsg)!= SQLITE_OK) {
        NSLog(@"faild to set the foreign_keys pargam");
    }

}
else
    NSLog(@"error in database");

}

-(void)addWorksopWithTitle:(NSString *)title presenters:(NSMutableArray *)presenters date:(NSString *)date time:(NSString *)time bld:(NSString *)bld floor:(int)floor room:(NSString *)room manadatory:(BOOL)manadatory
{
    [self openConnection];
    const char *encodeSqlStatement = "insert into Workshop (wid,title,manadatory,date,time,bld,floor,room) values(null,?,?,?,?,?,?,?)";
    //end of edited code
    sqlite3_stmt *compileStatement1;
    int success;
    if (sqlite3_prepare_v2(database, encodeSqlStatement, -1, &compileStatement1, NULL) == SQLITE_OK)
    {
        NSLog(@"insert WS prepair");
        sqlite3_bind_text(compileStatement1, 1, [title UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_int(compileStatement1, 2, manadatory);
        sqlite3_bind_text(compileStatement1, 3, [date UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compileStatement1, 4, [time UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(compileStatement1, 5, [bld UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_int(compileStatement1, 6, floor);
        sqlite3_bind_text(compileStatement1, 7, [room UTF8String], -1, SQLITE_TRANSIENT);


    success = sqlite3_step(compileStatement1);


}else
{
    NSLog(@"insert WS NOT success");
    NSAssert1(0, @"Error: failed to prepare statement with message '%s'. ", sqlite3_errmsg(database));

}


sqlite3_finalize(compileStatement1);

if (success == SQLITE_ERROR)
{
    NSAssert1(0, @"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(database));
}


[self closeConnection];

}

Upvotes: 1

Views: 1214

Answers (1)

Alsmayer
Alsmayer

Reputation: 256

after days of working and searching I have finally found an answer to my question and thought of sharing it with you. I was not paying attention to the message I receive from the sqlite3_step statement. I received (19) which means SQLITE_CONSTRAINT which means there is a problem with constraints in the table I am trying to insert data to. the problem was that my primary key in the table was a composition of two foreign keys. I needed to have an independent primary key for some reason. so, I created the table again and added a primary key column. that was all :)

Upvotes: 1

Related Questions