Очистить полную базу данных Царства

Я играю с realm (в настоящее время 0.85.0), и мое приложение использует базу данных для хранения пользовательских данных, таких как контакты текущего пользователя. Когда пользователь решает выйти из системы, мне нужно удалить каждый бит информации о пользователе, и самая очевидная, простая и чистая вещь, на мой взгляд, будет уничтожить всю сферу. К сожалению, Cocoa lib не предоставляет эту функциональность.

В настоящее время я придерживаюсь следующих

RLMRealm *realm = [RLMRealm defaultRealm];
[realm beginWriteTransaction];
[realm deleteObjects:[MyRealmClass1 allObjectsInRealm:realm]];
[realm deleteObjects:[MyRealmClass2 allObjectsInRealm:realm]];
[realm deleteObjects:[MyRealmClass3 allObjectsInRealm:realm]];
[realm commitWriteTransaction];

любые лучшие идеи?

спасибо

+36
источник поделиться
5 ответов

Update:

После публикации новый метод был добавлен для удаления всех объектов (как уже упоминал jpsim):

// Obj-C
[realm beginWriteTransaction];
[realm deleteAllObjects];
[realm commitWriteTransaction];


// Swift
try! realm.write {
  realm.deleteAll()
}

Обратите внимание, что эти методы не изменят структуру данных; они удаляют только существующие записи. Если вы хотите изменить свойства модели области без записи миграции (т.е., Как вы могли бы сделать в разработке), старое решение, приведенное ниже, может быть полезно.

Исходный ответ:

Вы можете просто удалить файл realm, как в своем образце кода для хранения ответа REST:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //...

    // Ensure we start with an empty database
    [[NSFileManager defaultManager] removeItemAtPath:[RLMRealm defaultRealmPath] error:nil];

    //...
}

Обновление вашего комментария:

Если вам нужно убедиться, что база данных области больше не используется, вы можете использовать уведомления о состоянии. Если вы должны увеличивать счетчик openWrites перед каждой записью, тогда вы можете запустить блок, когда каждая запись завершается:

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];
        }
    }
}];
+43
источник

В реальном мире 0.87.0 теперь можно удалить все содержимое области, вызвав [[RLMRealm defaultRealm] deleteAllObjects] из транзакции записи.

Из Swift это выглядит так: RLMRealm.defaultRealm().deleteAllObjects()

+10
источник

RealmSwift: простой reset с использованием флага

Пробовал вышеупомянутые ответы, но опубликовал еще один простой способ удалить файл области, а не переносить:

Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true

Это просто устанавливает флаг, чтобы Realm мог удалить существующий файл, а не сбой на try! Realm()

Вместо того, чтобы вручную удалять файл

Мысль, которая была проще, чем версия Swift выше:

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")
}
+8
источник

Если кто-то наткнулся на этот вопрос, ища способ сделать это в Swift, это просто Ответ от DonamiteIsTnt перезаписан. Я добавил эту функцию в пользовательский класс утилиты, поэтому я могу выполнить MyAppUtilities.purgeRealm() во время тестирования и отладки

func purgeRealm() {
    NSFileManager.defaultManager().removeItemAtPath(RLMRealm.defaultRealmPath(), error: nil)
}

Примечание.. Если вам нужно очистить данные, вы можете просто проверить новую функцию realm.addOrUpdateObject() Realm, которая позволяет вам заменить существующие данные своим первичным ключом новыми данными. Таким образом, вы не постоянно добавляете новые данные. Просто замените "старые" данные. Если вы используете addOrUpdateObject(), убедитесь, что вы переопределяете функцию класса primaryKey, поэтому Realm знает, какое свойство является вашим основным ключом. В Swift, например:

override class func primaryKey() -> String {
    return "_id"
}
+5
источник

Я столкнулся с этой интересной маленькой проблемой. Поэтому вместо этого я запросил версию схемы непосредственно перед запуском 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) {

        }];
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос