ios - temporales - Borrar la base de datos completa de Realm
eliminar otros iphone 6 (5)
A partir del dominio 0.87.0 , ahora es posible eliminar todos los contenidos del reino llamando a [[RLMRealm defaultRealm] deleteAllObjects]
desde una transacción de escritura.
Desde Swift, se ve así: RLMRealm.defaultRealm().deleteAllObjects()
Estoy jugando con el reino (actualmente 0.85.0) y mi aplicación usa la base de datos para almacenar datos específicos del usuario, como los contactos del usuario actual. Cuando el usuario decida desconectarse, necesito eliminar cada bit de información sobre el usuario y lo más obvio, simple y limpio en mi opinión sería limpiar todo el reino. Desafortunadamente, la lib de Cocoa no proporciona esa funcionalidad.
Actualmente, estoy atrapado con el siguiente
RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm deleteObjects:[MyRealmClass1 allObjectsInRealm:realm]];
[realm deleteObjects:[MyRealmClass2 allObjectsInRealm:realm]];
[realm deleteObjects:[MyRealmClass3 allObjectsInRealm:realm]];
[realm commitWriteTransaction];
alguna mejor idea?
Gracias
En caso de que alguien tropiece con esta pregunta buscando la manera de hacerlo en Swift, esta es solo la respuesta de DonamiteIsTnt reescrita. He agregado esta función a una clase de utilidad personalizada para que pueda hacer MyAppUtilities.purgeRealm()
durante las pruebas y la depuración
func purgeRealm() {
NSFileManager.defaultManager().removeItemAtPath(RLMRealm.defaultRealmPath(), error: nil)
}
Nota: Si necesita borrar los datos, puede verificar la nueva función realm.addOrUpdateObject()
que le permite reemplazar los datos existentes por su clave principal con los datos nuevos. De esta forma, no agrega continuamente datos nuevos. Solo reemplazando datos "viejos". Si usa addOrUpdateObject()
asegúrese de anular la función de clase primaryKey
su modelo para que Realm sepa qué propiedad es su clave principal. En Swift, por ejemplo:
override class func primaryKey() -> String {
return "_id"
}
Me encontré con este pequeño problema divertido. Así que, en su lugar, consulté la versión de esquema directamente antes de ejecutar schemamigration.
NSError *error = NULL;
NSUInteger currentSchemaVersion = [RLMRealm schemaVersionAtPath:[RLMRealm defaultRealmPath] error:&error];
if (currentSchemaVersion == RLMNotVersioned) {
// new db, skip
} else if (currentSchemaVersion < 26) {
// kill local db
[[NSFileManager defaultManager] removeItemAtPath:[RLMRealm defaultRealmPath] error:&error];
if (error) {
MRLogError(error);
}
} else if (error) {
// for good measure...
MRLogError(error);
}
// perform realm migration
[RLMRealm setSchemaVersion:26
forRealmAtPath:[RLMRealm defaultRealmPath]
withMigrationBlock:^(RLMMigration *migration, NSUInteger oldSchemaVersion) {
}];
Actualizar:
Desde la publicación, se ha agregado un nuevo método para eliminar todos los objetos (como ya ha mencionado jpsim):
// Obj-C
[realm beginWriteTransaction];
[realm deleteAllObjects];
[realm commitWriteTransaction];
// Swift
try! realm.write {
realm.deleteAll()
}
Tenga en cuenta que estos métodos no alterarán la estructura de datos; solo eliminan los registros existentes. Si está buscando alterar las propiedades del modelo del reino sin escribir una migración (es decir, como lo haría en el desarrollo), la solución anterior puede ser útil.
Respuesta Original:
Simplemente puede eliminar el archivo de dominio, como lo hacen en su código de muestra para almacenar una respuesta REST :
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//...
// Ensure we start with an empty database
[[NSFileManager defaultManager] removeItemAtPath:[RLMRealm defaultRealmPath] error:nil];
//...
}
Actualización con respecto a su comentario:
Si necesita estar seguro de que la base de datos del dominio ya no está en uso, puede poner en uso las notificaciones del dominio. Si openWrites
que incrementar un contador de openWrites
antes de cada escritura, entonces podría ejecutar un bloque cuando cada escritura finalice:
self.notificationToken = [realm addNotificationBlock:^(NSString *notification, RLMRealm * realm) {
if([notification isEqualToString:RLMRealmDidChangeNotification]) {
self.openWrites = self.openWrites - 1;
if(!self.openWrites && self.isUserLoggedOut) {
[[NSFileManager defaultManager] removeItemAtPath:[RLMRealm defaultRealmPath] error:nil];
}
}
}];
RealmSwift: reinicio simple usando una bandera
Intenté las respuestas anteriores, pero publicando una forma más sencilla de eliminar el archivo de dominio en lugar de migrar:
Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true
¡Esto simplemente establece una bandera para que Realm pueda eliminar el archivo existente en lugar de colgarse al try! Realm()
try! Realm()
En lugar de eliminar manualmente el archivo
Pensé que era más simple que la versión Swift de la respuesta anterior:
guard let path = Realm.Configuration.defaultConfiguration.fileURL?.absoluteString else {
fatalError("no realm path")
}
do {
try NSFileManager().removeItemAtPath(path)
} catch {
fatalError("couldn''t remove at path")
}