SORU
13 Mayıs 2011, Cuma


Örnek veya birden fazla geçiş ile Temel Veri taşıma açıklanması?

İPhone uygulamam çekirdek veri deposu geçirmek gerektiğini ve veritabanlarının bazıları oldukça büyük. Apple's documentation suggests using "multiple passes" to migrate data to reduce memory use. Ancak, belgelere çok sınırlı ve aslında bunu yapmak için ne kadar çok şey açıklamıyor. Birisi iyi bir örnek doğru bana gelin, ya da ayrıntılı olarak aslında bu işi nasıl süreci açıklayabilir mi?

CEVAP
23 Mayıs 2011, PAZARTESİ


Apple kendi documentation ipuçları ne çözdüm. Aslında çok kolay ama önce gitmek için uzun bir yol açık. Bir örnek ile açıklama göstermek istiyorum. İlk durum bu

Veri Modeli Sürüm 1

enter image description here enter image description here

Çekirdek veri depolama ile "tabanlı navigasyon uygulaması" şablon. ile bir proje oluşturduğunuzda olsun model Ve döngü etrafında 2k girişleri biraz farklı değerlerle oluşturmak için sabit bir yardım ile vurmak mı biraz toparladım. Orada 2.000 NSDate değeri olan olayları gidiyoruz.

Şimdi şöyle bir veri modeli, ikinci bir versiyonunu ekliyoruz:

enter image description here

Veri Modeli Sürüm 2

Fark: varlık gitti, ve iki yenileri geliyor Olay. double NSString tarih olarak depolanması gereken ikinci olarak bir zaman damgası saklayan biri.

Amaç tüm aktarmaktırSürüm 1Olaylar iki yeni kurum ve göç boyunca değerleri dönüştürme. İki kez bu sonuçları ayrı bir Taraf içinde farklı bir tür olarak her değerleri.

Göç etmek, elle göç ve yaptığımız bu eşleştirme modelleri ile seçiyoruz. Bu da Sorunuzun cevabı ilk parçasıdır. Uzun 2k girişleri göç alıyor çünkü iki adımda geçiş yaparız ve bellek ayak izi, düşük tutmayı severiz.

Devam edin ve bu eşleme modelleri, daha bölünmüş yalnızca varlıkların aralıkları geçirilecek. Bir milyon kayıtları var, bu tüm süreç çökebilir söylüyorlar. Mümkün varlıklar Filter predicate ile getirilen dar.

İki eşleme modellerimiz için geri.

Bu gibi ilk eşleme modeli oluşturuyoruz:

1. Yeni Dosya ->Kaynak ->Eşleme Modeli enter image description here

2. Bir isim seçin, StepOne seçtim

3. Kaynak ve hedef veri modeli ayarlayın

enter image description here

Eşleme Modeli Bir Adım

enter image description here

enter image description here

enter image description here

Multi-pass geçiş özel varlık göç politikaları, ancak bu örnek için biraz daha fazla ayrıntı için yapacağız ihtiyacı yok. Varlık için özel bir politika ekliyoruz. Bu her zaman NSEntityMigrationPolicy sınıfıdır.

enter image description here

Bu ilke sınıf geçiş yapmak için bazı yöntemler uygular. Tek bir yöntemi uygulamak zorunda kalacak, böylece bu durumda basit ancak: createDestinationInstancesForSourceInstance:entityMapping:manager:error:.

Uygulama bu gibi görünecektir:

StepOneEntityMigrationPolicy.m

#import "StepOneEntityMigrationPolicy.h"


@implementation StepOneEntityMigrationPolicy

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance 
                                      entityMapping:(NSEntityMapping *)mapping 
                                            manager:(NSMigrationManager *)manager 
                                              error:(NSError **)error
{
    // Create a new object for the model context
    NSManagedObject *newObject = 
        [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] 
                                      inManagedObjectContext:[manager destinationContext]];

    // do our transfer of nsdate to nsstring
    NSDate *date = [sInstance valueForKey:@"timeStamp"];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];    

    // set the value for our new object
    [newObject setValue:[dateFormatter stringFromDate:date] forKey:@"printedDate"];
    [dateFormatter release];

    // do the coupling of old and new
    [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping];

    return YES;
}

Son adım: geçiş kendisi

Hemen hemen aynı, sadece bir timeİntervalSince1970 bir çift için NSDate dönüştürmek için kullanılan ikinci eşleme modeli ayarlama kısmı es geçeceğim.

Nihayet göç tetikleyiciye ihtiyacımız var. Şu an için demirbaş kodu geçeceğim. Eğer ihtiyacınız varsa, burada göndeririz. Sadece Customizing the Migration Process bulunan ilk iki kod örnekleri birleştirebilirsiniz. Üçüncü ve son bölümü olacak değişiklik şöyle: Yerine sınıf yöntemi NSMappingModel sınıf mappingModelFromBundles:forSourceModel:destinationModel: kullanılır initWithContentsOfURL: çünkü sınıf yöntem döndürür bir tek, belki de ilk, bulduğunuz eşleme modeli paket.

Şimdi lopp her geçişte kullanılacak ve geçiş yöneticiye yöntemi geçirme göndermek için iki eşleme modelleri var. İşte bu kadar.

NSArray *mappingModelNames = [NSArray arrayWithObjects:@"StepOne", @"StepTwo", nil];
NSDictionary *sourceStoreOptions = nil;

NSURL *destinationStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataMigrationNew.sqlite"];

NSString *destinationStoreType = NSSQLiteStoreType;

NSDictionary *destinationStoreOptions = nil;

for (NSString *mappingModelName in mappingModelNames) {
    NSURL *fileURL = [[NSBundle mainBundle] URLForResource:mappingModelName withExtension:@"cdm"];

    NSMappingModel *mappingModel = [[NSMappingModel alloc] initWithContentsOfURL:fileURL];

    BOOL ok = [migrationManager migrateStoreFromURL:sourceStoreURL
                                               type:sourceStoreType
                                            options:sourceStoreOptions
                                   withMappingModel:mappingModel
                                   toDestinationURL:destinationStoreURL
                                    destinationType:destinationStoreType
                                 destinationOptions:destinationStoreOptions
                                              error:&error2];
    [mappingModel release];
} 

Notlar

  • Eşleme modeli paket cdm biter.

  • Hedef depolanması sağlanacak ve kaynak deposu olmamalıdır. Başarılı geçişten sonra eski silmek ve yeni bir yeniden adlandırabilirsiniz.

  • Sadece eşleme modelleri eğlence ile çözebileceğimi bazı uyumluluk hataları, sonuçlandı, bu eşleştirme modelleri oluşturulduktan sonra veri modeli, bazı değişiklikler yaptım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • Lamborghini

    Lamborghini

    13 Aralık 2005
  • LinusTechTips

    LinusTechTip

    25 Kasım 2008