0

我目前正在开发一个已经使用 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。参考 - 持久存储协调器

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

TIA

4

3 回答 3

0

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

首先,使用简单的 fetch 获取所有数据,将其存储在一个数组中,比如“results”

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

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

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

于 2016-07-28T08:34:08.033 回答
0

试试这个代码

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

    NSError *error = nil;
    if (![context save:&error]) {
        NSLog(@"Can't Delete! %@ %@", error, [error localizedDescription]);
        return;
    }
于 2016-07-28T08:40:50.490 回答
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];
    }
于 2016-08-04T01:26:45.270 回答