2012-03-20 9 views
3

2日前に私はAppをリリースしました。 itunesconnectからのAppStoreとクラッシュレポートのフィードバックによると、起動時に多くのクラッシュが発生します。しかし、100%のユーザーが苦しんだわけではなく、わずか30%しか苦しんでいませコアデータ軽量移行がアプリのアップデート後にクラッシュする

クラッシュログを読んで問題が発生しました。それは、DBの移行プロセスでクラッシュしています。データベースの軽量移行を使用します。 通常、私は新しいデータモデルのバージョンを非常に慎重に追加します。各リリースの前に、私は以前のバージョンのAppをインストールして、それをしばらく使ってから、その上に最新バージョンをインストールします。今回もそうだった。

私は2つのデータモデル(前と現在)を調べました。追加されました:

1)新しいエンティティ(軽量の移行では問題ありません)
2)既存のエンティティ内に新しいフィールドが追加されました。これらはすべてオプションです。 (軽量マイグレーションの場合はOK)
3)既存のエンティティの1つの新しいフィールド。オプションでインデックスを作成しました。

既存のフィールドとエンティティの名前が変更されていません。


どうしたのですか?


スタックトレース:

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0: 
0 libsystem_kernel.dylib   0x352f439c pread + 20 
1 libsqlite3.dylib    0x30d2d632 unixRead 
2 libsqlite3.dylib    0x30d4221a readDbPage 
3 libsqlite3.dylib    0x30d41156 sqlite3PagerAcquire 
4 libsqlite3.dylib    0x30d583be moveToChild 
5 libsqlite3.dylib    0x30d8e0e8 moveToLeftmost 
6 libsqlite3.dylib    0x30d59582 sqlite3BtreeNext 
7 libsqlite3.dylib    0x30d54328 sqlite3VdbeExec 
8 libsqlite3.dylib    0x30d4f6c2 sqlite3_step 
9 CoreData      0x329e8e2e _execute 
10 CoreData      0x329e8d64 -[NSSQLiteConnection execute] 
11 CoreData      0x32a8bd54 -[NSSQLConnection prepareAndExecuteSQLStatement:] 
12 CoreData      0x32add63c -[_NSSQLiteStoreMigrator performMigration:] 
13 CoreData      0x32ad42b8 -[NSSQLiteInPlaceMigrationManager migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:] 
14 CoreData      0x32a79c02 -[NSMigrationManager migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:] 
15 CoreData      0x32ac5bf4 -[NSStoreMigrationPolicy(InternalMethods) migrateStoreAtURL:toURL:storeType:options:withManager:error:] 
16 CoreData      0x32ac519c -[NSStoreMigrationPolicy migrateStoreAtURL:withManager:metadata:options:error:] 
17 CoreData      0x32ac6b58 -[NSStoreMigrationPolicy(InternalMethods) _gatherDataAndPerformMigration:] 

答えて

2

それらのユーザーが戻って複数の.xcversionたことがどれチャンス?コアデータはあなたのアップグレードを「連鎖」しません。したがって、V1、V2、V3があり、V3が現在のバージョンになると、V1の誰もがアップグレードできません。 V1からV2へ、そしてV2からV3への "ステップスルー"に役立つ独自のコードを追加することは可能です。私はMarcus Zarraの "Core Data"本にはそのようなコード例があると私は信じています。

+0

明らかにチェーンはなく、遷移V_n-1 - > V_nのみでした。 あなたは間違っていると思います。コアデータは、ステップバイステップ移行を使用して、V1からVnにデータを移行できます。 –

+0

私が間違っているかわからない:http://stackoverflow.com/questions/1557344/core-data-migration-across-multiple-version-upgrades and http://forums.pragprog.com/forums/90/topics/3175 。それにかかわらず、あなたがモデルの2回転だけを持っていれば、それはあなたの問題ではありません。私は、踏み込んだマイグレーションがあなたのために魔法のように起こると仮定することには注意が必要です。私は個人的にそれが失敗するのを見ました。 –

+0

私の経験では、段階的な移行はシステムと戦っているため、すべてのコストをかけて回避する必要があります。 – trapper

1

これがデータモデルのV3だった場合、一部のユーザーがまだV1上にあり、V2にアップグレードされていない場合に備えて、V1とV2のxcdatamodelを同梱のアプリケーションとともに含める必要があります。あなたはV1データモデルを持っていたが、それを含んでいなかったような音だが、わからない。あなたがこれをやったところで他のアプリを話しているだけかもしれない。

さらに、Xcodeはデータモデルの順序付きリストを管理していないことに気付きますが、現在のデータモデルのみを選択できます。古いバージョン間の順序については何も知らないので、V1-> ...-> Vm-> Vnを自動的にアップグレードすることはできません。単純にVnになる必要があります。テキストエディタを使ってxcdatamodeldパッケージを覗いてみてください。

コアデータが提供する動作のみに依存している場合、以前のすべてのバージョンが、推論されたマッピングモデルであろうと、明示的なマッピングモデルであろうと、最新のものに直接移行できる必要があります。V1- > Vn、V2-> Vn、...、Vm-> Vnである。だから、これを管理するために独自のコードを書く人がいる。

私はこれがまさにスコットが答えてくれたと信じています。我々のアプリの開発中

は、我々は、データモデルの〜6つのバージョンを(我々はApp StoreにV1を出荷する前に、すべてが、最新のアウトを取った)作成しました。コアデータの推測マッピングモデルを作成でき、軽量移行が機能することを確認した単体テストを書くと非常に役に立ちました。!

NSURL *sourceURL = /* exercise for reader */, *destinationURL = /* exercise */; 

NSManagedObjectModel *source = [[NSManagedObjectModel alloc] initWithContentsOfURL:sourceURL]; 
NSManagedObjectModel *destination = [[NSManagedObjectModel alloc] initWithContentsOfURL:sourceURL]; 

NSError *mappingError; 
NSMappingModel *inferred = [NSMappingModel inferredMappingModelForSourceModel:source destinationModel:destination error:&mappingError]; 

このコードブロックの終わりに、あなたはその推論さ= nilを主張することができ、そしてそれはあなたがmappingErrorを検査することにより、いくつかの有用な情報を印刷することができnilの場合:

はこれを行うにしてください。

問題のデバッグに役立ちます。繰り返し部分を2つの文字列、古いデータモデルのファイル名、最新のファイル名を取る関数に移動することができます。

関連する問題