¿Cómo copiar la base de datos sqlite cuando se inicia la aplicación en iOS?

Quiero copiar mi base de datos sqlite desde la ubicación de la base de datos con las últimas actualizaciones a mi aplicación iOS cada vez que la lance.

¿Hay alguna forma de hacerlo?

puede agregar los siguientes métodos a su appdelegate

- (void) copyDatabaseIfNeeded { //Using NSFileManager we can perform many file system operations. NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; NSString *dbPath = [self getDBPath]; BOOL success = [fileManager fileExistsAtPath:dbPath]; if(!success) { NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.sqlite"]; success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; if (!success) NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); } } - (NSString *) getDBPath { //Search for standard documents using NSSearchPathForDirectoriesInDomains //First Param = Searching the documents directory //Second Param = Searching the Users directory and not the System //Expand any tildes and identify home directories. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); NSString *documentsDir = [paths objectAtIndex:0]; //NSLog(@"dbpath : %@",documentsDir); return [documentsDir stringByAppendingPathComponent:@"database.sqlite"]; } 

y llame a este método en su finalización con el método de inicio [self copyDatabaseIfNeeded]; espero que esto ayude

utilice el siguiente código para hacer frente a la base de datos cuando se inicia la aplicación

en tu appdelegate.m

en

 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ [self getdatabase]; return YES; } 

y agregue la función siguiente en su appdelegate.m

 -(void)getdatabase { BOOL success; NSFileManager *filemanager = [NSFileManager defaultManager]; NSError *error; NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *DBPath = [pathArray objectAtIndex:0]; NSString *writableDBPath = @""; writableDBPath = [DBPath stringByAppendingPathComponent:@"xyz.sqlite"]; NSLog(@"writableDBPath:%@",writableDBPath); success = [filemanager fileExistsAtPath:writableDBPath]; if (!success) { NSString *defaultDBpath = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"xyz.sqlite"]; success = [filemanager copyItemAtPath:defaultDBpath toPath:writableDBPath error:&error]; if (!success) { NSAssert(0, @"failed to copy database at path with message '%@'.",[error localizedDescription]); } } NSLog(@"111writableDBPath:%@",writableDBPath); } 

prueba este:

 NSArray *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *strDocDirectory = [docPath objectAtIndex:0]; self.strDatabasePath = [strDocDirectory stringByAppendingPathComponent:YOUR_DB]; NSFileManager *filemgr = [NSFileManager defaultManager]; if ([filemgr fileExistsAtPath: self.strDatabasePath ] == NO) { const char *dbpath = [self.strDatabasePath UTF8String]; sqlite3 *contactDB; if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) { char *errMsg; const char *sql_stmt = "CREATE TABLE IF NOT EXISTS YOUR_Table (ID INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"; if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) { NSLog(@"Failed to create table"); } sqlite3_close(contactDB); 

Pruebe esto en AppDelegate Class

archivo .h

 @property(nonatomic, retain) NSString *dbPath; 

archivo .m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self copyDatabaseIfNeeded]; } - (void) copyDatabaseIfNeeded { NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error; dbPath = [self getDBPath]; BOOL success = [fileManager fileExistsAtPath:dbPath]; if(!success) { NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sampleDB.sqlite3"]; success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; if (!success) NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); } } /********* Database Path *********/ - (NSString *) getDBPath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString *documentsDir = [paths objectAtIndex:0]; return [documentsDir stringByAppendingPathComponent:@"sampleDB.sqlite3"]; } 

Se copiará automáticamente, si no encuentra ninguna base de datos en la aplicación.

Con suerte, te ayudará.

Gracias.

 -(void)openDatase{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; self.databasePath = [documentsDirectory stringByAppendingPathComponent:@"weightCal.sqlite"]; if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { NSLog(@"Database Successfully Opened "); } else { NSLog(@"Error in opening database "); } } -(void)dealloc{ sqlite3_close(database); [super dealloc]; } -(void)copyDatabase { BOOL success; NSFileManager *fileManager=[NSFileManager defaultManager]; NSError *error; NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory=[paths objectAtIndex:0]; NSString *writablePath = [documentsDirectory stringByAppendingPathComponent:@"test.sqlite"]; success = [fileManager fileExistsAtPath:writablePath]; if(success) { return; } NSString *defaultPath=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.sqlite"]; success=[fileManager copyItemAtPath:defaultPath toPath:writablePath error:&error]; if(!success){ NSAssert1(0,@"Failed to create writable database file with message '%@' .",[error localizedDescription]); } } 

Declare la siguiente variable teo en .h :

 sqlite3 *database; NSString *databasePath;