2013-02-14 18 views
5

Bazı arka plan: Ben yerel DB veri büyük miktarda depolamak için çalışıyorum ve mümkün olduğunca verimli yapmak istiyorumrefreshObject bazı açıklamalar Need EVET

.

Senaryo:

adres böyle bir kişiyle ilişkili olduğundan birbiriyle ilişkilidir birçok varlık vardır:

adresi < < -> kontak

İlişkileri yönetmek için, NSManagedObject öğesinin her bir alt sınıfında bir yöntem yazdım, aşağıdaki kod snippet'i aşağıdadır:

// class Contact 
- (void)manageRelationships 
{ 
    @autoreleasepool { 
     LocalDBManager *localDBManager = [[LocalDBManager alloc] init]; 

     // managing relationships 

     // map associated addresses 

     NSPredicate *addressIdPredicate = [NSPredicate predicateWithFormat:@"%K == %@",ADDRESSID,self.addressid]; 

     // below method returns an object as fault by firing a fetch request against context 
     NSSet *retrievedAddresses = [localDBManager retrieveManagedObjectsForEntity:ADDR_ENTITY withPredicate:addressIdPredicate asFault:YES withPropertyValues:NO error:nil]; 
     self.addresses = retrievedAddresses; 


     // managing few more relationships   
    } 

} 

Nokta dikkate almak: bir nesne için birden ilişkiler olabilir

beri, ben haritalama ilişkileri olacak zaman bellek tüketimi artacaktır biliyoruz.

Soru:

Ben ilişkileri eşleştirilir kez herhangi bir değişiklik yapılmış kaybetmeden, arıza içine bir nesne geri çevirmek istiyoruz.

Apple belgelerinden ve bazı örneklerden, refreshObject: mergeChanges: yöntemini kullanabileceğimi öğrendim. Bu yüzden manageRelationships yönteminde kod bloğunun sonunda sınırının altında eklemeyi planlıyorum:

[[self managedObjectContext] refreshObject:self mergeChanges:YES]; 

karıştı biraz benim ve bilmesini istiyorum -

ne olursa olsun değişiklik yapılmadı anlamına mı Nesne kalıcı depoda saklanacak olacak ve sonra nesne bir hataya dönecek? evet, o zaman bunun eşdeğeri ait

NSManagedObjectContext

yöntemi kurtarmak için düşünün Eğer önerin.

+0

! Bu senaryo için herhangi bir çözüm buldunuz mu? – Bucket

cevap

11

Her şeyden önce ilişkileri kendiniz yönetmeniz gerekmez. CoreData bununla başa çıksın.

Çekirdek Verileri, arızalı verilere eriştiğinizde hatayı otomatik olarak çözer (tetikler). numaralı tembel yükleme, ilgili nesneler, bellek kullanımı için çok daha iyidir ve nadiren kullanılan (veya çok büyük) nesnelerle ilgili nesneleri almak için çok daha hızlıdır. CoreData performance

Sen kontak-adresi arasındaki basit başlatmasını bire çok ilişkisi ile bunu yapabilirsiniz.

refreshObject: mergeChanges: ile ilgili yanılıyorsunuz.Kaydetmek için bir eşdeğer değildir: yöntem. EVET sadece demektir değişiklikleri birleştirmek ayarlarsanız o: ​​bayrağı EVET, daha sonra nesnenin özellik değerleri mağaza veya son önbelleğe halde yerel (yapılmıştır sonra herhangi bir değişiklik gelen değerlerden doldurulduğunda ise

bağlam), (şimdi güncellenen) değerler üzerinden yeniden uygulanır. Nesne A'nın daha hala kaydedilmemiş bir halde kalacağını sonra yönetilen nesne A'da bazı değişiklikler yaptı ve eğer Cocoa touch Doc

Yani [: A mergeChanges EVET bağlam refreshObject] yaptı. Aynı sorunu almak için

+0

Merhaba Mark .. açıklama için thnx :-) – Devarshi

İlgili konular