2011-02-11 22 views
13

Çekirdek verileri temelli uygulamalar için ortak bir senaryo, yedekleme deposundan benzersiz bir nesne alıyor. Belirli bir benzersiz özelliğe sahip nesne varsa, yeni bir tane oluşturmazsa onu iade edin. Kendimi aynı şeyi tekrar tekrar yazarken buldum, bu yüzden bir kolaylık yöntemine sardım. Ama bu çok önemsiz görünüyor, ben tekerleği yeniden icat ettim mi? Bunu başarmak için daha basit, kullanıma hazır bir yol var mı?Benzersiz Çekirdek Veri varlığı bul veya oluştur

alkış
EP

+(id)uniqueEntityfForName:(NSString *)name 
       withValue:(id)value 
        forKey:(NSString *)key 
    inManagedObjectContext:(NSManagedObjectContext *)context { 

    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];  
    request.entity = [NSEntityDescription entityForName:name inManagedObjectContext:context]; 
    request.predicate = [NSPredicate predicateWithFormat:[key stringByAppendingString:@" == %@"], value]; 
    NSArray *result = [context executeFetchRequest:request error:nil]; 

    id entity = [result lastObject]; 
    if (entity == nil) { 
     entity = [NSEntityDescription insertNewObjectForEntityForName:name inManagedObjectContext:context]; 
     [entity setValue:value forKey:key]; 
    } else { 
     entity = [result lastObject]; 
    } 

    return entity; 
} 

böyle bu yöntemi kullanmak:

SomeEntity *entity = [CDUtils uniqueEntityfForName:@"SomeEntity" withValue:@"foo" forKey:@"bar" inManagedObjectContext:context]; 
+1

geçerli görünüyor. GC olmayan projeler için kullanıldığında olası bellek sızıntısı vardır, çünkü 'request' – diederikh

+0

Tamamen serbest bırakmıyorsunuz! Bellek bırakmaya hala tutarlı olmalıyım. Kodu güncellemek. – epologee

+0

Oldukça standart. Temel veri varlıklarım, [aStudent kayıtForId: (uzun uzun) idValue createIfMissing: YES] gibi birçok yönteme sahiptir. Çekirdek Verilerden daha fazla acı çeken http://rentzsch.github.com/mogenerator/ mogenerator'unu da takmak istiyorum. Diğer şeylerin yanı sıra, veri modelinde tanımlanan her getirme isteği için bir fabrika yöntemi oluşturur. Bu nedenle, örneğin, "thingyId == $ forThingyId" gibi bir getirme yordamı yapmak, eşleşen bir sınıf yöntemi sağlar: + (NSArray *) fetchThingies: (managedObjectContext *) moc forThingyId: (id) thingyId, ne ilk ne yapar orada yazdın. – rgeorge

cevap

3

oldukça standart. Temel veri varlıklarım [aStudent enrollmentForId:(long long)idValue createIfMissing:YES] gibi birçok yöntem kullanıyor.

Ayrıca, Çekirdek Verilerden daha fazla acı çeken mogenerator'u da takmak istiyorum. Diğer şeylerin yanı sıra, veri modelinde tanımlanan her getirme isteği için bir fabrika yöntemi oluşturur.

+(NSArray *)fetchThingies:(NSManagedObjectContext *)moc forThingyId:(id)thingyId 

... İlk yarıyı yapar:thingyId == $forThingyId

eşleşen bir sınıf yöntemi verir: Yani bir yapım

thingies, örneğin modeli gibi yüklemi getir orada yazdığın şeyden.

-(Thingy*)thingyForIdValue:(long long)thingyId 

gibi bir sarıcı ne olursa olsun sınıf sizin managedObjectContext tutan, yazmak için o önemsiz (örneğin. "Parent" varlık veya uygulama temsilci, ya da her neyse.)

+0

mogenerator + kurtarılmış getirme isteği == güzel bir fikir. Teşekkür ederim! –

2

Daha esnek bir çözüm kullanmaktır Iki listeyi karşılaştırırken arayanın 3 durumu ele almasını sağlamak için Blocks.

  1. Eşleştirme veri deposuna bir senkronizasyon moda veya eklemeler yerleştirirken benzer işlevler oluşturmak için gerek yoktur, Bu nedenle
  2. Sunucu eşsiz setleri
  3. Yerel eşsiz setleri

ayarlar.

typedef void (^objectOperationBlock)(NSManagedObjectContext *context, 
           NSDictionary *hostObjectData, 
           NSManagedObject *localManagedObject); 

- (void) insertUniquely:(NSArray *)rawDataArray 
       entity:(NSString *)entity 
      matchedBlock:(objectOperationBlock)matchedOperation 
    hostUnmatchedBlock:(objectOperationBlock)hostUnmatchedOperation 
    localUnmatchedBlock:(objectOperationBlock)localUnmatchedOperation 
        error:(NSError **)outError; 

tam uygulaması

burada bulabilirsiniz: http://emplementation.blogspot.com/2011/12/importing-data-into-core-data-while.html

+0

İyi referans, teşekkürler. – epologee

İlgili konular