2016-05-23 11 views
0

Ich habe eine Situation, in der ich Änderungen an einer SQLite-Datenbank für die nächste Version meiner App vorgenommen habe, wegen der Änderungen an der SQLite-Datenbank habe ich auch Änderungen an Code vorgenommen, der daraus liest, primär Hinzufügen von Spalten zur Abfragemethode.Replace File in Documents Directory

Aufgrund der Änderungen muss der Benutzer bei der nächsten Aktualisierung der Anwendung die neue Datenbank verwenden, damit er funktioniert. In der vorherigen Version meiner App habe ich eine Datenbank mit dem Namen File.sqlite. Wenn der Benutzer die Anwendung herunterlädt, wird diese Datei in ihrem Dokumentenordner gespeichert. Jetzt habe ich die Anwendung mit einer neuen Datei, aber dem gleichen Namen File.sqlite, die mehr Spalten und solche in ihm hat, aber wenn ich die Anwendung (keine Neuinstallation) aktualisiert, dass neue Datei ersetzt nicht die alte Datei.

Wie kann ich sicherstellen, dass, wenn der Benutzer die Anwendung aktualisiert, die Datei ersetzt/aktualisiert wird?

Wie jetzt von Ich verstehe, dass ich die folgende verwenden, um den Pfad der alten Datei in Dokumentenverzeichnis zu erhalten:

//Reference the path to the documents directory. 
NSString *documentDir =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
//Get the path of old file. 
NSString *filePath = [documentDir stringByAppendingPathComponent:@"File.sqlite"]; 

Ist die neue Datei einen anderen Namen haben, und ich verweisen nur die Neuer Name im Code? Das scheint mir albern, ich muss in der Lage sein, eine Kopie des alten zu machen und die neue Version zu benutzen?

Auch ich bin mir nicht einmal sicher, ob dies der beste Ansatz ist, um das zu tun, was ich versuche, auch wenn Sie einen besseren Weg kennen, beraten Sie bitte.

+0

Sicherlich liegt Ihre Antwort in [diesen Suchergebnissen] (http://stackoverflow.com/search?q=%5Bios%5D+sqlite+schema+change). – rmaddy

+0

@rmaddy Ich hätte meine Frage nicht gestellt, wenn ich eine Lösung finden könnte, ich habe versucht, diese Lösung zu betrachten. –

+0

Es gibt [diese] (http://stackoverflow.com/questions/989558/best-practices-for-in-app-database-migration-for-sqlite?lq=1), [diese] (http://stackoverflow.com/questions/10136256/updating-new-version-to-app-store-with-different-sqlite-db-structure), [dieser] (http://stackoverflow.com/questions/16284430/how -a-sqlite-db-in-ios) und [diese] (http://stackoverflow.com/questions/17369603/how-to-detect-the-app-version-has- geändert/17375294? s = 3 | 0.7471 # 17375294). – rmaddy

Antwort

1

Sie können überprüfen, ob es sich bei Ihrer Anwendung um eine Neuinstallation oder ein Update von AppDelegate handelt. Es scheint jedoch, dass Sie Ihre App-Version in NSUserDefaults nicht speichern, es wird ein bisschen schwierig für Sie sein. Sie speichern Ihre neue Version von File.sqlite in Ressource und kopieren sie in Dokumentverzeichnis.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    NSString* curVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; 
    NSString* lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"LastVersion"]; 

    if (lastVersion == nil) 
    { 
     //App Installed for the first time. In your case it might be an update because you do not store lastVersion value. 

     //Reference the path to the documents directory. 
     NSString *documentDir =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; 
     //Get the path of old file. 
     NSString *filePath = [documentDir stringByAppendingPathComponent:@"File.sqlite"]; 

     if([[NSFileManager defaultManager] fileExistsAtPath: filePath]) 
     { 
      [fileManager removeItemAtPath:filePath error:&error] //Delete old file 
     } 
     //Copy New File.sqlite from Resource Bundle. 
     NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"File" ofType:@"sqlite"]; 
     [fileManager copyItemAtPath:resourcePath toPath:filePath error:&error]; 
    } 
    else if (![lastVersion isEqual: curVersion]) 
    { 
     // App is updated. For future Versions you can Update files from here! 
    } 

    [[NSUserDefaults standardUserDefaults] setObject:curVersion forKey:@"LastVersion"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 

Hoffe, das hilft!

1
NSArray *pathsToDocuments = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [pathsToDocuments objectAtIndex: 0]; 
NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"File.sqlite"]; //File.sqlite old database 

NSString *pathStr = [documentsDirectory stringByAppendingPathComponent:@"File1.sqlite"]; // New database file name 
FMDatabase *database = [FMDatabase databaseWithPath:dbPath]; 
[database open]; 
FMDatabase *database1 = [FMDatabase databaseWithPath:pathStr]; 
[database1 open]; 

NSString *str = @"select * from table_name"; // old database fire query for use data value fetch 

FMResultSet *res=[database executeQuery:str]; 

// Your old database value updated to update new database. 
while ([res next]) { 
    NSString *query= // Write update query for update column value 
    [database1 executeUpdate:query]; 
} 
[database1 close]; 
[database close]; 

// remove old database file 
if ([[NSFileManager defaultManager] isReadableFileAtPath: dbPath]) 
{ 
    if ([[NSFileManager defaultManager] removeItemAtPath:dbPath error: NULL] != YES) 
     NSAssert2(0, @"Fail to copy database from %@ in %@", dbPath, pathStr); 
}