Using Sqlite in iphone development: if i open the database in the init function, it's inaccessible in my other functions. Any ideas?
I'm trying to use sqlite in a 'data services' class like below. I keep getting an error code 1 when calling 'sqlite3_prepare_v2'. The logs certainly back up that the database is getting opened before my recipeNames function is called. I'm so stumped! Is it a memory management thing with the sqlite3 *db ? Eg is it getting freed when i don't want it to?
I'm certain the code is OK otherwise, because if i put the sqlite_open in the recipeNames function, it works great. It's just if i try to open it in the init method it fails. Thanks a lot guys.
My header:
#import <Foundation/Foundation.h>
#include <sqlite3.h>
@interface DataServices : NSObject {
sqlite3 *db;
int dbrc;
}
- (NSMutableArray *) recipeNames;
@end
Implementation file:
#import "DataServices.h"
#import "MenuMakerA开发者_如何学运维ppDelegate.h"
#include <sqlite3.h>
@implementation DataServices
- (id)init {
[super init];
// my init stuff here
// Get the database name
const char *dbPathUtf8 = [((MenuMakerAppDelegate*)[UIApplication sharedApplication].delegate).dbFilePath UTF8String];
// Open the database
NSLog(@"opening db");
sqlite3_open (dbPathUtf8, &db);
NSLog(@"opened db");
return self;
}
- (void)dealloc {
// My dealloc stuff here
NSLog(@"Closing DB");
sqlite3_close(db);
[super dealloc];
}
- (NSMutableArray *) recipeNames {
// Create the empty array to return
NSMutableArray *arr = [[[NSMutableArray alloc] init] autorelease];
// The SQL
NSString *sql = @"select recipe from recipes";
const char *sqlUtf8 = [sql UTF8String];
// Make the prepared statement (like C# SqlCommand)
sqlite3_stmt *dbps;
dbrc=sqlite3_prepare_v2(db, sqlUtf8, -1, &dbps, NULL); // FAILS HERE !!!
if (dbrc) NSLog(@"Prepare!!! %d", dbrc);
// Loop thru rows
while (sqlite3_step(dbps) == SQLITE_ROW) {
NSString *recipe = [NSString stringWithUTF8String:(char*)sqlite3_column_text(dbps,0)];
[arr addObject:recipe];
}
// Get rid of the command
sqlite3_finalize(dbps);
// Return the array that was autoreleased before
return arr;
}
@end
On a hunch:
NSLog(@"opening db %s", dbPathUtf8);
int result = sqlite3_open(dbPathUtf8, &db);
NSLog(@"sqlite3_open returned %d", result);
I'm betting that dbPathUtf8 is null and that sqlite3_open is returning an error. 1 is SQLITE_ERROR (SQL error or missing database), which probably means db
is NULL.
精彩评论