2013-04-29 79 views
0

我已經在使用SQLlite數據庫的地方創建了一個應用程序......如果需要,我在第一次啓動應用程序時使用以下方法將該數據庫複製到NSCaches目錄中:如何覆蓋iOS中的SQLite數據庫

- (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:@"datenbankSpeed"]; 
    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(NSCachesDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths lastObject]; 
return [documentsDir stringByAppendingPathComponent:@"datenbankSpeed"]; 
} 

我的問題是,如果我在數據庫 - 文件改變某事,併爲我的客戶一個新的應用程序文件,他們安裝新的應用程序在舊的應用程序,但舊的數據庫仍在使用,這會導致崩潰!

回答

0

我假設問題是隻有當您更改您的數據庫架構。在sqlite數據庫中創建一個版本表,並添加一列schema_version,並用代碼中的值填充它。現在,無論何時更改sql模式,都需要更新代碼中的schema_version數字。在copyDatabaseIfNeeded中,檢查您是否有現有的db文件,將其打開並閱讀schema_version。如果這個版本與你當前的版本相同,那麼你很好。否則,您需要遷移模式。您可能還需要將數據遷移到新模式中。

編輯:爲了澄清 - 在copyDatabaseIfNeeded,請執行下列操作:

int version = ... // read schema_version from db 
if (version != kCurrentSchemaVersion) 
{ 
    // convert the schema into new version preserving data if required. 
    // this can be a multi-step process. Eg. if user directly upgrades to schema_version 3 
    // after schema_version 1, first you'll convert from 1->2, then 2->3. 
} 

您還可能希望在PRAGMA user_version由@馬丁在評論中提到看一看。

+1

我想你可以使用'PRAGMA user_version'來達到這個目的。 – 2013-04-29 17:22:16

+0

感謝您的信息。你應該添加一個解釋如何使用它的答案。 – Mar0ux 2013-04-29 17:24:33

+0

是的,這聽起來不錯,但如何完全在我的copyDatabaseIfNeeded ?!你能給個例子嗎?! – davidOhara 2013-04-29 17:29:53