【问题标题】:Core Data not resetting database correctlyCore Data 未正确重置数据库
【发布时间】:2012-08-25 01:15:37
【问题描述】:

当用户在那里设置当前模型时,我正在尝试重置我的核心数据数据库。

我尝试了各种选项,但没有一个能正常工作。

我希望在添加任何新数据之前删除核心数据及其所有数据(包括持久数据)。

我一直在使用 SQLite 数据库浏览器版本 2.0b1 来检查数据是否已正确删除。此外,我在运行每个测试之前都重置了模拟器。

我正在寻找一个简洁的解决方案,我已经搜索了 stackoverflow 以找到正确的方法。

此解决方案导致数据库被完全删除,但没有创建新数据库。 https://stackoverflow.com/a/11812997/1565615

此解决方案并未删除所有数据,因为之前的会话仍然存在并且刚刚创建的数据。 https://stackoverflow.com/a/1078306/1565615

【问题讨论】:

    标签: objective-c ios core-data


    【解决方案1】:

    我是这样使用它的:

    1. 删除 coreData 中的所有值
    2. 保存上下文,所以值真的被删除了。
    3. 保存新值并再次保存上下文。

    1. 我正在使用此代码从每个实体中删除值:

    NSError *error = nil;  
    
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchREntityUser            = [[[NSFetchRequest alloc] init] autorelease];
    NSEntityDescription *entityUser         = [NSEntityDescription entityForName:@"EntityUser" inManagedObjectContext:context];
    
    [fetchREntityUser           setEntity:entityUser];
    
    
    NSArray *fetchedObjUser         = [context executeFetchRequest:fetchREntityUser error:&error];
    
    if (error) {
        XLog(@"deleteCoreDataEntitys Error: %@", [error localizedDescription]);
    }
    
    
    for (NSManagedObject *CDentityUser in fetchedObjUser) {
        [context deleteObject:CDentityUser];
    }
    
    
    [context save:&error];
    

    【讨论】:

    • 2012-08-30 11:49:07.953 NameOfApp SSI[2019:c07] *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“+entityForName:找不到 NSManagedObjectModel实体名称“CurrentManagement” ***第一掷调用堆栈:(0x165b022 0x1350cd6 0x1e6d47 0x6aff 0x6e68 0x6ea5 0x165ce99 0x4b614e 0x4b60e6 0x55cade 0x55cfa7 0x55c266 0x4db3c0 0x4db5e6 0x4c1dc4 0x4b5634 0x2467ef5 0x162f195 0x1593ff2 0x15928da 0x1591d84 0x1591c9b 0x24667d8 0x246688a 0x4b3626 0x1ced 0x1c55)终止叫做抛出异常(LLDB )
    • 这就是当我使用该代码时会发生什么,Autorelease 不是 ARC 的一部分,所以我删除它,什么是 XLog?再次感谢。
    • 将 XLog 更改为 NSLog。或完全删除该行,您不需要它。 XLog 是一种更好的 NSLog 方式。见这里:stackoverflow.com/a/12194649/558150。你删除了sqlite文件吗?您的模型无法定位。检查您的实体的正确名称。 CurrentManagement 是您的实体名称还是您的 sqlite 文件的名称? 它应该是您的实体的名称
    • 这是一个问题,我从哪里获取上下文,将其更改为我的 AppDelegate,现在它可以工作了。我接受了你的回答。
    • 也请查看此链接,也许您已将该代码放入您的 viewDidLoad:stackoverflow.com/a/1640224/558150
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2012-06-06
    • 2014-12-20
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多