如何使用 persistentStoreCoordinator 删除选定的表

How to delete selected tables using persistentStoreCoordinator

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

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

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

首先使用简单的获取方式获取所有数据,将其存储在一个数组中说 "results"

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

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

你有3张桌子,重复3张桌子。创建一个只传递 TableName 的函数。

试试这个代码

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

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

我做了类似下面的事情。如果我的方法有误,请纠正我。

    - (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];
    }