Несколько моделей данных с одним постоянным координатором хранилища

Я унаследовал проект iOS, который использует Core Data. Этот проект имеет 8 различных моделей данных, не нужно говорить, что проект не такой большой, и что я не вижу веских причин для разделения сущностей на множество моделей данных.

Я пытаюсь использовать Encrypted Core Data с текущими моделями данных и постоянными координаторами хранилищ, и это не работает вообще. Каждая модель данных инициализируется следующим образом:

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"First"
                                              withExtension:@"momd"];

    self.model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    // Coordinator
    //NSPersistentStoreCoordinator *psc = [EncryptedStore makeStore: self.model passcode: @"pass"];
    [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];

    NSURL *storeURL = [[[AppDelegate appDelegate] applicationDocumentsDirectory] URLByAppendingPathComponent: @"First.sqlite"];

    NSError *error = nil;
    [psc addPersistentStoreWithType:NSSQLiteStoreType
                              configuration:nil
                                        URL:storeURL
                                    options:nil
                                      error:&error];

    NSManagedObjectContextConcurrencyType ccType = NSMainQueueConcurrencyType;

    self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:ccType];
    [self.context setPersistentStoreCoordinator:psc];

Таким образом, каждая модель данных имеет свою собственную управляемую объектную модель и свой собственный координатор постоянного хранилища со своим постоянным хранилищем и контекстом.

Я вижу, что Encrypted Core Data (ECD) создает таблицы только в первом созданном постоянном хранилище. Я подозреваю, что ECD обрабатывает только постоянные хранилища, добавленные к одному координатору. Исходя из этого предположения, я задаюсь вопросом, возможно ли создать единого координатора и добавить к нему несколько магазинов.

Я не очень знаком с Базовыми данными, но не понимаю, как это возможно, поскольку координатор инициализируется моделью управляемого объекта (которая указывает на конкретный файл модели данных, содержащий только набор из общего числа объектов в проект).

Есть идеи? Я действительно хотел бы избежать объединения всех моделей данных в одну, чтобы использовать единую управляемую объектную модель и координатор (на самом деле я хотел бы сделать это, но я уверен, что это сломало бы все, и мне действительно не нужно время для этого прямо сейчас).

1 ответ

Решение

Вы не можете использовать один постоянный координатор магазина без объединения моделей. Однако вам не нужно редактировать свои модели данных - вы можете объединить их во время выполнения. NSManagedObjectModel предлагает несколько различных способов объединения нескольких моделей в одну унифицированную модель. Если вы загружаете каждую модель независимо и объединяете их в коде, вы получаете один NSManagedObjectModel представляет объединенную модель из каждого файла модели. Затем вы можете использовать эту комбинированную модель с одним постоянным координатором магазина.

Если вы все еще используете несколько файлов моделей, вы можете добавить каждый из них отдельно. Однако возникает сложность - как Core Data узнает, какой файл модели использовать при создании нового экземпляра объекта модели? Вы должны будете использовать assignObject:toPersistentStore: метод на NSManagedObjectContext сказать ему, какой использовать. Каждый раз, когда вы создаете новый экземпляр, вы также делаете это. Это означает, что вам нужно сохранить ссылки на NSPersistentStore экземпляры для каждого файла, и знать, какой использовать в каждом случае.

Я должен добавить, что я не использовал зашифрованные базовые данные, поэтому я не знаю, решит ли это вашу настоящую проблему. Однако такой подход позволит использовать несколько файлов моделей и несколько постоянных хранилищ с одним координатором.

Другие вопросы по тегам