2012-05-02 13 views
10

Mi aplicación es como muchas aplicaciones: tiene una pantalla de inicio de sesión donde el usuario ingresa un nombre de usuario y contraseña, y un botón de inicio de sesión Mi aplicación también usa Core Data para guardar la mayor parte los objetos comerciales del usuario, que por supuesto son específicos del usuario.Cómo tratar con una base de datos de múltiples usuarios

También tengo un botón de cerrar sesión para habilitar el cambio de usuarios. Esto no sucede mucho, pero aún es necesario).

Ahora, si un usuario diferente inicia sesión, necesito recuperar sus datos específicos. ¿Pero cómo lo hago?
No quiero eliminar la base de datos de un usuario cuando se desconecta, quiero guardarla incluso si otros usuarios inician sesión desde el dispositivo.

Lo único que puedo pensar es agregar un atributo "ownerId" a cada entidad que guardo a través de Core Data, y usar este atributo como un predicado cuando obtengo objetos.
Pero eso parece demasiado complicado.

Respuesta

21

iOS realmente no tiene un concepto de múltiples usuarios por lo que el "inicio de sesión" tendría un alcance limitado para su aplicación. La solución más simple sería usar un nombre de archivo diferente para la tienda persistente para cada usuario. Esto solo se deriva en un solo lugar (donde sea que configure su pila de datos básicos) por lo que sería bastante sencillo de implementar.

En la plantilla de datos del núcleo estándar, la ubicación de la tienda persistente se establece dentro del método persistentStoreCoordinator del delegado de la aplicación. Es esta línea:

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"coreDataTemplate.sqlite"]; 

Básicamente, esto significa que los datos se almacenan en un archivo de base de datos SQLite en el directorio de documentos, y el archivo se llamará coreDataTemplate.sqlite.

Suponiendo que antes de que se ejecute este código, ha hecho que el usuario inicie sesión, haya comprobado su ID de usuario con una lista y se le ocurra un identificador único. Supongamos además que el identificador ha sido almacenado en los valores predeterminados del usuario.

Cambie la línea anterior a:

NSString *userIdentifier = [[NSUserDefaults standardUserDefaults] stringForKey:@"loggedOnUserID"];  
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:[NSString stringWithFormat:@"%@_coreDataTemplate.sqlite",userIdentifier]]; 

Esto le dará ahora un nombre de archivo único para su usuario.

Si cambia de usuario, tendrá que guardar el contexto actual del objeto administrado, luego establecer el coordinador de la tienda persistente y el contexto del objeto administrado del delegado de la aplicación en cero. Cuando vuelvan a acceder, estarán bajo la nueva identificación de usuario.

+0

Utilizo la plantilla de datos del núcleo de xCode, así que realmente no sé dónde y cómo usar un nombre de archivo diferente, pero parece una muy buena solución. ¿Me puede guiar cómo "restablecer" la tienda persistente y cargar por nombre de archivo diferente? – Eyal

+0

Lo hará, pero no será por un par de horas. – jrturton

+0

Muchas gracias, esperaré :) – Eyal

Cuestiones relacionadas