15

Core Data 処理に MagicalRecord を使用しているアプリがあり、これはうまく機能します。ただし、アプリにログインできる別のユーザーがいて、別のユーザーがログインするときに、別のユーザーが自分のデータを持つことができるように、コア データ データベースを空にする必要があります。データは Web サービスにも保存されるため、データベースを完全に空にすることができます。したがって、最初のユーザーが再度ログインした後は、いつでも再度同期することができます。

これまでのところ、この目的のために (機能する) ヘルパー メソッドを見つけることができないようです。私が試してみました

[MagicalRecord cleanUp];

ユーザーがログアウトするたびに、これはうまくいきません。

4

6 に答える 6

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);
    }
}
于 2014-08-09T15:56:28.093 に答える
18

MagicalRecord はこの機能を提供しません。このcleanUpメソッドは、メモリ内の CoreData スタックを再初期化し、コンテキスト、キュー、およびその他の関連オブジェクトをクリーンアップするために提供されています。ただし、MagicalRecord がライブラリのパスを取得するための便利な方法を提供していることを考えると、自分で行うのはそれほど難しくありません。

-[NSPersistentStore MR_urlForStoreName:]メソッドを確認してください。これにより、ストアのファイル URL が得られます。NSFileManagerその後、インスタンスで削除できます。Core Data スタックをセットアップする前にこれを行うように注意してください。そうしないと、適切に初期化されたスタックの下からストアをヤンクアウトしてしまうため、保存時にクラッシュします。

于 2012-12-28T16:58:18.380 に答える
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);
        }
    }
}
于 2014-07-29T13:10:29.660 に答える
2

iOS シミュレーターを使用していて、データベース ファイルを削除した場合、データがまだそこにあることに気付くかもしれません。ただし、実際のデバイスでテストすると (そうあるべきです)、ファイルが削除され、コンテキストがリセットされます。

[MagicalRecord cleanUp];

// delete database file
NSError *error;
NSURL *fileURL = [NSPersistentStore MR_urlForStoreName:@"db.sqlite"];
[[NSFileManager defaultManager] removeItemAtURL:fileURL error:&error];
if(error) {
    // Hanldle error
}

// reset setup.
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"db.sqlite"];
于 2014-01-10T01:26:44.883 に答える