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.
a source to share
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);
...
a source to share
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.
a source to share