2009-11-07 17 views
5

Quiero utilizar Core Data como memoria caché para un conjunto de datos más grande en un servidor de base de datos. No todos los datos estarán en la memoria.Datos principales con almacenamiento en memoria

Al pensar en esta otras 2 preguntas vinieron a la mente:

  1. puede fallamiento (por ejemplo, para 1-n relaciones) se utiliza con el almacenamiento persistente en memoria, y si es así, ¿cómo ¿Atrapar una falla disparando?

  2. A El contexto del objeto gestionado de datos centrales tiene un intervalo de ranciedad. ¿Esto también es aplicable a una tienda en memoria?

¿O debería usar un NSAtomicStore para este propósito?

+0

Casi suena como lo que realmente quiere hacer es implementar su propia capa de almacenamiento: objetos gestionados que fallan de nuevo a un almacén persistente que es su servidor de base de datos. –

+0

Sí, pero la única forma de hacerlo es NSAtomicStore (en Mac OS X 10.5+) y luego debe cargar todo en AFAIK a la vez. – diederikh

Respuesta

11

Su primera pregunta sugiere que malinterpretó la intención de NSInMemoryStore tipo de tiendas persistentes. Son la parte persistente de la pila de Datos centrales. La falla es algo que sucede cuando traes instancias a un contexto de objeto administrado; se crea un error que dispara y se rellena desde el caché NSPersistentStoreCoordinator o el almacén persistente subyacente cuando se activa. Un almacén en memoria no cambia la relación de fallas. Obviamente, realmente no ayudará a su problema, sin embargo, ya que tendrá que persistir todos los datos en la memoria. Las tiendas en memoria son realmente apropiadas para (1) probar (son rápidas) y (2) raspar las pilas de datos centrales en las que desea utilizar la gestión de gráficos de objetos de Core Data sin tener que mantener nada en el disco.

En respuesta a su segunda pregunta, la respuesta es SÍ. El intervalo de estancamiento se aplica al contexto, no a la tienda persistente.

Entonces, ¿son los datos centrales apropiados para el almacenamiento en caché de datos desde un servidor de base de datos remoto? Realmente no. Aunque Bill Bumgarner (un ingeniero de Apple) ha insinuado que es posible, he encontrado que es mucho más fácil en mi propio código separar el almacenamiento en caché de la gestión de gráficos de objetos de Core Data. Todavía es muy agradable utilizar los datos centrales para gestionar un gráfico de objetos y para enlazarlos con facilidad a una (s) capa (s) de controlador/interfaz de usuario. Entonces mi estrategia es extraer datos del servidor de la base de datos y almacenarlos en mi propia estructura de datos (el libcache y NSCache en OS X 10.6 podrían ser un buen punto de partida). Luego, decida qué quiere en su gráfico de objetos y migre eso a una pila de datos centrales (respaldada por una tienda persistente en memoria). Tendrá que manejar la notificación de cambio o sondeo desde el servidor de la base de datos usted mismo. Cuando los datos de la base de datos cambian (o la consulta del usuario cambia, etc.), solo digo a todos los editores que finalicen la edición, luego borro el contexto y lo reconstruyo desde el caché (posiblemente) actualizado.

+0

Tiene razón, por alguna razón pensé que la tienda en memoria manejaría los pensamientos de manera diferente con los contextos (para evitar tener el objeto en la memoria dos veces). Pero este no es el caso, por supuesto. También eché un vistazo a NSAtomicStore para cargar cosas en el caché del coordinador de tienda de persistencia. El problema que veo es que no tengo forma de controlar la caducidad de los objetos (no quiero cargar toda la base de datos en la caché). Quiero más o menos el mismo comportamiento que la tienda Sqlite. Con NSCache puedo ver que establezca un límite para el número máximo de objetos sin el caché. Eso es bueno. – diederikh

+0

@barrywark, de acuerdo con su respuesta, ¿estoy en lo cierto con que las balas de datos raspados 2 "en las que desea usar la gestión de gráficos de objeto de Core Data sin tener que mantener nada en el disco" significan "si desea almacenar la pila de datos centrales en memoria antes de guardar en el disco en caso de falta de disco o almacenamiento "? Entonces, en algunos casos, si quiero almacenar datos en la memoria (porque el disco no está disponible), podría almacenar datos en la memoria. – gaussblurinc

Cuestiones relacionadas