5

Core Data を使用して、単純なデータ モデルでデータを表示しようとしています。アプリがクラッシュし、このエラー メッセージが表示されます

キャッチされない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '+entityForName: nil は、エンティティ名 'Remind' を検索する正当な NSManagedObjectContext パラメータではありません

完全にはわかりませんが、Remind と呼ばれるエンティティが見つからないということでしょうか? ただし、実際には Remind というエンティティがあります。

ブレークポイントも配置すると、ここで停止します。ここに画像の説明を入力

どんな助けでも大歓迎です。完全に行き止まり。

App Delegate .m のマネージド コンテキスト コード

ここに画像の説明を入力

4

1 に答える 1

1

ここでの問題は、アクセサと ivar が同じ名前であることです。これが、アンダーバー ivar 規則の由来です。ここでは、アクセサーを使用してプロパティにアクセスしていません。バッキング変数を直接使用しているため、初期化されることはありません。代わりに、常にアクセサ メソッドを使用して問題が発生しないようにしてください。managedContextObjectしたがって、問題のあるメソッド (およびそのプロパティを使用するその他のメソッド) を次のように書き直します。

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated]; // it's good practice to call the super methods, even if you're fairly certain they do nothing

  // Get a reference to the managed object context *through* the accessor
  NSManagedObjectContext* context = [self managedObjectContext];

  // From now on, we only use this reference in this method
  NSFetchRequest = [[NSFetchRequest alloc] init];
  NSEntityDescription* entity = [NSEntityDescription entityForName:@"Remind" inManagedObjectContext:context]; // <- use the local reference we got through the accessor
  [request setEntity:entity];
  NSError* error = nil;
  NSArray* array = [context executeFetchRequest:request error:&error];
  if( !array ) {
    // Do something with the error
    NSLog(@"Error Fetching: %@", error);
  }
  [self setDesitnationsArray:[array mutableCopy]];
  [destinationsTableView reloadData];
}

ivar を、使用したくないものに変更したり、プロパティへのアクセスに慣れるまで、アクセサを通過していないことがすぐに明らかになるものに変更したい場合があり_managedObjectContextます_privateContext。アクセサーを介して。プロパティにアクセスするための Objective-C 構文が気に入らない場合は、ドット構文を使用できますが、self常にself.managedObjectContext. 私はこの方法が好きではありません.人々はそれが直接のプロパティアクセスではなく、アクセサーを使用していることを忘れているので、そうでない場合は直接アクセスのドット構文を交換しても問題ないと考えています(あなたの場合のように)。

于 2012-10-13T05:57:38.323 に答える