2009-09-03 14 views
0

私はPersonエンティティとPictureエンティティを持つモデルを持っています。 My Pictureエンティティでは、Personとの関係であるプロパティがあります。このコアデータの例がクラッシュするのはなぜですか?

私が行ったことが機能しないため、PictureをPersonに追加する方法の例があります。

-(BOOL)savePicture:(NSString *)urlPicture:(Person *)person{ 
SettingsSingleton *userSettings = [SettingsSingleton sharedManager];  
NSManagedObjectContext *managedObjectContext = [userSettings managedObjectContext]; 
NSEntityDescription *myContentEntity = [NSEntityDescription entityForName:@"Pictures" inManagedObjectContext:managedObjectContext]; 
NSManagedObject *contentToSave = [[NSManagedObject alloc] initWithEntity:myContentEntity insertIntoManagedObjectContext:managedObjectContext]; 

[contentToSave setValue:urlPicture forKey:@"url"]; 
[contentToSave setValue:person forKey:@"relatedPerson"]; 

[managedObjectContext insertObject:contentToSave]; 

NSError *error; 
if ([managedObjectContext save:&error]){ 
    //Deal with errors 
    NSLog(@"Error"); 
      return NO; 
} 
return YES; 
} 

場合には、ライン上でクラッシュする([managedObjectContext保存:&エラー])と、コンソールに、私はこれらのエラーを持っている:

-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0 Serious application error. Exception was caught during Core Data change processing: ***  
-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0 with userInfo (null) *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** 
-[UITableViewCell objectID]: unrecognized selector sent to instance 0x135c2b0' 

、私の前のビューに私は次のコード

を持っています
- (void)viewDidLoad { 
[super viewDidLoad]; 
SettingsSingleton *settings = [SettingsSingleton sharedManager];  
managedObjectContext = [settings managedObjectContext]; 
fetchedResultsController = [settings fetchedResultsController]; 
fetchedResultsController.delegate=self; 

NSError *error; 
if (![[self fetchedResultsController] performFetch:&error]) { 
    // Handle the error... 
} 
[settings release]; 

self.table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 416) style: UITableViewStyleGrouped]; 
[table setDataSource:self]; 
table.delegate=self; 
[self.view addSubview: self.table]; 
} 


- (NSFetchedResultsController *)fetchedResultsController { 

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

Person *personTmp=[[Person alloc] init]; 
personTmp=[personTmp getPersonById:self.personId]; 

/* 
Set up the fetched results controller. 
*/ 
// Create the fetch request for the entity. 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
// Edit the entity name as appropriate. 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pictures" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate =[NSPredicate predicateWithFormat:@"relatedPerson == %@ AND contentType == %d",personTmp, CONTENT_DATA_PICTURE]; 

[fetchRequest setEntity:entity]; 
[fetchRequest setPredicate:predicate]; 

// Edit the section name key path and cache name if appropriate. 
// nil for section name key path means "no sections". 
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"]; 
aFetchedResultsController.delegate = self; 
self.fetchedResultsController = aFetchedResultsController; 

[aFetchedResultsController release]; 
[fetchRequest release]; 
[predicate release]; 
[personTmp release]; 


return fetchedResultsController; 
}  


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
} 
if(indexPath.row==0){ 
    [email protected]"Add a picture"; 
} 
else{ 
    int nb=indexPath.row-1; 
    NSIndexPath *ip = [NSIndexPath indexPathForRow: nb inSection:indexPath.section]; 
    NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:ip]; 
    cell.textLabel.text = [[managedObject valueForKey:@"url"] description]; 
    [ip release]; 
} 
return cell; 
} 


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
int nb=[[fetchedResultsController sections] count]; 
if (nb == 0) { 
    nb = 1; 
} 
return nb; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 

NSArray *sections = [fetchedResultsController sections]; 
NSUInteger count = 0; 
if ([sections count]) { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [sections objectAtIndex:section]; 
    count = [sectionInfo numberOfObjects]; 
} 
return count+1; 
} 

答えて

1

まず、 'insertObject'を呼び出す必要はありません。アップルdocumentationから:(awakeFromInsertを起動させる):コンテキストがnilない

場合、この方法は、[自己コンテキストは、insertObject]を呼び出します。

したがって、重複してオブジェクトを挿入しています。これがどのような悪影響を及ぼすかはっきりしないが、それは良いことではない。

エラーについては、コードの他の部分が原因である可能性があります。そのメッセージが意味することは、基本的に、UITableViewCellのCoreData objectIDにアクセスしようとしていることです。これは保存中に発生するので、この関数の前のある時点でUITableViewCellをmanagedObjectContextに挿入している可能性があります。実際に保存するときにはここを吹き飛ばすだけです。

+0

- (NSFetchedResultsController *)fetchedResultsControllerメソッドのコードにコメントするときに違うエラーが発生しました。私の画像を正しく追加できます:プログラム受信信号: "EXC_BAD_ACCESS"。 – Mathieu

+1

あなたは述語を超過しており、おそらくはpersonTmpです(getPersonByIdが自動解放されたオブジェクトを返すかどうかによって異なります)。クラッシュは、これらの過剰にリリースされたオブジェクトのいずれかからのものです。 Objective-Cのメモリ管理(Googleの "Objective-c memory management"、最初の結果であるはずです)を読んでください。さらに、getPersonByIdが別の人物オブジェクトを返した場合、あなたはその上にalloc-init'dを漏らしています。 – bobDevil

+0

ああ、それは今では で動作しますが、私はそれをクラスのグローバル変数にして、 - (void)deallocで解放する必要がある場合は、述語変数を解放しなければならない – Mathieu

6

非常に似たエラーが発生しました。私は、まずcustomTypeAのviewControllerをロードしたnavControllerを持っていて、その上にcustomTypeBのviewControllerをロードしていました。これらのviewControllerの両方は、コアデータとfetchedResultsControllerをtableviewのデータソースとして使用しました。 customTypeBの機能は、新しいデータオブジェクトをcustomTypeAのデータソースに追加することでした。その際、上記のエラーメッセージ "Serious Error in Core Data, Unrecognized Selector. EXC_BAD_ACCESS"が届きます。しかし私のエラーは、認識できないセレクタが "controllerWillChangeContent"であると述べています。私の両方のviewControllerは、 "controllerWillChangeContent、controllerDidChangeObject ...、controllerDidChangeContent"というメソッドをデリゲートするfetchedViewControllerを利用していました。

viewControllerBがcontrollerAのデータを変更したときに、controllerBの「fetchedResultsController」がアクティブになっていても、controllerBがまだ「ポップ」されていないことに気付きました。だから私はおそらくcontrollerBの代理人が呼び出されていると考えました。 Core Dataプログラミングのドキュメントを見て、私はfetchedResultsControllerを使ってそれぞれのビューを推奨していますが、viewWillDisappearを実装し、内部にfetchedResultsController = nilを設定する必要があります。私にとって、これは私の問題を解決しました。

また、FYI - Snow Leopard用のXCODE 3.2をインストールする前に、fetchedResultsControllersの非表示のviewControllerの代理人が呼び出されているというこの問題はありませんでした。 Xcode3.1でLeopard用のコードがうまく機能していました。

+0

私はあなたと一緒です。基本的に、異なるviewControllerで同じmanagedObjectContextを使用していて、fetchedViewControllerデリゲートがそのうちの1つにフックされている場合、データオブジェクト内で変更したものはすべて、デリゲートメソッドが呼び出されます。 – digdog

+0

私のdeallocでは、私は 'self.fetchedResultsController = nil;'を忘れました。それが私の問題を解決しました。 'viewWillDisappear:'と 'viewWillAppear:'でやっているのはおそらく過剰です:) –

+0

'真面目なアプリケーションエラー。コアデータの変更処理中に例外が発生しました。「日中、私はgoogleingを開始し、これを再度見つけました。 'viewDidDisappear:'と 'viewWillAppear:'でそれを行うと、私のすべての問題が解決されました。目に見えないNSFetchedResultsControllerがうんざりすると、狂ったことが起きます。私はそれをお勧めしません。 –

関連する問題