Sqllite3 prepare input request in iphone programming

(BOOL) addticket {
    NSString *event=@"max";
    NSString *venue=@"tvm";
    sqlite3 *database;
    databaseName = @"smbhDB.sql";
    sqlite3_stmt *addStatement ;
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
    if(addStatement == nil) {   
        const char *sql ="insert into tickets (venue, event,) Values (?,?)";

        if(sqlite3_prepare_v2(database, sql, -1, &addStatement, NULL) != SQLITE_OK)
            NSAssert1(0, @"444 Error while creating add  statement. '%s'", sqlite3_errmsg(database));
    }

    sqlite3_bind_text(addStatement, 1, [venue UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStatement, 2, [event UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(addStatement))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));

    sqlite3_reset(addStatement);
...

      

This code doesn't work. Please someone can help me fix this. If anyone can post a sample code, please download.

-five


a source to share


3 answers


duplicate? Why can't I execute this code?



YOU MUST OPEN THE DATABASE before executing the statement

+3


a source


I'm not 100% sure because the error is not listed here, but it looks like it is addStatement

not initializing. Objective-C initializes all pointers to 0 when allocated on the stack? I know this won't work on Linux.

Maybe try this: sqlite3_stmt *addStatement = nil;

I have to wonder why you even check addStatement == nil

? There is no reason to check it as you must initialize it in every case.



In short, rewrite like this:

(BOOL) addticket {
    NSString *event=@"max";
    NSString *venue=@"tvm";
    sqlite3 *database;
    databaseName = @"smbhDB.sql";
    sqlite3_stmt *addStatement ;
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,  NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    const char *sql ="insert into tickets (venue, event,) Values (?,?)";

    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

    /* this is no longer conditional code */
    if(sqlite3_prepare_v2(database, sql, -1, &addStatement, NULL) != SQLITE_OK)
        NSAssert1(0, @"444 Error while creating add  statement. '%s'", sqlite3_errmsg(database));

    sqlite3_bind_text(addStatement, 1, [venue UTF8String], -1, SQLITE_TRANSIENT);
    sqlite3_bind_text(addStatement, 2, [event UTF8String], -1, SQLITE_TRANSIENT);

    if(SQLITE_DONE != sqlite3_step(addStatement))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));

    sqlite3_reset(addStatement);
...

      

+1


a source


Consider FMDB or Omni data like library. All the details are hidden behind a nice light abstract interface.

http://gusmueller.com/blog/archives/2008/03/fmdb_for_iphone.html

or

http://www.omnigroup.com/developer (OmniDataObjects)

Good luck.

+1


a source







All Articles