如何使用 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];
}
我目前正在开发一个 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];
}