2013-03-19 17 views
14

Ich möchte meine sqlite-Datenbank vom Speicherort der Datenbank mit den neuesten Updates meiner iOS-Anwendung jedes Mal kopieren, wenn ich die Anwendung starte.Wie sqlite-Datenbank kopieren, wenn Anwendung in iOS gestartet wird?

Gibt es eine Möglichkeit, es zu tun?

+0

Bitte stellen Sie sicher, für solche Fragen, die Sie tun Liste Verweise auf What Have You Quellen Versuchte oder einfach in Ihrem Code hier zu schreiben, so dass jeder yur Methode/Ansatz – madLokesh

Antwort

16

können Sie folgende Methoden, um Ihre 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"]; 
} 

und rufen Sie diese Methode in Ihrem tat Finish fügen mit Methode [self copyDatabaseIfNeeded]; Hoffnung starten, das wird helfen.

+0

danken wissen kann, u .... funktioniert es –

+0

Nein, wenn Ihre ursprüngliche Datenbank schmutzig ist, möchten Sie die Benutzeraktivitätsdaten beibehalten, anstatt die gesamte Datenbank zu überschreiben. – OMGPOP

+0

Ist die neu ersetzte Datenbank schreibbar? Ich habe eine Datenbank ersetzt, aber es wurde nur gelesen. Wie kann ich es beschreibbar machen? –

0

versuchen diese:

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

die Sie interessieren in AppDelegate Klasse

.h-Datei

@property(nonatomic, retain) NSString *dbPath; 

.m-Datei

- (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'l lch kopiere automatisch, wenn keine Datenbank in der Anwendung gefunden wird.

Hoffentlich hilft es Ihnen.

Danke.

+0

Probieren Sie es aus, es wird Ihnen auf jeden Fall helfen. –

+0

thnks .. es funktioniert gut .... –

+0

ok. gut .. Enjoy coding .. :) –

4

unter Code Verwendung für die Bewältigung Datenbank beim Starten von Anwendungen

in Ihrem appdelegate.m

in

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{ 

    [self getdatabase]; 

    return YES; 
} 

und unten Funktion in Ihrem appdelegate.m hinzufügen

-(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

Danke ... es funktioniert gut für mich !!!! –

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

Deklarieren folgende Teo Variable in .h:

sqlite3 *database; 
NSString *databasePath; 
Verwandte Themen