2

次のコードから、厄介なあいまいなエラーが発生します。

GFree2AppDelegate *delegate = [[UIApplication sharedApplication] delegate];
context = [delegate managedObjectContext];

contextNSManagedObjectContextは.h ファイルでとして定義されており、デリゲートでも同じです。すべての適切なファイルが含まれているようです ( <CoreData/CoreData.h>.m ファイルを除く - ただし、プログラムは含まれているかどうかに関係なく同じ問題をスローします。ヘッダー ファイルに含まれています。)

すべての正しいフレームワークとものが含まれています。プロジェクトを開始したときに、「コアデータを使用してデータを管理する」などを選択しました。それで問題ないはずですよね?

私がやろうとしていることを行うためのより良い方法はありますか? 基本的に、最終的にそれを使用するまで、さまざまなクラスを介してコンテキストを渡し続ける必要はありません(データの保存は、アプリケーションの非常に小さな部分です)。

コンソールに表示されるエラーは次のとおりです。

    2010-08-28 13:09:24.726 GFree2[3912:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSURL initFileURLWithPath:]: nil string parameter'
...

    terminate called after throwing an instance of 'NSException'
    Program received signal:  “SIGABRT”.

次の行をコメントアウトするcontext = [delegate managedObjectContext];と、すべて正常に動作するように見えます。(現時点では、コアデータなどを実際に使用していないため、それに関連するコードはこれ以上ありません。

これについて助けたり、洞察を提供したりできる人に感謝します-それはとても複雑です。

編集:私のアプリデリゲートファイルメソッド:

#pragma mark -
#pragma mark Core Data stack

/**
 Returns the managed object context for the application.
 If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
 */
- (NSManagedObjectContext *)managedObjectContext {

  if (managedObjectContext != nil) {
    return managedObjectContext;
  }

  NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
  if (coordinator != nil) {
    managedObjectContext = [[NSManagedObjectContext alloc] init];
    [managedObjectContext setPersistentStoreCoordinator:coordinator];
  }
  return managedObjectContext;
}


/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel {
  if (managedObjectModel != nil) {
    return managedObjectModel;
  }

  NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"GFree" ofType:@"momd"];
  NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
  managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
  return managedObjectModel;
}

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
  if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
  }

  NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"GFree.sqlite"]];

  NSError *error = nil;
  persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
  if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
    /*
      Replace this implementation with code to handle the error appropriately.

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.

      Typical reasons for an error here include:
        * The persistent store is not accessible;
        * The schema for the persistent store is incompatible with current managed object model.

      Check the error message to determine what the actual problem was.

      If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.

      If you encounter schema incompatibility errors during development, you can reduce their frequency by:
        * Simply deleting the existing store:
          [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

        * Performing automatic lightweight migration by passing the following dictionary as the options parameter: 
          [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

        Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

    */
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
  }    

  return persistentStoreCoordinator;
}

#pragma mark -
#pragma mark Application's Documents directory

/**
 Returns the path to the application's Documents directory.
 */
- (NSString *)applicationDocumentsDirectory {
  return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

もう一度編集:

NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"GFree" ofType:@"momd"];
    NSURL *modelURL = [NSURL fileURLWithPath:modelPath];

エラーのある行です。これがどのタイプのファイルかはわかりませんが、明らかに見つからないか何かだと思います... :/私がすべきことはありますか?

@kiamlaluno - 編集をロールバックして申し訳ありませんが、意図したものではありませんでした。変更した内容を知りたいだけで、それが私に表示されると思いました...しかし、明らかにそれらを完全に削除しました。笑。

ビルド結果を編集します。

DataModelCompile build/Debug-iphonesimulator/GFree2.app/GFree2.mom GFree2.xcdatamodel
cd "/Volumes/files/Gluten Free Cooking/Tom iPhone App/GFree2"
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/usr/bin/momc -XD_MOMC_TARGET_VERSION=10.6 "/Volumes/files/Gluten Free Cooking/Tom iPhone App/GFree2/GFree2.xcdatamodel" "/Volumes/files/Gluten Free Cooking/Tom iPhone App/GFree2/build/Debug-iphonesimulator/GFree2.app/GFree2.mom"
4

2 に答える 2

1

GFree.momd が存在しないため、エラーが発生しています。NSURL の pathForResource:ofType: メソッドのドキュメントから:

戻り値リソース ファイルのフル パス名、またはファイルが見つからない場合は nil。

GFree.momd はビルド時に .xcdatamodeld ファイルから生成されます (DataModelVersionCompile で始まる行のビルド結果を調べて展開します)。そのファイルを削除または名前変更しましたか?

ビルド ターゲットの [コンパイル ソース] セクションにまだリストされていますか? (Xcode では、Targets / [AppName] / Compile Sources を展開します)。

デバッグ ログにはアプリの名前が GFree2 であることが示されていますが、コードは GFree.momd を探していることに気付きました。プロジェクトの名前を変更しましたか? データ モデル ファイルの名前が GFree2.xcdatamodeld になっている場合は、momd ファイルをインポートする行も新しい GFree2 名を使用するように変更する必要があります。

于 2010-08-28T16:09:35.760 に答える
1

問題はファイルのpersistentStoreCoordinatorメソッドにあると思いGFree2AppDelegate.mます。

managedObjectModelこのファイルの、managedObjectContextおよびpersistentStoreCoordinatorメソッドの正確なコードで質問を更新していただけますか?

これらのメソッドは、「ストレージに Core Data を使用」をチェックすると、XCode によって生成されます。

ところで、.m ファイルはインポートしないでください。

于 2010-08-28T12:39:04.987 に答える