2011-04-23 15 views
6

永続ストアを削除する必要があります(100,000個以上のオブジェクトがあるため、オブジェクトをオブジェクトで実行することは実用的ではありません)。 コアデータの永続ストアを削除する方法

- (IBAction)resetDatabase:(id)sender { 

    NSPersistentStore* store = [[__persistentStoreCoordinator persistentStores] lastObject]; 

    NSError *error = nil; 
    NSURL *storeURL = store.URL; 

    // release context and model 
    [__managedObjectContext release]; 
    [__managedObjectModel release]; 
    __managedObjectModel = nil; 
    __managedObjectContext = nil; 

    [__persistentStoreCoordinator removePersistentStore:store error:nil]; 

    [__persistentStoreCoordinator release]; 
    __persistentStoreCoordinator = nil; 

    [[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error]; 
    if (error) { 
     NSLog(@"filemanager error %@", error); 
    }  

    // recreate the stack 
    __managedObjectContext = [self managedObjectContext]; 

} 

しかし、私はその後店にエンティティを挿入しようとすると、私はこのエラーを取得する:私はこれを試してみた

This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation. 

アップデート: 私は削除する前に、MOCとMOMを解放しようとしました永続的なストアが、私はまだ同じエラーが発生します。

答えて

9

は、私はいくつかのアプリケーションで「データをリセット」機能を行う方法です。これは、removePersistentStoreを使わずにしようとしていることです。後でpersistentStoreコーディネータを後で再構築するので気にしません。次のコアデータコールでは、シングルトンレイジースタイルのコンストラクタを使用してチェーンを透過的に再構築します。

- (NSManagedObjectModel *) managedObjectModel { 
    if (!_managedObjectModel) 
    _managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; 
    return _managedObjectModel; 
} 
+1

うわー、私は問題が 'removePersistentStore'だと思います。その行がなければそれは働いた...私はしかし、なぜに興味がある。 – David

+1

私は、.sqliteファイルを削除するだけで、 "外部ストレージを許可する"というコアデータ属性を使用すると多くのゴミが残ってしまうという感覚があります。 – magma

+0

マグマが正しいですが、iCloudを使用すると問題が発生します。 –

2

アプリケーションの開発中にこれを行う必要があるだけで外部から行うことができます。私は、私のアプリケーションを再実行する前に私は店を手動で削除する端子が開いている。あなたが知る必要があるのは、それがどこにあるかだけです。

[[CoreDataSingleton sharedManager] managedObjectContext]; //be sure to create the store first! 

//Find targeted mom file in the Resources directory 
NSString *momPath = [[NSBundle mainBundle] pathForResource:@"Parking" ofType:@"mom"]; 
NSLog(@"momd path: %@",momPath); 

役立ちます希望:私はそれは私のアプリは、次のコードで実行されるたびにコンソールにログインします!

2

ストアを削除しようとする前に、永続ストアに接続された管理対象オブジェクトのコンテキストが解放されていることを確認する必要があります。それ以外の場合、コンテキストはそのエラーを引き起こします。

- (void)reset { 
    // Release CoreData chain 
    [_managedObjectContext release]; 
    _managedObjectContext = nil; 
    [_managedObjectModel release]; 
    _managedObjectModel = nil; 
    [_persistentStoreCoordinator release]; 
    _persistentStoreCoordinator = nil; 

    // Delete the sqlite file 
    NSError *error = nil; 
    if ([fileManager fileExistsAtPath:_storeURL.path]) 
    [fileManager removeItemAtURL:_storeURL error:&error]; 
    // handle error... 
} 

は基本的に私はちょうどそのpersistentStoreファイルを削除し、CoreDataチェーンをリリース:ここ

+0

私はそれを無駄にしました(更新されたコードを参照)。 – David

関連する問題