2011-08-02 11 views
7

Estoy creando múltiples tiendas persistentes en mi aplicación, pero estoy usando solo un coordinador de tienda persistente y un modelo de objetos administrados. Ahora mi pregunta es cuando llamo al método guardar en el contexto del objeto administrado, qué tienda persistente usará para guardar el objeto. Por lo tanto, quiero especificar la tienda persistente que se utilizará para guardar el objeto. Al mismo tiempo que recupero los objetos de la base de datos, quiero asegurarme de que mi consulta de búsqueda se ejecute en una tienda en particular para que solo obtenga objetos de esa tienda. ¿Alguna ayuda?Qué tienda persistente se usa de manera predeterminada en los datos principales en iPhone

Respuesta

4

La recuperación no debería ser un problema. La solicitud de búsqueda puede modificarse para buscar tiendas particulares utilizando el método setAffectedStores: en una NSFetchRequest.

Cuando está creando un objeto, puede asignar la entidad a un almacén particular utilizando el método assignObject: toPersisentStore: en NSManagedObjectContext.

cuanto a su pregunta, no es realmente un mecanismo por defecto que soy consciente de, y puede ser que sólo hay que establecer las tiendas afectadas a todas sus tiendas:

[request setAffectedStores:[NSArray arrayWithObjects:firstStore,secondStore,thirdStore, nil]];

Para asegurarse de que está buscando en todos los lugares correctos.

+0

Hola, me encuentro en una situación similar a la descrita por OP. Estoy usando MagicalRecord y tengo un modelo de objetos, un 'NSPersistentStoreCoordinator', un' NSManagedObjectContext' que es el predeterminado y 2 SQLite 'NSPersistentStore's. Uno de ellos actúa como una tienda permanente y el otro como una tienda temporal. Dentro de la aplicación llené esta tienda temporal. Pero obtengo 0 resultados. Publiqué un problema en MagicalRecord [Github] (https://github.com/magicalpanda/MagicalRecord/issues/976#issuecomment-77516462). ¿Podría echar un vistazo? – Isuru

0

Creo que realmente desea utilizar un PSC para cada tienda. Esto hará que los problemas que describes desaparezcan y realmente no puedo entender por qué querrías tener solo un PSC.

+1

creo que debería ser posible con un PSC. De lo contrario, la provisión de agregar múltiples tiendas en un PSC podría no estar allí. –

+0

Pensé que el propósito de un PersistentStoreCoordinator era coordinar varias tiendas persistentes. A menos que tengan diferentes modelos de objetos gestionados. – daver

5

Puede usar configuraciones.

[PersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:nil error:] 

decir que quiere tener contexto único objeto gestionado, modelo de objeto administrado solo, solo coordinador almacén persistente, pero dos tiendas persistentes, por ejemplo, primero se tienda de SQLite y segunda será una tienda en memoria.

Para esta configuración, crea dos configuraciones, "SQLiteStore" para la tienda SQLite e "InMemoryStore" para la tienda en memoria. En XCode (abrir su archivo .xcdatamodel):

.xcdatamodel file in XCode

que vea lista de configuraciones disponibles de su modelo de objeto gestionado. La configuración del modelo de objetos gestionados es básicamente un conjunto de descripciones de entidades asociadas con un nombre de cadena. Para agregar configuración use Editor -> Agregue el elemento del menú principal Configuration mientras tiene abierto el archivo .xcdatamodel, luego escriba un nombre de cadena que prefiera. Arrastre las entidades que desea almacenar en el primer almacén de SQLite a la configuración de "SQLiteStore" y otras a la configuración de "InMemoryStore".

Ok, eso es todo, ahora es el momento de actualizar su código. Vaya al ámbito, donde crea un coordinador de tienda persistente y agrega tiendas persistentes. El único cambio es la especificación de configuración para ellos:

... 
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:yourManagedObjectModel]; 
NSURL storeURL = … // your store url 
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"SQLiteStore" URL:storeURL options:nil error:&error]) 
{ 
    NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
}  

if (![__persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:@"InMemoryStore" URL:nil options:nil error:&error]) 
{ 
    NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 
... 

Eso es todo ahora, todas las entidades que ha arrastrado por la configuración "InMemoryStore" se guardarán automáticamente al almacén persistente en memoria y lo mismo pasa con "SQLiteStore". Tal vez tengas que volver a instalar tu aplicación en el dispositivo/simulador después de eso.

Y una hoja de vida rápida:

  1. crear configuraciones en editor del modelo de objeto administrado (.archivo xcdatamodel);
  2. En el código, agregue varias tiendas persistentes al coordinador de tienda persistente, proporcionando el nombre de configuración apropiado.

Comprobar este enlace para más información: http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-SW4

Cuestiones relacionadas