title: iPhone - Trying to Copy sqlite Database to Documents Directory - copies blank version
body: <p>I have an sqlite database called 'ProductDatabase.sql', which I have copied into my applications project directory:</p>
  
  <p>/Users/jacknutkins/Documents/TabbedDietApp/TabbedDietApp/ProductDatabase.sql</p>
  
  <p>In the applications app delegate class I have this piece of code:</p>
  
  <pre><code>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  {
      //Set-up some globals
      m_DatabaseName = @"ProductDatabase.sql";
  
      //Get the path to the documents directory and append the databaseName
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
      NSString *documentsDirectory = [paths objectAtIndex:0];
      m_DatabasePath = [documentsDirectory stringByAppendingPathComponent:@"ProductDatabase.sql"];
  
      //Execute the "checkAndCreateDatabase" function
      [self checkAndCreateDatabase];
  
      //Query the databse for all animal records and construct the "animals" array
      [self readProductsFromDatabase];
  
  ....
  </code></pre>
  
  <p>At this point: </p>
  
  <p>m_DatabasePath = '/Users/jacknutkins/Library/Application Support/iPhone Simulator/5.0/Applications/6D5BBE3A-BC9A-4C44-B089-FABA27CFFF4B/Library/ProductDatabase.sql'</p>
  
  <p>Here is the code for the other 2 methods:</p>
  
  <pre><code>- (void) checkAndCreateDatabase {
      NSError * error;
  
      //Check if the database has been saved to the users phone, if not then copy it over
      BOOL l_Success;
  
      //Create a file manager object, we will use this to check the status
      //of the databse and to copy it over if required
      NSFileManager *l_FileManager = [NSFileManager defaultManager];
  
      //Check if the database has already been created in the users filesystem
      l_Success = [l_FileManager fileExistsAtPath:m_DatabasePath];
  
      //If the database already exists then return without doing anything
  
      if(l_Success)
          return;
  
      //If not then proceed to copy the database from the application to the users filesystem
  
      //Get the path to the database in the application package
      NSString *l_DatabasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:m_DatabaseName];
  
      //Copy the database from the package to the usrrs filesystem
      [l_FileManager copyItemAtPath:l_DatabasePathFromApp toPath:m_DatabasePath error:&amp;error];
  
  }
  </code></pre>
  
  <p>If I perform some NSLogs here:</p>
  
  <p><strong>l_DatabasePathFromApp</strong> = /Users/jacknutkins/Library/Application Support/iPhone Simulator/5.0/Applications/6D5BBE3A-BC9A-4C44-B089-FABA27CFFF4B/TabbedDietApp.app/ProductDatabase.sql</p>
  
  <p>and:</p>
  
  <p><strong>error</strong> = Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed. (Cocoa error 260.)" UserInfo=0x6b6d060 {NSFilePath=/Users/jacknutkins/Library/Application Support/iPhone Simulator/5.0/Applications/6D5BBE3A-BC9A-4C44-B089-FABA27CFFF4B/TabbedDietApp.app/ProductDatabase.sql, NSUnderlyingError=0x6b6cfa0 "The operation couldn’t be completed. No such file or directory"}</p>
  
  <p>I'm not sure what file it is it can't find here..</p>
  
  <pre><code>- (void) readProductsFromDatabase {
      //Init the products array
      m_Products = [[NSMutableArray alloc] init];
      NSLog(@"%@", m_DatabasePath);
      //Open the database from the users filessystem
      if(sqlite3_open([m_DatabasePath UTF8String], &amp;database) == SQLITE_OK) {
          //Set-up the SQL statement and compile it for faster access
          const char *sqlStatement = "select * from products";
          sqlite3_stmt *compiledStatement;
  
          if(sqlite3_prepare_v2(database, sqlStatement, -1, &amp;compiledStatement, NULL) == SQLITE_OK)
          {
              NSLog(@"Success..");
              //Loop through the results and add them to the feeds array
              while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                  //Read the data from the results row
                  NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                  NSString *aCategory = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                  NSString *aCalories = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                  NSString *aFat = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];
                  NSString *aSaturates = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
                  NSString *aSugar = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)];
                  NSString *aFibre = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 7)];
                  NSString *aSalt = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 8)];
                  NSString *aImageURL = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 9)];
                  NSLog(@"Delegate");
                  NSString *aNote = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 10)];
                  NSUInteger myInt = sqlite3_column_int(compiledStatement, 11);
                  NSString *aServes = [NSString stringWithFormat:@"%d", myInt];
  
                  //Create a new animal object with the data from the database
                  Product *l_Product = [[Product alloc] initWithName:aName category:aCategory calories:aCalories fat:aFat saturates:aSaturates sugar:aSugar fibre:aFibre salt:aSalt imageURL:aImageURL note:aNote serves:aServes];
  
                  //Add the animal object to the animals array
                  [m_Products addObject:l_Product];
  
              }
          }
          //Release the compiled statement from memory
          sqlite3_finalize(compiledStatement);
  
      }
      sqlite3_close(database);
  
  }
  </code></pre>
  
  <p>database is declared in the .h file as follows:</p>
  
  <pre><code>//Setup the database object
      sqlite3 *database;
  </code></pre>
  
  <p>In the above method, the line:</p>
  
  <pre><code>if(sqlite3_prepare_v2(database, sqlStatement, -1, &amp;compiledStatement, NULL) == SQLITE_OK)
  </code></pre>
  
  <p>does not evaluate to SQLITE_OK, because the database I try to copy to the documents directory is blank.</p>
  
  <p>I have tried cleaning and building, deleting the blank copy of the database and re-running etc but it continues to copy a blank database every time.</p>
  
  <p>I've googled this several times and I've tried everything I can find with no success..</p>
  
  <p>Any help would be hugely appreciated.</p>
  
  <p>Jack</p>
  
  <p><strong>EDIT</strong></p>
  
  <p>If I perform 'select * from products' from the terminal window on the database in the project directory I return the expected results.</p>