iOS在应用程序崩溃时保存数据

iOS在应用程序崩溃时保存数据,ios,core-data,Ios,Core Data,在我的一个项目中,用户要求在本地保存数据,以防应用程序突然崩溃。它的基于表单的应用程序让用户在表单中填写大量数据,若应用程序突然崩溃,那个么用户将丢失所有输入的数据 应用程序正在使用核心数据在本地保存数据 我们将输入的数据保存在核心数据中,而不是在用户填充数据的每一秒钟 此外,如果应用程序崩溃,核心数据也会消失 在特定情况下,您可以在任何地方使用,try catchblock(但不是) 这是我认为最好的解决办法。但是,您可以创建一个NSTimer,它在一些合理的秒数内执行一个方法,您可以保存上下

在我的一个项目中,用户要求在本地保存数据,以防应用程序突然崩溃。它的基于表单的应用程序让用户在表单中填写大量数据,若应用程序突然崩溃,那个么用户将丢失所有输入的数据

应用程序正在使用核心数据在本地保存数据

我们将输入的数据保存在核心数据中,而不是在用户填充数据的每一秒钟


此外,如果应用程序崩溃,核心数据也会消失

在特定情况下,您可以在任何地方使用,
try catch
block(但不是)

这是我认为最好的解决办法。但是,您可以创建一个
NSTimer
,它在一些合理的秒数内执行一个方法,您可以保存上下文

您还可以在AppDelegate的方法中保存您的上下文,如(如果您的目标是iOS 4.0及以上版本,并且如果您的应用出于某种原因被iOS it self退出)

当应用程序进入后台时,将始终调用下面的方法

- (void)applicationDidEnterBackground:(UIApplication *)application{};

在特定情况下,您可以在任何地方使用,
try catch
block(但不是)

这是我认为最好的解决办法。但是,您可以创建一个
NSTimer
,它在一些合理的秒数内执行一个方法,您可以保存上下文

您还可以在AppDelegate的方法中保存您的上下文,如(如果您的目标是iOS 4.0及以上版本,并且如果您的应用出于某种原因被iOS it self退出)

当应用程序进入后台时,将始终调用下面的方法

- (void)applicationDidEnterBackground:(UIApplication *)application{};
使用

  • (无效)申请将终止:(UIApplication*)申请
委托AppDelgate方法将数据保存在核心数据中。

使用

  • (无效)申请将终止:(UIApplication*)申请

AppDelgate的委托方法将数据保存在核心数据中。

您可以实现HandleException来捕获使应用程序崩溃的所有异常

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //for uncaughted exceptions
    NSSetUncaughtExceptionHandler(&HandleException);

    struct sigaction signalAction;
    memset(&signalAction, 0, sizeof(signalAction));
    signalAction.sa_handler = &HandleSignal;

    sigaction(SIGABRT, &signalAction, NULL);
    sigaction(SIGILL, &signalAction, NULL);
    sigaction(SIGBUS, &signalAction, NULL);
    //and more if you need to handle more signals    


    //another setup ...
    return YES
}

#pragma mark crash management
void HandleException(NSException *exception) {
    NSLog(@"[FALTAL] App crashing with exception: %@", exception);
    //try to save your DB here.
}

void HandleSignal(int signal) {
    //try to save your DB here.
}

#pragma -

然而,我不知道在应用程序退出之前您将有多少时间。但是我认为您将有足够的时间来执行DB备份任务。

您可以实现HandleException来捕获使应用程序崩溃的所有异常

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //for uncaughted exceptions
    NSSetUncaughtExceptionHandler(&HandleException);

    struct sigaction signalAction;
    memset(&signalAction, 0, sizeof(signalAction));
    signalAction.sa_handler = &HandleSignal;

    sigaction(SIGABRT, &signalAction, NULL);
    sigaction(SIGILL, &signalAction, NULL);
    sigaction(SIGBUS, &signalAction, NULL);
    //and more if you need to handle more signals    


    //another setup ...
    return YES
}

#pragma mark crash management
void HandleException(NSException *exception) {
    NSLog(@"[FALTAL] App crashing with exception: %@", exception);
    //try to save your DB here.
}

void HandleSignal(int signal) {
    //try to save your DB here.
}

#pragma -

然而,我不知道在应用程序退出之前您将有多少时间。但我认为您将有足够的时间执行DB备份任务。

事实上,如果您的应用程序崩溃,回调:

- (void)applicationWillTerminate:(UIApplication *)application
将不会被调用。仅当由于某些原因系统需要关闭你的应用程序(通常是因为资源稀少,或者因为你的后台作业在允许的最长时间后仍在工作)或者如果你使用的是 因此,对于您的特殊情况,您有两种解决方案:

  • 使用具有快速触发频率的NSTimer,或者在每次编辑字段并更新核心数据上下文然后将其保存在磁盘上时调用一个函数

    NSError *error = nil;
    [managedObjectContext save:&error]
    
    您是否在上下文中设置了persistentStoreCoordinator?如果否,核心数据将永远不会将您的数据保留在磁盘上

  • 崩溃不会无缘无故出现,找到崩溃可能发生的地方并进行修复,或者如果无法修复,请使用try catch保持应用程序运行(但请不要尝试这样做…)


希望此帮助

事实上,如果您的应用程序崩溃,回调:

- (void)applicationWillTerminate:(UIApplication *)application
将不会被调用。仅当由于某些原因系统需要关闭你的应用程序(通常是因为资源稀少,或者因为你的后台作业在允许的最长时间后仍在工作)或者如果你使用的是 因此,对于您的特殊情况,您有两种解决方案:

  • 使用具有快速触发频率的NSTimer,或者在每次编辑字段并更新核心数据上下文然后将其保存在磁盘上时调用一个函数

    NSError *error = nil;
    [managedObjectContext save:&error]
    
    您是否在上下文中设置了persistentStoreCoordinator?如果否,核心数据将永远不会将您的数据保留在磁盘上

  • 崩溃不会无缘无故出现,找到崩溃可能发生的地方并进行修复,或者如果无法修复,请使用try catch保持应用程序运行(但请不要尝试这样做…)


希望这有帮助,但如果应用程序崩溃,它也会刷新核心数据。这很糟糕。您不应该到处使用
try catch
!这是Objective-C而不是Java!iOS上的异常总是意味着致命的,请阅读这篇文章,了解长期以来苹果员工和开发者的更多信息:@Kerni,很好,我已经更新了我的答案。请复习一下。谢谢请告诉我是否还需要一些更新。但如果应用程序崩溃,它也会刷新核心数据。这很糟糕。您不应该到处使用
try catch
!这是Objective-C而不是Java!iOS上的异常总是意味着致命的,请阅读这篇文章,了解长期以来苹果员工和开发者的更多信息:@Kerni,很好,我已经更新了我的答案。请复习一下。谢谢请告诉我是否还需要一些更新。但如果应用程序崩溃,它也会刷新核心数据。我怎么能保持这种状态这行不通。如果发生碰撞,将不会调用它们!这更危险!必须不惜一切代价避免在崩溃时运行任何非异步安全代码(包括任何Objective-C代码)。阅读本文,我不同意试图捕捉崩溃并做一些事情比让我们的应用程序在崩溃时什么都不做更糟糕。这取决于我们如何实现HandleException。您可以选择不将数据库上下文保存到永久数据库,而是保存到某些文件,然后在应用程序再次启动时重试,我们将搜索正在进行的工作并更新数据库。您可以选择不将数据库上下文保存到永久数据库,但如果应用程序崩溃,它也会刷新核心数据。我怎么能保持这种状态这行不通。它们不会在c中调用