2011-08-08 10 views
5

hi yenilemez :) Ben benzer gibi sorunu var içinde Working with the same NSManagedObjectContext in multiple tabs
arkaplan:
Benim managedObjectContext (daha fazla MOC) benim AppDelegate sınıfında başlatıldı ve
myViewController.managedObjectContext = self.managedObjectContext; veya birden fazla sekmelere düşünce geçirilir self.managedObjectContext = pContext; ile init yönteminde akış şu şekildedir: ilk görünüm basit bir koleksiyon listesidir. Kolleksiyonlar bir NSFetchedResultsController (myViewController : UITableViewController<NSFetchedResultsControllerDelegate>) ile getirilir. Birini seçerek daha derine inersiniz, ancak yine de bu MOC'yi geçersiniz.
Bir sonraki denetleyicide (detailsViewController) Bu koleksiyonda etkileşimde bulunabileceğim bazı öğeleri listeliyorum (örneğin, anahtarlar için).
ŞimdiNSManagedObjectContext doğru

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

sorunumu:
Ben de bir editingObjectContext var benim görünümü vardır çünkü ben folowing hile kullanıyorum döndürmek için: Daha fazla

// 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; 

bu öğeleri yönetmek için bir düğme var (hangileri gösterilip gösterilmeyecektir). Bu düğme, tabloyu yeni bir getirme ile yeniden yükler.

// 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]; 
} 

ama yönetilen görünümünde öğeleri seçilir ve (manageItems) tasarruf tıkladıktan sonra, görünüm bunları göstermiyor:

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

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

[self reloadData]; 
[self updateBarButton]; 
} 

bağlam içine öğeleri koymak için yöntem bu yüzden görünüyor :/sekmesini değiştirmek veya gerçekleştirmek için başka bir denetleyicide (ana veya daha derin) gezinmek zorundayım. benim viewWillAppear yöntemi:

// 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] 
} 

ve viewWillDisapper işe yaradı sadece 1 görüntüleme vardı bir earliert Sürümünün yılında

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

// send save-command to server 
} 

çağırır ve ben ... gerçekten çok değişmedi:/bu yüzden don MOC'nin neden yaptığı gibi davrandığını anlayamıyorum. "ManageItems" bölümü hemen hemen eşittir, yeni sürümde (kontrolörün DetailsView dosyasında) sadece bir seviye daha derindir ...

Birisi bana ne deneyebileceğimi söylerse (her zaman geçiş yaparken sunucuya kaydedilir) yönetme ve normal arasında bir çözüm değildir çünkü sunucudaki yanıttaki gecikme yenileme için daha yüksek, bu yüzden görünümü çevirmek için daha az seçeneğim var.Ayrıca self.tableView/detailView/self.containerView yenilemesiyle görünümleri yeniliyor aynı sonucu getirir: /).

ve ikinci bir sorunu: hatalar atıyor çünkü sunucuya gönderdikten sonra yöntemi ve yerel veritabanına hiç kaydetmek yoktur: Ben "editingObjectContext kaydet" diyemezsin. handleChangeResponse içinde

Hata: "operasyonu tamamlanamadı (Kakao hata 133020.)" Hata Alan = NSCocoaErrorDomain Kodu = 133020 Userınfo = 0x4d8bb90 {conflictList = ( "NSMergeConflict (0x5a2fac0) NSManagedObject için (0x5a46a80) with objectID '0x5a46420' ile oldVersion = 7 ve newVersion = 8 ve eski nesne snapshot = {\ n iconName = noicon; \ n [...]; \ n} ve yeni önbelleğe alınmış satır = {\ n iconName = noicon; \ n [...] \ N}" )}

Sorularınız varsa veya sonra sadece isteyin) eski sürümü yani (bazı daha fazla kod gerekiyorsa;) beklentisiyle

teşekkürler :)

+0

tamam, flipview ile çalışan bir sürümünü buldum ... daha önce kodu yeni olana kopyaladım, ama yine de aynı sorun ...:/ '- (void) manageItems/* AyrıntılarGörüntüleyici */ { \t AyrıntılarView * detailView = isSen? senView: actView; \t [detayViewItems]; } ' --- (void) manageItems // AyrıntılarView { \t managing =! Managing; \t [viewController setIsManaging: managing];/* parent */ \t self.fetchedResultsController = nil; \t NSError * error = nil; \t [[self fetchedResultsController] performFetch: & error]; \t [viewController.containerView reloadData]; \t [self updateBarButton]; } ' – geo

cevap

6

Çözüme sahip gibi görünüyor! (AppDelegate içinde benim durumumda)

[managedObjectContext setMergePolicy:NSMergeByPropertyStoreTrumpMergePolicy]; 

üst düzey MOC Bu özelliğin http://pauloliveira.net/tech/core-data-merging-conflicts
Bulundu ve hiçbir yerde başka: IOS 5.0 yana yeni NSManagedObjectContext yöntemi var! birleştirme sorunlarımı temizler;)

+0

setMergePolicy: iOS 3.0 sürümünden edinilebilir – rowwingman

0

buldum Ben de

[NSComparisonPredicate predicateWithLeftExpression: ...] 

kullanılan önceki sürümlerinde ... yüklemi: somut - bu ... Ben yukarıda yazdıklarımı her şeyi unutmak yok çalıştı nedeni ... sorun fetchrequest oldu gerçek ver Seçeneklerin sayısının artırılması vardı ve bir veri tabanına elde MOC sınıfının bir bütün nesneyi (,) karşılaştırılması (yüklemi sorunları yapmış da isteği kendisi tarafından düzenlendiği için yon I

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

kullanımı varlık işe yaramadı, bu yüzden DetailsViewController'daki geçici çözümü yönettim ve güncellemeleri bu yerde geri almadım: /).
Bu problem üzerinde çok fazla zaman harcamayı düşünmediniz>. < fakat tamam, çözüldüğü sürece: D

İkinci sorunun (kaydetme sorunuyla) hala mevcut olup olmadığını kontrol edeceğim. Değilse, gönderimimi güncelleyeceğim, aksi halde bu konu kapalı değil:/

0

Bunun nedeni, bunu elde edeceğiniz nesnenin kullanımındaki manageobject içeriğinden kaynaklanabilir. Oturduğunuz veya geri döndüğünüzde tüm NSManagebobject öğelerini kaldırın. uygulamayı kullanarak son. Böyle görünüyor ...

[NSManagebobjectcontext setManagedObjectsDictionary:[NSMutableDictionary dictionary]];