How to copy sqlite database when application is launched in iOS?

前端 未结 6 1210
闹比i
闹比i 2020-12-01 13:20

I want to copy my sqlite database from the database location with latest updates to my iOS application every time I launch the application.

Is there any way to do i

相关标签:
6条回答
  • 2020-12-01 13:33

    use below code for coping database when application launch

    in your appdelegate.m

    in

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

    and add below function in to your 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);    
    }
    
    0 讨论(0)
  • 2020-12-01 13:34

    try this one:

    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);
    
    0 讨论(0)
  • 2020-12-01 13:37

    Here it is in Swift 4/5

        func copyDatabaseIfNeeded(sourcePath : String) -> Bool {
          var destPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
          destPath = destPath + "/foo.db3"
          let databaseExistsWhereNeeded = FileManager.default.fileExists(atPath: destPath)
          if (!databaseExistsWhereNeeded) {
            do {
                try FileManager.default.copyItem(atPath: sourcePath, toPath: destPath)
                print("db copied")
            }
            catch {
                print("error during file copy: \(error)")
            }
        }
        return true
    }
    
    0 讨论(0)
  • 2020-12-01 13:39
    -(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 following teo variable in .h:

    sqlite3 *database; 
    NSString *databasePath;
    
    0 讨论(0)
  • 2020-12-01 13:42

    you can add following methods to your 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"];
    }
    

    and call this method in your did finish with launching method [self copyDatabaseIfNeeded]; hope this will help.

    0 讨论(0)
  • 2020-12-01 13:54

    Try this in AppDelegate Class

    .h file

    @property(nonatomic, retain) NSString *dbPath;
    

    .m file

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

    It'll automatically copy, if it doesn't found any database in application.

    Hopefully, it'll help you.

    Thanks.

    0 讨论(0)
提交回复
热议问题