我正在使用领域(目前为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];
任何更好的想法?
谢谢
Don*_*ghn 49
更新:
自发布以来,添加了一个新方法来删除所有对象(如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];
        }
    }
}];
小智 12
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")
}
如果有人在这个问题上发现了想要在Swift中执行此操作的方法,这只是DonamiteIsTnt的答案被重写.我已将此函数添加到自定义实用程序类中,因此我可以MyAppUtilities.purgeRealm()在测试和调试期间执行此操作
func purgeRealm() {
    NSFileManager.defaultManager().removeItemAtPath(RLMRealm.defaultRealmPath(), error: nil)
}
注意:如果您发现自己需要清除数据,则可以查看Realm的新realm.addOrUpdateObject()功能,该功能允许您使用新主数据替换现有数据.这样您就不会不断添加新数据.只需替换"旧"数据.如果您确实使用了addOrUpdateObject()make,请确保覆盖模型的primaryKey类函数,以便Realm知道哪个属性是您的主键.例如,在Swift中:
override class func primaryKey() -> String {
    return "_id"
}
| 归档时间: | 
 | 
| 查看次数: | 27213 次 | 
| 最近记录: |