2011-08-08 23 views
5

喜:)我有一个类似的发行像Working with the same NSManagedObjectContext in multiple tabs
背景:
我managedObjectContext(进一步MOC)被初始化在我的appDelegate类和
myViewController.managedObjectContext = self.managedObjectContext;或通过throught到多个标签在初始方法self.managedObjectContext = pContext; 的流程是:第一个视图是一个简单的集合列表。这些集合是通过NSFetchedResultsController(myViewController : UITableViewController<NSFetchedResultsControllerDelegate>)获取的。通过选择一个,你可以更深入地浏览,但仍然通过这个MOC。
在下一个控制器(detailsViewController)中列出了我可以与之交互的一些项目(例如设置开关)。
我也有一个editingObjectContext:
的NSManagedObjectContext不会刷新正确

// DetailsViewController.m 
NSManagedObjectContext* editingContext = [[NSManagedObjectContext alloc] init]; 
[editingContext setPersistentStoreCoordinator:[managedObjectContext persistentStoreCoordinator]]; 
self.editingObjectContext = editingContext; 

现在我的问题:因为我的观点有旋转,我现在用的是如下因素绝招:

// DetailsViewController.m 
DetailsView *localAct = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ] 
DetailsView *localSen = [[DetailsView alloc] initWithManagedObjectContext:managedObjectContext ... ] 

UITableView *localContainerView = [[UITableView alloc] init]; 
self.containerView = localContainerView; 
[localContainerView release]; 
//[...] 
[containerView addSubview:actuatorView]; 
self.tableView = containerView; 

进一步我有一个按钮来管理这个项目(哪些应显示,哪些不显示)。这个按钮只是重新载入一个新的fetchResult表。

// DetailsView.m 
- (void) manageItems{ 
managing = !managing; 
[viewController setIsManaging:managing]; // parent 
self.fetchedResultsController = nil; 

NSError *error = nil; 
[[self fetchedResultsController] performFetch:&error]; 

[self reloadData]; 
[self updateBarButton]; 
} 

用于放置物品进入情境的方法看起来如此:

// DetailsViewController.m 
(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
// init + create predicate 
NSSet* set = [sen filteredSetUsingPredicate:predicate]; 
if([set count] > 0) 
{ 
    for(Act* act in set) 
    { 
     [editingObjectContext deleteObject:act]; 
    } 
} 
else 
{ 
    Act* act = [NSEntityDescription insertNewObjectForEntityForName:@"Act" inManagedObjectContext:editingObjectContext]; 

    // do things 
} 
NSError *error = nil; 
[[detailView fetchedResultsController] performFetch:&error]; 

[self.containerView reloadData]; 
[detailView reloadData]; 
} 

,但我选择的项目后的管理视图并点击保存(manageItems),视图不显示他们:/我必须切换选项卡或在其他控制器(父级或更深级)中导航以实现它。 我viewWillAppear中方法:

// DetailsViewController.m 
- (void)viewWillAppear:(BOOL)animated 
{ 
[super viewWillAppear:animated]; 
DetailsView *detailView = se ? senView : actView; 
// [do uninteresting stuff] 
[detailView.fetchedResultsController performFetch:nil]; 
[self.tableView reloadData]; 
// [do uninteresting stuff] 
} 

和viewWillDisapper调用

- (void)saveChanges 
{ 
if(![editingObjectContext hasChanges]) 
    return; 

// send save-command to server 
} 

在earliert Verison那里是只有1查看它的工作和我没有改变真的多...:/所以我不不明白为何MOC的行为就像它一样。 “manageItems”部分几乎相等,它在新版本(在DetailsView中而不是控制器中)只有更深的级别...

如果有人能告诉我我可以尝试什么(切换时总是保存到服务器在管理和正常之间不是一个解决方案,因为从服务器的响应延迟刷新高,所以我有更少的翻转视图。同时刷新self.tableView/detailView/self.containerView刷新视图带来相同的结果:/)。

第二个问题:发送到服务器后,我无法调用“editingObjectContext save:”方法,因为它抛出错误,根本不保存到本地数据库。

错误handleChangeResponse: “该操作不能完成(可可错误133020.)” 错误域= NSCocoaErrorDomain代码= 133020的UserInfo = 0x4d8bb90 {conflictList =( “NSMergeConflict(0x5a2fac0)为NSManagedObject( 0x5a46a80),其中oldVersion = 7和newVersion = 8,旧对象快照= {\ n iconName = noicon; \ n [...]; \ n}和新缓存行= {\ n iconName = noicon; \ n [...] \ n}” )}

如果您有疑问或需要更多的代码(即旧版本),然后就问;)

感谢在期待:)

+0

好吧,我发现一个版本,与flipview工作...已经复制到新的代码,但仍然是同样的问题...:/ - ' - (void)manageItems/* DetailsViewController */ { \t DetailsView * detailView = isSen? senView:actView; \t [detailView manageItems]; }' --- ' - (void)manageItems // DetailsView { \t managing =!managing; \t [viewController setIsManaging:managing];/*父*/ \t self.fetchedResultsController = nil; \t NSError * error = nil; \t [[self fetchedResultsController] performFetch:&error]; \t [viewController.containerView reloadData]; \t [self updateBarButton]; }' – geo

回答

6

看起来好像我有解决方案!由于IOS 5.0有对的NSManagedObjectContext的新方法:(在的appDelegate在我的情况)

[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; 

上找到http://pauloliveira.net/tech/core-data-merging-conflicts
该属性设置为顶级MOC和没有别的地方!清除我的合并问题;)

+0

setMergePolicy:可从iOS 3.0 – rowwingman

0

我发现为什么它不工作?什么都忘记了我上面写的理由......问题是在fetchrequest - 具体:在谓语......在早期版本我在使用

[NSComparisonPredicate predicateWithLeftExpression: ...] 

实际版本锡永我使用

NSString * predicateFormat = [NSString stringWithFormat: ...]; 
NSPredicate* predicate = [NSPredicate predicateWithFormat:predicateFormat]; 

因为我不得不延长的选项的数目并且还编辑请求本身,因为它在谓词制成问题(与比较完整的对象(MOC类的,从数据库中提取)实体没有工作,所以我管理DetailsViewController中的解决方法,并没有在这个地方回滚我的更新:/)。
从来没有想过浪费这么多时间在这个问题上>。 <但没关系,只要它解决了:D

我会检查第二个问题(与保存问题)是否仍然存在。如果没有,我会更新我的帖子,否则这个主题不会关闭:/

0

这可能是由于管理对象上下文在使用的对象,你得到这个。在注销或移回时删除所有NSManagebobject。说结束使用应用程序。看起来像这样...

[NSManagebobjectcontext setManagedObjectsDictionary:[NSMutableDictionary dictionary]];