コアデータ:nsmanagedObjectContextは、認識されていないセレクターでクラッシュします
-
01-10-2019 - |
質問
既存のアプリケーションにコアデータを追加しようとしています。これは、すべてのドキュメントとすべてのチュートリアルが最初からコアデータを使用するアプリの作成から始まることを考えると簡単ではありません。そこで、既存のモデルクラスをコアデータエンティティに変換しようとしています。これが私がしたことです:
- コアデータフレームワークを追加します。
- 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はスレッド安全ではないと聞きました。しかし、私はその場合に期待するのと同じエラーを取得していません。
解決
まあ、あなたはあなたのオブジェクトモデルに何か他のもの(たぶんnsnumber)として宣言されているあなたのデータベースモデル(.xcdatamodel)のnsstringとして宣言されたプロパティを持っていると確信しています。コードをコンパイルすると、警告は生成されませんが、CoreDataがMOCを保存しようとすると(つまり、Persistent Storeでデータを作成しようとする場合、別名SQLiteデータベース)、CoreDataが想定されるNSStringをUTF8エンコーディングに変換しようとすると失敗します。
データベースモデルとオブジェクトモデルの両方でプロパティを再確認する必要があります。