Очистить полную базу данных областей

ios realm

25183 просмотра

6 ответа

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

В настоящее время я застрял со следующим

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

есть идеи получше?

Спасибо

Автор: floriankrueger Источник Размещён: 17.05.2019 02:50

Ответы (6)


47 плюса

Решение

Обновить:

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

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


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

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

Оригинальный ответ:

Вы можете просто удалить сам файл области, как они делают в своем примере кода для хранения ответа 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];
        }
    }
}];
Автор: DonVaughn Размещён: 26.09.2014 07:55

11 плюса

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

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

Автор: jpsim Размещён: 05.11.2014 05:07

10 плюса

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

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

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")
}
Автор: jonchoi Размещён: 03.11.2016 05:26

5 плюса

В случае, если кто-то наткнется на этот вопрос в поисках способа сделать это в 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"
}
Автор: Glen Selle Размещён: 09.10.2014 08:48

1 плюс

Я столкнулся с этой забавной маленькой проблемой. Поэтому вместо этого я запросил версию схемы непосредственно перед запуском схемы миграции.

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) {

        }];
Автор: Steve Pascoe Размещён: 27.05.2015 12:26

0 плюса

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

Автор: Prathma Rastogi Размещён: 07.03.2019 12:26
Вопросы из категории :
32x32