Várias (duas) lojas persistentes podem ser usadas com um modelo de object, mantendo as relações de uma para a outra?

Introdução

Meu projeto iOS é fornecido com um armazenamento persistente do Core Data com cerca de 160 MB no formato SQLite. Há uma tonelada de informações agrupadas, nas quais os usuários devem poder marcar favoritos. Para isso, preciso (pelo menos em parte) do database ter resources de gravação. Mas é claro que os armazenamentos persistentes que são fornecidos no pacote de aplicativos são, por design, somente leitura.

Se você quiser que a loja tenha resources de leitura / gravação, copie-a para, por exemplo, a pasta de documentos do aplicativo. Eu não quero fazer isso, porque o aplicativo teria o dobro do tamanho, enquanto a parte principal desse database é somente de leitura. Isso seria um desperdício de resources.

Vários armazenamentos persistentes para NSPersistentStoreCoordinator

É por isso que pensei em usar dois armazenamentos persistentes. O primeiro seria o maior do pacote, e o segundo poderia ser um pequeno na pasta de documentos, armazenando entidades “favoritas” especiais com relação à grande loja.

Eu sei que algo é possível a esse respeito, mas não consigo encontrar os detalhes. Deve-se usar apenas várias lojas, se você também tem vários modelos de object? Um modelo de object pode ser ‘distribuído’ em dois armazenamentos persistentes? Ao navegar pelos documentos da Core Data Programming , não consigo encontrar nenhuma referência real sobre como configurar isso. Também o livro de Marcus Zarra não parece se aprofundar neste tópico:

É possível adicionar mais de um NSPersistentStore ao NSPersistentStoreCoordinator, o que pode ser útil ao lidar com dados divididos em vários arquivos. No entanto, em nosso exemplo, temos um único arquivo. ( Marcus Zarra: “Core Data – API da Apple para persistir dados no Mac OS X” página 71 )

A questão

Quem poderia me dizer se o que estou pensando é possível com o Core Data e vários armazenamentos persistentes? E você poderia, talvez, fornecer uma sugestão sobre como conseguir isso? Recursos online / offline que lidam com o tema são muito apreciados também.

A resposta é sim. O @Caleb aponta para os resources certos, mas fazê-lo funcionar ainda é bastante complicado. Eu pensei em colocar um currículo aqui:

Para que duas instâncias do NSPersistentStore compartilhem o mesmo modelo, você precisa adicionar uma configuração ao seu modelo, que é um subconjunto de nome de string das entidades:

Configurações do modelo

No modelo, para uma entidade que pertence ao segundo armazenamento, você adiciona uma propriedade buscada ( NSFetchedPropertyDescription para googlability). Este é um procedimento armazenado muito simples, e pode ser assim:

Formato NSPredicate para a propriedade buscada

Então, quando você adiciona as lojas ao seu coordenador de armazenamento persistente, você usa as cadeias para o argumento de configuration (mais informações sobre as opções aqui ):

 [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"ModifyInBackground" URL:storeURL1 options:options error:&error] [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"ModifyInMain" URL:storeURL2 options:options error:&error] 

Finalmente, quando você quer ir da entidade na loja B para a entidade na loja A, você aciona a propriedade buscada como você acionaria uma falha, apenas acessando-a.

Nota: Uma propriedade buscada sempre retorna um NSArray, porque o predicado que você escreve para estabelecer o link pode ter vários resultados. Se você deseja obter apenas uma entidade, pode colocar algo assim em um método wrapper de sua subclass NSManagedObject :

 Wallpaper *recordedWallpaper = [record.wallpaper lastObject]; 

Sim, você pode usar várias lojas para um único modelo, mas não pode criar relacionamentos entre objects em diferentes lojas. Procure a seção Cross Store Relationships no guia Core Data Programming, que diz essencialmente isso e recomenda o uso de propriedades buscadas se você precisar relacionar um object em um armazenamento a um object em outro.

Um pensamento: você pode querer criar lojas diferentes e também diferentes coordenadores de lojas persistentes para cada loja. Em seguida, crie diferentes contextos de objects gerenciados para cada parte do modelo. Então, digamos, eu tenho um modelo com 3 entidades: estudante, faculdade e cursos. Suponha que eu queira armazenar entidades Student e college em store1 e Course in Store2, eu teria 2 conjuntos de managedObjectContext, persistant store e persistent cordinator. Agora, dado que não podemos ter nenhuma relação cruzada, modificações em um contexto não afetam outro contexto. Você não precisa criar modelos diferentes ou associá-los a lojas -etc.

Intereting Posts