在MagicalRecord中清理(删除)数据库

Hug*_*ugo 15 xcode core-data ios magicalrecord

我有一个使用MagicalRecord进行核心数据处理的应用程序,这很好用.但是,我有不同的用户可以在应用程序中登录,当另一个用户登录时,必须清空核心数据数据库,以便不同的用户可以拥有自己的数据.数据库可以完全清空,因为数据也存储在Web服务上,因此在再次登录第一个用户后可以始终再次同步.

到目前为止,我似乎无法找到一个帮助方法(这是有效的)为此目的.我试过了

[MagicalRecord cleanUp];
Run Code Online (Sandbox Code Playgroud)

每当用户注销时,但这不起作用.

yon*_*nja 37

这就是我做到的.这条线至关重要:[MagicalRecord cleanup].没有它,[self setupDB]将无法工作.

更新:删除-wal和-shm文件.@thattyson在iOS 9中指出了一个问题.另外,请参阅@ onmyway133答案.

- (void)setupDB
{
    [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:[self dbStore]];
}

- (NSString *)dbStore
{
    NSString *bundleID = (NSString *)[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleIdentifierKey];
    return [NSString stringWithFormat:@"%@.sqlite", bundleID];
}

- (void)cleanAndResetupDB
{
    NSString *dbStore = [self dbStore];

    NSError *error1 = nil;
    NSError *error2 = nil;
    NSError *error3 = nil;

    NSURL *storeURL = [NSPersistentStore MR_urlForStoreName:dbStore];
    NSURL *walURL = [[storeURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"sqlite-wal"];
    NSURL *shmURL = [[storeURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"sqlite-shm"];

    [MagicalRecord cleanUp];

    if([[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error1] && [[NSFileManager defaultManager] removeItemAtURL:walURL error:&error2] && [[NSFileManager defaultManager] removeItemAtURL:shmURL error:&error3]){
        [self setupDB];
    }
    else{
        NSLog(@"An error has occurred while deleting %@", dbStore);
        NSLog(@"Error1 description: %@", error1.description);
        NSLog(@"Error2 description: %@", error2.description);
        NSLog(@"Error3 description: %@", error3.description);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是Swift版本:

func setupDB() {
    MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed(self.dbStore())
}

func dbStore() -> String {
    return "\(self.bundleID()).sqlite"
}

func bundleID() -> String {
    return NSBundle.mainBundle().bundleIdentifier!
}

func cleanAndResetupDB() {
    let dbStore = self.dbStore()

    let url = NSPersistentStore.MR_urlForStoreName(dbStore)
    let walURL = url.URLByDeletingPathExtension?.URLByAppendingPathExtension("sqlite-wal")
    let shmURL = url.URLByDeletingPathExtension?.URLByAppendingPathExtension("sqlite-shm")

    var removeError: NSError?

    MagicalRecord.cleanUp()

    //Swift 1
    //let deleteSuccess = NSFileManager.defaultManager().removeItemAtURL(url, error: &removeError)

    //Swift 2
    let deleteSuccess: Bool
    do {
        try NSFileManager.defaultManager().removeItemAtURL(url)
        try NSFileManager.defaultManager().removeItemAtURL(walURL!)
        try NSFileManager.defaultManager().removeItemAtURL(shmURL!)
        deleteSuccess = true
    } catch let error as NSError {
        removeError = error
        deleteSuccess = false
    }

    if deleteSuccess {
        self.setupDB()
    } else {
        println("An error has occured while deleting \(dbStore)")
        println("Error description: \(removeError?.description)")
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但是-shm和-wal文件怎么样?那些不是这样删除的吧? (3认同)

onm*_*133 20

为了扩展@yoninja的答案,这将明确重置CoreData堆栈,以及处理wal和shm文件

- (void)setupDB
{
    [MagicalRecord setDefaultModelNamed:@"Model.momd"];
    [MagicalRecord setupCoreDataStack];
}

- (void)cleanAndResetupDB
{
    [MagicalRecord cleanUp];

    NSString *dbStore = [MagicalRecord defaultStoreName];

    NSURL *storeURL = [NSPersistentStore MR_urlForStoreName:dbStore];
    NSURL *walURL = [[storeURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"sqlite-wal"];
    NSURL *shmURL = [[storeURL URLByDeletingPathExtension] URLByAppendingPathExtension:@"sqlite-shm"];

    NSError *error = nil;
    BOOL result = YES;

    for (NSURL *url in @[storeURL, walURL, shmURL]) {
        if ([[NSFileManager defaultManager] fileExistsAtPath:url.path]) {
            result = [[NSFileManager defaultManager] removeItemAtURL:url error:&error];
        }
    }

    if (result) {
        [self setupDB];
    } else {
        NSLog(@"An error has occurred while deleting %@ error %@", dbStore, error);
    }
}
Run Code Online (Sandbox Code Playgroud)


cas*_*ora 18

MagicalRecord不为您提供此功能.该cleanUp方法用于在内存中重新初始化CoreData堆栈并清理任何上下文,队列和其他相关对象.但是,鉴于MagicalRecord确实提供了一种方便的方法来获取库的路径,因此自己并不难.

看看-[NSPersistentStore MR_urlForStoreName:]方法.这将为您提供商店的文件网址.然后,您可以使用NSFileManager实例将其删除.在设置Core Data堆栈之前要小心,或者在保存时崩溃,因为你已经从正确初始化的堆栈中抽出了商店.


Rya*_*anG 5

以下将完全删除MagicalRecord CoreData sqlite文件,以及-wal和-shm文件.MagicalRecord将它们全部放在Library文件夹中; 这将只删除文件夹中的所有文件.如果您需要在Library文件夹中保留其他数据,这将不起作用,我没有:

- (void)resetCoreDataDB
{
    [MagicalRecord cleanUp];
    [self deleteFilesInLibrary];
    [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"YourDBName.sqlite"];
}

- (void)deleteFilesInLibraryDirectory
{
    NSString* folderPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSError *error = nil;
    for (NSString *file in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:&error])
    {
        [[NSFileManager defaultManager] removeItemAtPath:[folderPath stringByAppendingPathComponent:file] error:&error];
        if(error)
        {
            NSLog(@"Delete error: %@", error.description);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)