如何在iOS中启动应用程序时复制sqlite数据库?

我想每次启动应用程序时将最新更新的数据库位置的sqlite数据库复制到我的iOS应用程序。

有没有办法做到这一点?

你可以添加以下方法到你的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"]; } 

并在启动方法[self copyDatabaseIfNeeded];调用此方法[self copyDatabaseIfNeeded]; 希望这会有所帮助。

在应用程序启动时使用下面的代码来处理数据库

在你的appdelegate.m

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

并将下面的函数添加到您的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); } 

试试这个:

 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); 

AppDelegate类中试试这个

.h文件

 @property(nonatomic, retain) NSString *dbPath; 

.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"]; } 

如果在应用程序中没有find任何数据库,它会自动复制。

希望它能帮助你。

谢谢。

 -(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]); } } 

.h声明以下teovariables:

 sqlite3 *database; NSString *databasePath;