【发布时间】:2013-02-06 11:10:09
【问题描述】:
我对 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。
EDIT2:
- (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 文件都根据需要消失了。
感谢所有为我的问题付出的努力。
【问题讨论】:
-
我能看到的第一件事是,您在循环内将所有 coredata 内容设置为 nil。这需要在循环完成运行后进行。
-
这两种方法都不起作用。我注意到的是,只有 2 家商店中的一家正在被记录。第二个不在 for 循环内的原因可能是什么?
-
当你设置核心数据的东西时,它应该只有一个商店。那一家商店将保存您的所有数据(除非您正在做的事情特别需要多个数据)?
-
都是遗留代码。这一切都是一团糟。我刚刚开始研究这个应用程序。出于某种原因,有 2 个 CoreData SQLLite 文件,并且那里有迁移功能的提示。但我也认为不需要 2 家商店。
-
啊,我明白了。你有设置和初始化 coredata 堆栈的代码吗?我也许可以尝试破译发生了什么。
标签: objective-c core-data reset