gpt4 book ai didi

objective-c - 清除 CoreData 和里面的所有东西

转载 作者:太空狗 更新时间:2023-10-30 03:22:40 26 4
gpt4 key购买 nike

我对 CoreData 和使用它的这个应用还很陌生。我目前正在开发一项功能,可以在我退出应用程序时清除整个核心数据。

我有 2 个 sqllite 文件(出于某种原因他们认为这很方便)

如何清除两个文件的所有数据并将它们重置为无数据状态?

我在 SO 上按照指南尝试了很多方法。

How to clear/reset all CoreData in one-to-many relationship

how to remove all objects from Core Data

他们似乎都对我失败了。现在我想知道我做错了什么?也许有人可以向我解释如何以正确的方式重置我的 2 个 CoreData 文件。

编辑:

//should clear the whole coredata database. mainly used for logout mechanism
-(void)resetCoreData
{
for (NSPersistentStore *store in self.persistentStoreCoordinator.persistentStores)
{
// NSPersistentStore *store = self.persistentStoreCoordinator.persistentStores[0];
NSError *error;
NSURL *storeURL = store.URL;
DLog(@"storeURL: %@", storeURL);
NSPersistentStoreCoordinator *storeCoordinator = self.persistentStoreCoordinator;
[storeCoordinator removePersistentStore:store error:&error];
[[NSFileManager defaultManager] removeItemAtPath:storeURL.path error:&error];

DLog(@"There are erreurs: %@", error);
// [self addDefaultData];
}

_persistentStoreCoordinator = nil;
_managedObjectContext = nil;
_managedObjectModel = nil;
}

这似乎并没有为我清除 CoreData。

编辑2:

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }
    
    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return _managedObjectContext;
}

- (NSManagedObjectModel *)managedObjectModel
{
if (__managedObjectModel != nil) {
return __managedObjectModel;
}

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyName" withExtension:@"momd"];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

return __managedObjectModel;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (__persistentStoreCoordinator != nil) {
return __persistentStoreCoordinator;
}

NSString *storePath = [[self applicationDocumentsDirectory]

stringByAppendingPathComponent:@"MyName.sqlite"];

NSFileManager *fileManager = [NSFileManager defaultManager];

// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"MyName" ofType:@"momd"];
if (defaultStorePath) {

[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];

}

}



__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

//Check to see what version of the current model we're in. If it's >= 2.0,
//then and ONLY then check if migration has been performed...
NSSet *versionIdentifiers = [[self managedObjectModel] versionIdentifiers];
DLog(@"Which Current Version is our .xcdatamodeld file set to? %@", versionIdentifiers);

if ([versionIdentifiers containsObject:@"2.0"])
{
BOOL hasMigrated = YES;
if (hasMigrated==YES) {
storePath = nil;
storePath = [[self applicationDocumentsDirectory]
stringByAppendingPathComponent:@"MyName2.sqlite"];

}
}

NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSError *error;
NSDictionary *pscOptions = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption,
nil];

if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeUrl
options:pscOptions
error:&error]) {
DLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}

return __persistentStoreCoordinator;
}

编辑 3:我仍在寻找一种方法来重置我的 CoreData,就好像我删除了整个应用程序并重新启动它一样。通常的做法不适合我的情况。并且有 2 个 sqllite 文件。有迹象表明在应用程序的某个时刻发生了迁移,但我不太确定何时以及如何发生。错误日志显示没有任何用处。

我不是在寻找最有效的方法。就这样。

帮我解决问题,赏金就是你的。

编辑 4:最后结果:似乎我的遗留代码实例化了第二个 ManagedObjectContext。我检索它并用它执行冲洗功能的那一刻。两个 sqlite 文件都根据需要消失了。

感谢所有为我的问题付出努力的人。

最佳答案

试试下面的方法刷新数据库,对我来说效果很好。

-(void) flushDatabase{
[__managedObjectContext lock];
NSArray *stores = [__persistentStoreCoordinator persistentStores];
for(NSPersistentStore *store in stores) {
[__persistentStoreCoordinator removePersistentStore:store error:nil];
[[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:nil];
}
[__managedObjectContext unlock];
__managedObjectModel = nil;
__managedObjectContext = nil;
__persistentStoreCoordinator = nil;
}

关于objective-c - 清除 CoreData 和里面的所有东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14727583/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com