title: Using Sqlite in iphone development: if i open the database in the init function, it's inaccessible in my other functions. Any ideas?
body: <p>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?</p>
  
  <p>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.</p>
  
  <p>My header:</p>
  
  <pre><code>#import &lt;Foundation/Foundation.h&gt;
  #include &lt;sqlite3.h&gt;
  
  
  @interface DataServices : NSObject {
      sqlite3 *db;
      int dbrc;
  }
  
  - (NSMutableArray *) recipeNames;
  
  @end
  </code></pre>
  
  <p>Implementation file:</p>
  
  <pre><code>#import "DataServices.h"
  #import "MenuMakerAppDelegate.h"
  #include &lt;sqlite3.h&gt;
  
  @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, &amp;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, &amp;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
  </code></pre>