1

ボタンが押されるたびに文字列をデータベースに保存しようとしていますが、プロジェクトを実行すると、コンソールに表示されます: 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Info''.

データ モデルを参照して、'Info' という名前のエンティティと、その内部に文字列型の 'path' という名前の属性を持つ .xcdatamodeld を作成しました。

3 つの関数を作成しました。「enterdata」 「findData」を呼び出して、名前が使用可能かどうかを確認します。名前が使用可能な場合、新しいデータが「newData」を通じて記録されます。そうでない場合は、別の名前が検索されます。

私はいくつかの同様の質問を探していましたが、これを見つけまし。ManagedObjectContext を View Controller に渡す必要があると書かれていますが、それが何を意味するのかわかりません。

これが私の.hコードです:

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;

ここに私の.mコードがあります:

#import <CoreData/CoreData.h>

@synthesize managedObjectContext;

int  iSavedNum = 1;
bool bCanSave;

//Enter data
- (IBAction) enterdata:(id)sender {

    //Search if data is already registered
    NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *path = [NSString stringWithFormat:@"%@/info%i.png",docDir, iSavedNum];
    [self findData:path :@"path"];

    //If data is already saved, save it with new name.
    if (bCanSave == NO) {
        for (iSavedNum = 1; bCanSave == YES; iSavedNum++) {
            [self findData:path :@"path"];
            if (bCanSave == YES) {
                [self newData:path :@"path"];
            }
        }
    } else {
        [self newData:path :@"path"];
    }

}

//Input new data
- (void) newData:(NSString *)value:(NSString *)key {

    //Create ManagedObjectContext and ManagedObjectModel
    __0AppDelegate *appDelegate = (__0AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSManagedObjectModel *newRecord;

    //Put the data to the Entity
    NSString *entityName = @"Info";
    newRecord = [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:context];
    [newRecord setValue:value forKey:key];

    //Errors management and cheking
    NSError *error;
    [context save:&error];
    NSLog(@"Info Saved. Value: %@ Key: %@", value, key);

}

//Find Data
- (void) findData:(NSString *)valor:(NSString *)key {

    //Create ManagedObjectContext
    __0AppDelegate *appDelegate = (__0AppDelegate *)[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];

    //Call the Entity and make a request
    NSString *entityName = @"Info";
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDesc];

    //Create predicate to call specific info
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"(%@ = %@)", key, valor];
    [request setPredicate:pred];

    //Errors management and creation of an array with found info
    NSError *error;
    NSArray *objects = [context executeFetchRequest:request error:&error];

    //Set if the name is avaliable or not
    if ([objects count] == 0) {
        bCanSave = YES;
    } else {
        bCanSave = NO;
    }
}
4

2 に答える 2

4

エラーが何であるかを正確に示します。

nil は有効な NSManagedObjectContext パラメータではありません

これは、この行で次のことを意味します。

newRecord = [NSEntityDescription insertNewObjectForEntityForName:entityName
                                          inManagedObjectContext:context];

変数contextnil. これは、managedObjectContextメソッドが正しく機能していないことを意味します。これを表示しないので、これ以上追加できるものはありません。

于 2012-12-29T13:43:01.923 に答える
0

application:didFinishLaunchingWithOptions:で_appDelegate

/*initiate the managed Object Context */  
CoreDataManager *coreDataManager = [CoreDataManager sharedDataManager];
    coreDataManager.managedObjectContext = self.managedObjectContext;

CoreDataManagerすべてのコアデータの保存、削除メソッドを明示的に含む私のコア日付マネージャーは どこですか

または

yourClassObject.managedObjectContext = self.managedObjectContext;

そのため、コンテキストが初期化されます

于 2013-06-19T07:28:01.083 に答える