2016-07-28 6 views
0

私は現在objective-Cを使用して既に開発されているIOSアプリケーションを開発中です。 ユーザーのログイン情報がユーザーの詳細を格納するモジュールを追加しました。しかし、アプリケーションがすでにコードを持っているので、ログアウトボタンを押すと、データベースからすべてのエンティティが削除されます。これのために、彼らは以下のようなコードを使用しています。persistentStoreCoordinatorを使用して選択したテーブルを削除する方法

NSManagedObjectContext * managedObjectContext = [self managedObjectContext];ブレークポイントを保つことによって

NSError *error = nil; 

// retrieve the store URL 

NSURL *storeURL = [[managedObjectContext persistentStoreCoordinator] URLForPersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject]]; 

// lock the current context 

[managedObjectContext lock]; 

[managedObjectContext reset];//to drop pending changes 

//delete the store from the current managedObjectContext 

if ([[managedObjectContext persistentStoreCoordinator] removePersistentStore:[[[managedObjectContext persistentStoreCoordinator] persistentStores] lastObject] error:&error]){ 

    // remove the file containing the data 

    [[NSFileManager defaultManager] removeItemAtURL:storeURL error:&error]; 

    //recreate the store like in the appDelegate method 

    [[managedObjectContext persistentStoreCoordinator] addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error];//recreates the persistent store 

} 

[managedObjectContext unlock]; 

、私は彼らがデータベースのURLを取得し、それを削除し、それを再作成していることを理解していました。彼らは3つのテーブルA、BとCを持っていると言いましょう、A & Bを削除したいですが、Cはありません。

私の理解は正しいですか?どうすればこれを達成できますか?

TIA

答えて

0

このコードを試してみてください、私は以下のような何かをしました。もし私が私のアプローチに間違っていたら私を訂正してください。

- (void) deleteData { 

     NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
     NSError *error = nil; 

     [managedObjectContext lock]; 
     [managedObjectContext reset]; 
     NSPersistentStoreCoordinator *psc = [managedObjectContext persistentStoreCoordinator]; 
     NSManagedObjectModel *managedModel = [psc managedObjectModel]; 
     NSArray *allEntityNames = [managedModel.entitiesByName allKeys]; 

     for(NSString *entityName in allEntityNames) 
     { 
//I wanted to delete all objects except for one table 
      if(![entityName isEqual:switchAccountsTableName]) 
      { 
       NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init]; 
       NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]; 
       [fetchRequest setEntity:entity]; 
       NSError *objError = nil; 
       NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&objError]; 
       if(fetchedObjects == nil) 
       { 
        NSLog(@"Logout- Couldnt delete entity objects"); 
       } 
       for(NSManagedObject *entityObj in fetchedObjects) 
       { 
        [managedObjectContext deleteObject:entityObj]; 
       } 
      } 
     } 
     [managedObjectContext save:&error]; 
     [managedObjectContext unlock]; 
    } 
0

すると、ユーザータップログアウト、あなたが格納されたデータをクリアする必要があります。すべての

まず、それを繰り返して、「結果」

は、配列内のオブジェクトを取得し、あなたは3つのテーブルを持っている

for (Entity *entityOBJ in results) { 
    [context deleteObject:entityOBJ]; 
} 
[context save:&error]; 

それを削除言う配列にフェッチ簡単な使用してそれを保存し、すべてのデータを取得します3つのテーブル。 TableNameを渡すだけの関数を作成します。

+0

上記のコード(質問)では、それらは単にデータベース全体を削除して再作成していますか?あなたの答えでは、 'deleteObject:entityOBJ'ではないでしょうか? – ASN

+1

はい修正しました。 –

+0

改変していただきありがとうございます。しかし、C以外のすべてのエンティティ(この場合はA&B)を削除するにはどうすればよいですか? – ASN

0

NSManagedObjectContext *context = [self managedObjectContext]; 
    [context deleteObject:managedObject]; 

    NSError *error = nil; 
    if (![context save:&error]) { 
     NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]); 
     return; 
    } 
+0

これを使用すると、すべてのオブジェクトを正しく削除しようとしていますか? – ASN

+0

インデックスパスとして選択したセルのmanagedObjectを渡すだけではありません。 – Chandan

関連する問題