我已经在我使用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"];
}
我的问题是,如果我在数据库文件中更改并为我的客户创建新的应用程序文件,他们会在旧应用程序上安装新应用程序但旧数据库仍在使用中,这将导致崩溃!
答案 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
。