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- ファイルの sth を変更し、顧客用に新しいアプリ ファイルを作成すると、顧客は古いアプリの上に新しいアプリをインストールしますが、古いデータベースがまだ使用されているため、クラッシュすることです!

4

1 に答える 1

0

問題は、db スキーマを変更した場合にのみ発生すると想定しています。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コメントで @Martin が言及しているように、 も参照してください。

于 2013-04-29T17:17:51.667 に答える