Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 岩心数据恢复到以前的状态,没有明显的原因_Ios_Core Data - Fatal编程技术网

Ios 岩心数据恢复到以前的状态,没有明显的原因

Ios 岩心数据恢复到以前的状态,没有明显的原因,ios,core-data,Ios,Core Data,一些基于核心数据的iOS应用程序的客户报告说,他们偶尔会丢失数据。这些报告很奇怪,这就是我想请你对此发表看法的原因。客户报告说,当他们在一段时间(分钟、小时或第二天)后重新打开应用程序时,他们的一些数据会丢失,就像基础数据库恢复到以前的状态一样 我已经处理核心数据好几年了,以前从未遇到过这样的问题。应用程序相当简单,这意味着我只使用一个托管对象上下文,并且在应用程序进入后台之前提交更改 我意识到这是一个长期目标,但这类问题的潜在原因是什么,或者我可以进行哪些检查以收集更多信息?不幸的是,我自己无

一些基于核心数据的iOS应用程序的客户报告说,他们偶尔会丢失数据。这些报告很奇怪,这就是我想请你对此发表看法的原因。客户报告说,当他们在一段时间(分钟、小时或第二天)后重新打开应用程序时,他们的一些数据会丢失,就像基础数据库恢复到以前的状态一样

我已经处理核心数据好几年了,以前从未遇到过这样的问题。应用程序相当简单,这意味着我只使用一个托管对象上下文,并且在应用程序进入后台之前提交更改

我意识到这是一个长期目标,但这类问题的潜在原因是什么,或者我可以进行哪些检查以收集更多信息?不幸的是,我自己无法重现这个问题,这将使所有这些变得容易得多

更新:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    if (_persistentStoreCoordinator) return _persistentStoreCoordinator;

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Prime.sqlite"];

    NSError *error = nil;
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:@{ NSMigratePersistentStoresAutomaticallyOption : @YES, NSInferMappingModelAutomaticallyOption : @YES } error:&error]) {
        // Error Handling
    }

    return _persistentStoreCoordinator;
}

您应该检查
save:
方法是否报告任何错误,例如:

NSError *error = nil;
if (![[self managedObjectContext] save:&error])
{
    NSLog(@"Error %@", action, [error localizedDescription]);    
    NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
    // if there is a detailed errors - we can dump all of them
    if(detailedErrors != nil && [detailedErrors count] > 0) {
        for(NSError* detailedError in detailedErrors) {
            NSLog(@"  DetailedError: %@", [detailedError localizedDescription]);
        }
    }
    else { // in other case lets dump all the info we have about the error
        NSLog(@"  %@", [error userInfo]);
    }
}
最常见的失败原因之一是验证错误,例如,它可能希望在用户尚未输入字段时显示该字段,或者它可能希望该值小于XX个字符,等等


基本上,这意味着,如果向客户端提供新版本的调试信息需要很长时间,您可以要求他们向您发送他们用于输入的数据示例。

我不能确定这是原因,但可能是当应用程序进入后台时,出于某些原因,有时会出现处理此问题所允许的最长时间已超过(BackgroundTime剩余时间)。从Apple文档:

此属性包含应用程序在后台运行所需的时间,然后系统可能会强制终止它。当应用程序在前台运行时,此属性中的值仍保持适当的大。如果应用程序使用beginBackgroundTaskWithExpirationHandler启动一个或多个长时间运行的任务:方法,然后转换到后台,此属性的值将调整以反映应用程序剩余的运行时间


如果您的应用程序因为保存上下文花费的时间太长而被终止,则核心数据可能会决定恢复以前的状态,以至少获得一致性。如果您可以从报告此问题的某些用户处获得日志结果,您可以在尝试保存上下文后尝试记录属性值,以检查此情况。

检查您是否有e将保存消息放入适当的appDelegate方法中,以便在不保存的情况下无法退出应用程序。applicationWillResignActive和applicationWillTerminate应满足您的所有需要

除此之外,正确的错误处理和日志记录应该会给您带来很多好处。我个人喜欢将这些类型的错误记录到一个可以根据请求发送给我的文件中。但对于您的特定应用程序来说,这可能是过度的。这是从内存中写入的,所以请原谅任何错误

NSError *error = nil;
if (![[self managedObjectContext] save:&error])
{
    NSString *errorString = @"%@ ERROR : %@ %@", [[NSDate date] description], [error localizedDescription], [error userInfo]);

    NSString *documentsDirectory = [NSHomeDirectory() 
                                    stringByAppendingPathComponent:@"Documents"];

    NSString *filePath = [documentsDirectory 
                          stringByAppendingPathComponent:@"errorLog.txt"];

    // Write to the file
    [errorString writeToFile:filePath atomically:YES 
            encoding:NSUTF8StringEncoding error:&error];
}

您是否在您的应用商店中设置了任何内容?@DanShelly否。我已使用您所指的代码片段更新了问题。您具体何时保存更改?@TomHarrington创建新的托管对象后,托管对象上下文会立即保存。此外,当应用程序转到应用程序时,托管对象上下文也会保存后台或终止。当应用程序无法访问持久存储协调器或无法保存时,您会做什么错误处理?正如我在问题中提到的,每当创建新实体时,都会保存托管对象上下文,因此我非常确定这不是问题的原因。谢谢您的回答。