私は既存のアプリケーションにコアデータを追加しようとしていますが、すべてのドキュメントとすべてのチュートリアルが最初からコアデータを使用するアプリの作成から始まることを考えると簡単ではありません。そのため、既存のモデルクラスをコアデータエンティティに変換しようとしています。これが私がしたことです:
- コアデータフレームワークを追加します。
- xcdatamodelファイルを追加します。既存のクラスを追加できるダイアログが表示されたので、モデルを追加しました。次に、属性を微調整して、タイプが何であるかを伝えました。
- 新しいモデルクラスを生成する代わりに(すでに持っているので)、テストプロジェクトを作成して、それがどのように見えるかを確認し、それに合わせてクラスを調整しました。これには、NSManagedObjectから継承するように変更する、プロパティを動的に変更する、リリース呼び出しを削除するなどが含まれます。
- この例に従って、コアデータオブジェクトをアプリデリゲートに追加しました。
モデルを割り当てていたViewControllerで、次のように変更しました
MyModel *model = (MyModel*)[NSEntityDescription insertNewObjectForEntityForName:@"MyModel"] inManagedObjectContext:[delegate managedObjectContext];
デリゲートは、以前に宣言された私のアプリデリゲートへの参照であることに注意してください。おそらくそれは賢い方法ではありません。
すべてのプロパティを設定した後、次のようになります。
[[delegate managedObjectContext] save:&error];
この行はクラッシュし、バックトレースは[NSSqlLiteConnection execute]
、保存関数内の約8レベルの内部にあることを示しています。例外は次のとおりです。
*-[NSConcreteValue UTF8String]: unrecognized selector sent to instance*
この具体的な価値は何ですか?そして、なぜこれが誰によって呼ばれているのですか?重要な場合、コードを作成/保存するモデルは、NSNotificationのコールバックである関数内にあります。それは別のスレッドにありますか?managedObjectContextはスレッドセーフではないと聞きました。しかし、その場合に予想されるのと同じエラーは発生しません。