0

皆さん。ボタンを押すだけで個別に作成できる複数のサブビューを含むios-appを作成しています。すべてのサブビューには「グループ」のインスタンスがあり、これはコア データを介して保存されるエンティティです。「グループ」は「連絡先」と対多の関係にあります。連絡先がサブビューにドラッグされると、指定された「グループ」のコア データに保存されます。これは正確に 3 回正常に動作します。連絡先が別のサブビューにドラッグされる 4 回ごとに、アプリがクラッシュします。

コードは次のとおりです。

- (void)fetchContacts {
if(personRecordIDsArray==nil) {
    personRecordIDsArray = [[NSMutableArray alloc] init];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];
    [entity release];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[[managedObjectContext executeFetchRequest:request error:&error] mutableCopy] autorelease];
    if (mutableFetchResults == nil) {
        // Handle the error.
    }
    [error release];
    [request release];
    for (Contact *contact in mutableFetchResults) {
        if(contact.belongsToGroup == group) {
            [personRecordIDsArray addObject:contact.recordId];
        }
    }
}   
NSLog(@"%d", [personRecordIDsArray count]);}

- (void)addContactsToGroup:(NSArray*)arrayOfPeople {
[self fetchContacts];
for(int i = 0; i<[arrayOfPeople count]; i++) {
    ABRecordRef person = [arrayOfPeople objectAtIndex:i];
    NSNumber *personRecordId = [NSNumber numberWithInteger:ABRecordGetRecordID(person)];
    if(![self groupContainsContactWithRecordID:personRecordId]) {
        NSString *compositeName = (NSString *)ABRecordCopyCompositeName(person);
//Here is when the error occurs:
        Contact *contact = (Contact*)[NSEntityDescription insertNewObjectForEntityForName:@"Contact" inManagedObjectContext:managedObjectContext];
        contact.compositeName = compositeName;
        contact.recordId = personRecordId;
        contact.belongsToGroup = group;
        NSError *error = nil;
        if (![managedObjectContext save:&error]) {
            NSLog(@"Error in addContactsToGroup!");}
        [error release];    
        [personRecordIDsArray addObject:personRecordId];
    }

}}

グループに連絡先を追加しようとすると、次のエラーが表示されます。

2011-04-10 16:16:36.152 TestApp[796:207] *キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'エンティティ名は nil であってはなりません'。

私は本当にしばらく遊んでいましたが、インターネット上で同様のものを見つけることもできませんでした. 連絡先が別のサブビューに 4 回追加されたときに常にエラーが発生するのはおかしいです。どうすればこれを修正できるかについて誰か考えがありますか? 私は本当にアイデアがありません...

ああ、デバッガーは言う:

#0  0x956e2156 in __kill
#1  0x956e2148 in kill$UNIX2003
#2  0x95774899 in raise
#3  0x9578a9b8 in abort
#4  0x91de4fda in __gnu_cxx::__verbose_terminate_handler
#5  0x0141c4e7 in _objc_terminate
#6  0x91de317a in __cxxabiv1::__terminate
#7  0x91de31ba in std::terminate
#8  0x91de32b8 in __cxa_throw
#9  0x0141c635 in objc_exception_throw
#10 0x00ce1486 in +[NSManagedObject(_PFDynamicAccessorsAndPropertySupport) classForEntity:]
#11 0x00ce11f6 in _PFFastEntityClass
#12 0x00d06e73 in +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]
#13 0x00009a02 in -[GroupViewController addContactsToGroup:] at GroupViewController.m:152
#14 0x00002f31 in -[GrouperViewController dragingWillEnd:forContacts:atPosition:] at GrouperViewController.m:98
#15 0x0000cbb8 in -[ContactsTableViewController longPressOnView:] at ContactsTableViewController.m:65
4

1 に答える 1

1

問題は、マネージド オブジェクト コンテキストがマネージド オブジェクト モデルから分離されたため、NSEntityDescription がContactエンティティを表すクラスを見つけて返すことができなくなったことだと思います。

この原因として最も可能性が高いのは、管理対象オブジェクト コンテキストを初期化しているが、そのモデルを設定していないか、何らかの形でモデルを nil に設定していることです。失敗する呼び出しを行う前に、管理対象オブジェクトのコンテキストを完全にログに記録することをお勧めします。特に、そのモデルをログに記録して、モデルがあり、呼び出しごとに同じモデルを保持していることを確認します。

于 2011-04-11T20:48:18.557 に答える