重置核心数据模型中的所有已保存数据

rosshump

我有一种方法,允许用户导出.csv文件中所有数据的文件Core Data modelCHCSV Parser在执行afetchRequest来获取存储的结果之后,我正在使用它创建.csv后,它将附加到电子邮件并从设备导出。一切正常,删除数据时出现问题。

我正在使用一种比较流行的技术来删除我的数据(通过流行,我的意思是在我研究过的许多Stack Overflow答案中都推荐使用该技术)。我只是获取所有对象并一一删除它们。

// Create fetchRequest
NGLSAppDelegate *appDelegate = (NGLSAppDelegate *)[[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"NGLS"
                                                      inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

// Delete objects
for (Model *results in fetchedObjects) {
    [context deleteObject:(id)results];
    NSLog(@"NGLS objects deleted");
};

mymodel很简单,只有两个entities,所以我Admin entity对另一个使用相同的代码一切都很好,删除了所有对象,我可以通过执行另一个操作来确认这一点,fetchRequest该操作返回每个对象的对象计数entity-两者的计数均为零。entity执行删除操作后,我尝试将数据保存回任一位置时,会出现问题

ViewController与上面的代码是“系统管理员”控制屏幕,其中用户可以登录并还导出数据。因此,当用户登录时,以下是要保存的代码:

    // Save login details
    [_managedObjectAdmin setValue:user forKey:@"userLogin"];
    [_managedObjectAdmin setValue:site forKey:@"siteLocation"];

    NSError *error;
    [[self.managedObjectAdmin managedObjectContext] save:&error];

然后,执行fetchRequest上述操作,并在按下“导出”按钮时导出所有数据。完成之后,当我尝试登录时ViewController,输出为:

2014-10-27 12:43:49.653 NGLS[19471:607] <NSManagedObject: 0x7a8c2460> (entity: Admin; id: 0x7a82e3e0 <x-coredata://3C9F3807-E314-439C-8B73-3D4459F85156/Admin/p30> ; data: <fault>)

如果我导航回另一个目录ViewController(使用navigation controller),然后返回“管理”控制屏幕并尝试再次登录,则得到以下输出:

2014-10-27 12:44:04.530 NGLS[19471:607] *** Terminating app due to uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault for '0x7a82e3e0 <x-coredata://3C9F3807-E314-439C-8B73-3D4459F85156/Admin/p30>''

(如果需要,我可以发布完整日志)。

我尝试了许多尝试来解决此问题。核心数据很复杂,我不太了解如何解决此问题。我试图删除persistentStore并再次创建它,与相同,managedObjectContext但没有尝试过。我实现了resetStore一种AppDelegate删除和重建存储的方法,如下所示:

- (void)resetStores {
    NSError *error;
    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];
}

并且还尝试了这种方法:

- (NSPersistentStoreCoordinator *)resetPersistentStore
{
    NSError *error = nil;
    if ([_persistentStoreCoordinator persistentStores] == nil)
        return [self persistentStoreCoordinator];

    _managedObjectContext = nil;

    NSPersistentStore *store = [[_persistentStoreCoordinator persistentStores] lastObject];

    if (![_persistentStoreCoordinator removePersistentStore:store error:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    // Delete file
    if ([[NSFileManager defaultManager] fileExistsAtPath:store.URL.path]) {
        if (![[NSFileManager defaultManager] removeItemAtPath:store.URL.path error:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }

    // Delete the reference to non-existing store
    _persistentStoreCoordinator = nil;
    NSPersistentStoreCoordinator *r = [self persistentStoreCoordinator];

    return r;
}

但是这些都不起作用。我发现工作是在导出完成之后,通过关闭并重新打开该应用程序,一切恢复正常。我试图弄清楚在关闭/打开有关Core Data的应用程序时会发生什么过程,但我只是不知道要寻找什么。我研究关于Stack Overflow的许多问题,并尝试了所有解决方案,但对我而言没有任何用处。我确实需要一些帮助,否则在通过exit(0);命令完成导出后,我将不得不迫使用户退出应用程序(因为它没有提交给App Store(内部员工使用))尽管我不需要该解决方案,但是肯定有一种方法可以重置数据库并继续使用该应用程序,而不必每次都将其关闭。提前致谢。

参考:
从Core Data中删除所有记录
重置Core Data持久存储区 如何从Core Data中的持久存储区
删除所有对象

rosshump

我已经设法通过简单地刷新视图来解决该问题。通过viewDidLoad在导出完成后调用我的方法,可以创建一个新的managedObject常规使用状态,而无需ViewController退出该应用程序或完全退出该应用程序。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib

    // Create fetchRequest
    NGLSAppDelegate *appDelegate = (NGLSAppDelegate *)[[UIApplication sharedApplication]delegate];
    NSManagedObjectContext *context = [appDelegate managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Admin" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSError *error = nil;
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

    // Fetch last object
    Model *admin = [fetchedObjects lastObject];

    // Populate login fields with last stored details
    if (admin.userLogin == nil) {
        //NSLog(@"Login empty");
    } else {
        self.usernameField.text = admin.userLogin;
        self.siteLocationField.text = admin.siteLocation;
    }

    // Create new managed object using the Admin entity description
    NSManagedObject *ManagedObjectAdmin;
    ManagedObjectAdmin = [NSEntityDescription insertNewObjectForEntityForName:@"Admin"
                                                       inManagedObjectContext:context];
    // Declare managed object
    self.managedObjectAdmin = ManagedObjectAdmin;

    // Save context
    NSError *saveError = nil;
    [context save:&saveError];

// ... more stuff
}

一直以来,解决方案是如此简单。我将保留此问题/答案,以便其他人在遇到我的情况时可以从中受益。谢谢。

编辑:managedObjectAdmin导出工作后也可以重新创建任何地方,没有特别需要调用该viewDidLoad方法。导出完成后,我可以简单地创建新文件managedObject并保存context并继续照常使用该应用程序,而不必先导航到另一个ViewController应用程序或重新启动该应用程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我无法在Swift项目的两个目标中使用核心数据模型

来自分类Dev

将iOS应用程序过渡到全新的核心数据数据模型

来自分类Dev

核心数据配置和重置数据

来自分类Dev

基于图像的核心数据模型关系是否正确?

来自分类Dev

核心数据数据模型中的订单实体

来自分类Dev

考核iOS应用的核心数据模型

来自分类Dev

如何为使用数据模型创建的核心数据类添加属性?

来自分类Dev

已创建核心数据实体,但属性未保存

来自分类Dev

使用两个单独的View Controller更新核心数据模型

来自分类Dev

尝试为iOS中的音频播放应用程序设计核心数据模型

来自分类Dev

数据如何存储在核心数据模型中(属性)

来自分类Dev

如何在核心数据模型iOS中找出特定属性索引的值

来自分类Dev

核心数据模型-关系

来自分类Dev

核心数据模型似乎未反映在应用程序中

来自分类Dev

Swift:在核心数据模型中搜索字符串

来自分类Dev

为什么显示我的核心数据模型保存错误代码= 1570?

来自分类Dev

无法识别Xcode 11.4.1核心数据模型

来自分类Dev

swiftUI核心数据模型

来自分类Dev

核心数据模型规划

来自分类Dev

核心数据问题:更新数据模型时无法识别的选择器

来自分类Dev

基于图像的核心数据模型关系是否正确?

来自分类Dev

从自制模型到核心数据模型的迁移:设置器/获取器问题

来自分类Dev

如何在复杂的核心数据模型中有效访问数据

来自分类Dev

Xcode核心数据显示UILabel中的所有实体

来自分类Dev

无需迁移的核心数据更改数据模型

来自分类Dev

对于与核心数据模型相关的SQLite数据库的正确位置感到困惑

来自分类Dev

如何打开保存在我的笔记本中的数据(使用核心数据模型保存)

来自分类Dev

数据如何存储在核心数据模型中(属性)

来自分类Dev

Xcode核心数据模型缺失

Related 相关文章

  1. 1

    我无法在Swift项目的两个目标中使用核心数据模型

  2. 2

    将iOS应用程序过渡到全新的核心数据数据模型

  3. 3

    核心数据配置和重置数据

  4. 4

    基于图像的核心数据模型关系是否正确?

  5. 5

    核心数据数据模型中的订单实体

  6. 6

    考核iOS应用的核心数据模型

  7. 7

    如何为使用数据模型创建的核心数据类添加属性?

  8. 8

    已创建核心数据实体,但属性未保存

  9. 9

    使用两个单独的View Controller更新核心数据模型

  10. 10

    尝试为iOS中的音频播放应用程序设计核心数据模型

  11. 11

    数据如何存储在核心数据模型中(属性)

  12. 12

    如何在核心数据模型iOS中找出特定属性索引的值

  13. 13

    核心数据模型-关系

  14. 14

    核心数据模型似乎未反映在应用程序中

  15. 15

    Swift:在核心数据模型中搜索字符串

  16. 16

    为什么显示我的核心数据模型保存错误代码= 1570?

  17. 17

    无法识别Xcode 11.4.1核心数据模型

  18. 18

    swiftUI核心数据模型

  19. 19

    核心数据模型规划

  20. 20

    核心数据问题:更新数据模型时无法识别的选择器

  21. 21

    基于图像的核心数据模型关系是否正确?

  22. 22

    从自制模型到核心数据模型的迁移:设置器/获取器问题

  23. 23

    如何在复杂的核心数据模型中有效访问数据

  24. 24

    Xcode核心数据显示UILabel中的所有实体

  25. 25

    无需迁移的核心数据更改数据模型

  26. 26

    对于与核心数据模型相关的SQLite数据库的正确位置感到困惑

  27. 27

    如何打开保存在我的笔记本中的数据(使用核心数据模型保存)

  28. 28

    数据如何存储在核心数据模型中(属性)

  29. 29

    Xcode核心数据模型缺失

热门标签

归档