清除完整的Realm数据库

flo*_*ger 38 realm ios

我正在使用领域(目前为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];
Run Code Online (Sandbox Code Playgroud)

任何更好的想法?

谢谢

Don*_*ghn 49

更新:

自发布以来,添加了一个新方法来删除所有对象(如jpsim已经提到的):

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


// Swift
try! realm.write {
  realm.deleteAll()
}
Run Code Online (Sandbox Code Playgroud)

请注意,这些方法不会改变数据结构; 他们只删除现有记录.如果您希望在不编写迁移的情况下更改领域模型属性(即,正如您在开发中所做的那样),下面的旧解决方案可能仍然有用.

原答案:

你可以简单地删除领域文件本身,就像他们在用于存储REST响应示例代码中一样:

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

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

    //...
}
Run Code Online (Sandbox Code Playgroud)

有关您的评论的更新:

如果您需要确保不再使用领域数据库,可以使用领域的通知.如果要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];
        }
    }
}];
Run Code Online (Sandbox Code Playgroud)

  • 嘿来自Realm的蒂姆.DonamiteIsTnt有正确的想法,但你认为这种方法存在优势.我们将很快介绍一种以安全的方式删除领域文件的方法.为此表示歉意! (2认同)

小智 12

RealmSwift:使用标志进行简单重置

尝试了上述答案,但发布了一种更简单的方法来删除领域文件而不是迁移:

Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true
Run Code Online (Sandbox Code Playgroud)

这只是设置一个标志,以便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")
}
Run Code Online (Sandbox Code Playgroud)


jps*_*sim 11

从领域0.87.0开始,现在可以通过[[RLMRealm defaultRealm] deleteAllObjects]从写入事务中调用来删除所有领域内容.

来自Swift,它看起来像这样: RLMRealm.defaultRealm().deleteAllObjects()

  • 如果有待迁移,这个将不起作用.如果要绕过迁移,请使用@DonamiteIsTnt应答 (3认同)

Gle*_*lle 6

如果有人在这个问题上发现了想要在Swift中执行此操作的方法,这只是DonamiteIsTnt的答案被重写.我已将此函数添加到自定义实用程序类中,因此我可以MyAppUtilities.purgeRealm()在测试和调试期间执行此操作

func purgeRealm() {
    NSFileManager.defaultManager().removeItemAtPath(RLMRealm.defaultRealmPath(), error: nil)
}
Run Code Online (Sandbox Code Playgroud)

注意:如果您发现自己需要清除数据,则可以查看Realm的新realm.addOrUpdateObject()功能,该功能允许您使用新主数据替换现有数据.这样您就不会不断添加新数据.只需替换"旧"数据.如果您确实使用了addOrUpdateObject()make,请确保覆盖模型的primaryKey类函数,以便Realm知道哪个属性是您的主键.例如,在Swift中:

override class func primaryKey() -> String {
    return "_id"
}
Run Code Online (Sandbox Code Playgroud)