如何使用persistentStoreCoordinator

时间:2016-07-28 08:26:14

标签: ios core-data nspersistentstore

我目前正在开发一个已经使用Objective-C开发的IOS应用程序。 我在登录时添加了一个用户登录商店详细信息的模块。但是由于应用程序已经有了一些代码,当我按下注销按钮时,它会删除数据库中的所有实体。为此,他们正在使用类似下面的代码。

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. Reference- Persistent Store Coordinator

我的理解是否正确?我怎样才能做到这一点?

TIA

3 个答案:

答案 0 :(得分:0)

当用户点击退出时,您应该清除存储的数据。

首先使用简单的fetch存储获取所有数据,将其放入数组中,说“results”

然后获取数组中的对象并将其删除

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

你有3个表,重复3个表。创建一个函数只需传递TableName。

答案 1 :(得分:0)

试试此代码

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

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

答案 2 :(得分: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];
    }