0

我在使用 SQLlite 数据库的地方创建了一个应用程序...如果需要,我在应用程序第一次启动时使用以下方法在 NSCaches 目录中复制该数据库:

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

我的问题是,如果我在 Database- 文件中更改某项内容并为我的客户创建一个新的应用程序文件,他们会在旧应用程序上安装新应用程序,但旧数据库仍在使用中,这将导致崩溃!

4

1 回答 1

0

我假设问题仅出在您更改数据库架构时。在 sqlite 数据库中创建一个版本表并添加一个列schema_version并使用代码中的值填充它。现在,每当您更改 sql 架构时,请更新schema_version代码中的数字。在copyDatabaseIfNeeded中,检查您是否有现有的 db 文件,打开它并阅读schema_version. 如果此版本与您当前的版本相同,那么您很好。否则,您需要迁移架构。您可能还希望将数据迁移到新架构中。

编辑:要澄清 - in 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@Martin 在评论中提到的内容。

于 2013-04-29T17:17:51.667 回答