如何在iOS中覆盖SQLite数据库

时间:2013-04-29 17:12:52

标签: iphone ios sqlite

我已经在我使用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"];
}

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

1 个答案:

答案 0 :(得分: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. 
}

你可能还想看看@Martin在评论中提到的PRAGMA user_version