2011-09-16 11 views
1

sql liteファイルを削除して永続ストアを再度設定したいとします。以前のsqliteストアファイルを削除した後に永続ストアを再作成

+ (BOOL)saveAll { 
    // [self createStorage]; 
    NSError *error = nil; 
    NSManagedObjectContext *managedObjectContext = [(WSSMobileAppsAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    if (![managedObjectContext save:&error]) { 
     NSLog(@"Error while saving %@", error); 
     return FALSE; 
    } 
    return TRUE; 
} 

をエラー:

Error while saving Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x7195ac0 {NSAffectedStoresErrorKey=(
    "<NSSQLCore: 0x714eee0> (URL: file://localhost/Users/.../Library/Application%20Support/iPhone%20Simulator/5.0/Applications/CEDB9019-1D64-4968-9BE7-57E1493B96EC/Documents/Port.sqlite)" 
), NSUnderlyingError=0x7195a50 "The operation couldn’t be completed. (Cocoa error 4.)", NSFilePath=/Users/.../Library/Application Support/iPhone Simulator/5.0/Applications/CEDB9019-1D64-4968-9BE7-57E1493B96EC/Documents/Port.sqlite} 

私だけ節約しながら、私はエラーを取得しています私はこの

- (void)reset { 
    // Release CoreData chain 
    self.managedObjectContext = nil; 
    self.managedObjectModel = nil; 
    self.persistentStoreCoordinator = nil; 

    // Delete the sqlite file 
    NSError *error = nil; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Port.sqlite"]]; 

    if ([fileManager fileExistsAtPath:storeUrl.path]){ 
     [fileManager removeItemAtURL:storeUrl error:&error]; 
    } 
    self.managedObjectContext = [self managedObjectContext]; 
    self.managedObjectModel = [self managedObjectModel]; 
    self.persistentStoreCoordinator = [self persistentStoreCoordinator]; 

    // handle error... 
} 

のような私のシーンをリセットしようとしています

//Explicitly write Core Data accessors 

- (NSManagedObjectContext *) managedObjectContext { 
if (managedObjectContext != nil) { 

    return managedObjectContext; 

} 

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 

if (coordinator != nil) { 

    managedObjectContext = [[NSManagedObjectContext alloc] init]; 

    [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
} 

    return managedObjectContext; 
} 

- (void) setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{} 


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

    return managedObjectModel; 
} 

-(void) setManagedObjectModel:(NSManagedObjectModel *)managedObjectModel{} 


- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Port.sqlite"]];  
    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) { 

     NSLog(@"Could not create store .... %@", error); 
     /*Error for store creation should be handled in here*/ 
    } 

return persistentStoreCoordinator; 
} 

私のリセット機能を実行すると、エラーが発生します。私はその設定を考えました:

self.managedObjectContext = nil; 
self.managedObjectModel = nil; 
self.persistentStoreCoordinator = nil; 

...問題を解決します。その後、すべてが再現されます。助けてください。


ありがとうございました。今はエラーはありませんが、リセットを実行すると何も格納されません。保存直後にフェッチする

if (![managedObjectContext save:&error]) { 
    NSLog(@"Error while saving %@", error); 
    return FALSE; 
} 
CoreDataPortService *c = [[CoreDataPortService alloc] init]; 
NSLog(@"Saved all.... got number of ports ... %d", [[c getPorts] count]); 

私のリセット方法を実行しないと、すべてが正常に動作します。何が間違っていますか?

+0

私はすべてのデータを削除したいと思っていたと思いました。いいえ?ファイルを削除し、メモリ内のmanagedObjectContextを削除すると、データはなくなります。ファイルを削除してメモリの内容から再作成しようとすると、別の方法が必要になります。私はあなたがなぜそれをしたいと思うのか本当に想像することはできません。永続ストアは、通常の場合に管理対象オブジェクトのコンテキスト内にあるものと同期しています。 – morningstar

+0

データを削除します。ファイルを削除することも可能ですか?それは時々私がエンティティを変更するためです。 – pethel

+0

あなたは「リセットを実行すると何も保存されません」と言った。あなたは何も保存されていない、つまりすべてが削除されないように思えます。あなたはあなたがリセットを実行し、次にオブジェクトを追加してから保存し、その後にオブジェクトがないということですか? – morningstar

答えて

0

あなたmanagedObjectContext用セッターを書いたが、それは何もしません:あなたはself.managedObjectContext = nilを行うと、それがないすべてのコール[self setManagedObjectContext:nil]

- (void) setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{} 

です。それは何もしません。インスタンス変数managedObjectContextは同じ値を保持し、ゲッターで再度要求すると、削除されたファイルに関連付けられたmanagedObjectContextが引き続き存在します。

- (void) setManagedObjectContext:(NSManagedObjectContext *)_managedObjectContext { 
    [managedObjectContext release]; 
    managedObjectContext = _managedObjectContext; 
    [managedObjectContext retain]; 
} 

また、managedObjectContextプロパティが非原子修飾子で宣言されていることを前提としています。アトミックに宣言されている場合は、コードをロックする必要もあります。同様の方法でmanagedObjectModelとpersistentStoreCoordinatorの設定を記述します。

@synthesizeは通常、あなたのようなセッターを生成しますが、独自のゲッターを作成したいので、独自のセッターも作成する必要があります。代わりに@synthesizeがあなたのプロパティのセッターだけを作る方法があるかもしれませんが、私は覚えていません。

質問に続きます。その場合は、あなたは、古い管理対象オブジェクトコンテキストに保存呼び出すことになる

NSManagedObjectContext *moc = self.managedObjectContext; 
[self reset]; 
[self repopulateData:xmlFile]; 
NSError *error = nil; 
if (![moc save:&error]) 
    [self logError:error]; 

:たぶん、あなたはこのような何かをやっています。それがどうなるかはわかりません。代わりに、現在の管理対象オブジェクトコンテキストを使用していることを確認するために、最後から2番目の行を

if (![self.managedObjectContext save:&error]) 

に変更してください。

同様に、古い管理対象オブジェクトコンテキストから読み取ろうとしている可能性があります。使用している管理オブジェクトコンテキストポインタのアドレスを確認し、リセットで作成した新しい管理対象オブジェクトコンテキストと同じものを指していることを確認します。

これが問題でない場合は、わかりません。なぜそれが機能していないのかについて、より多くの情報を収集しようとする必要があります。たとえば、ファイルはまったく存在しますか?データを追加するとサイズが大きくなりますか?データはファイルに書き込まれますが、読み取ることはできませんか?

+1

マイナー・キブル。カスタムゲッターが必要な場合は、カスタムセッターも作成する必要があります(またはその逆)。必要なメソッドが存在しない場合は@sythesizeによって作成されます。存在する場合はそれを使用します。あなたはあなたが望むものすべてを混ぜ合わせることができます。 – TechZen

+0

これは良い答えです。 ' - (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext {}'を削除し、 '@synthesize managedObjectContext'を追加してください。 – morningstar

+0

本当にありがとうございます。 – pethel

関連する問題