我目前正在开发一个已经使用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
答案 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];
}