我的一个项目要求用户要求在本地保存数据,以防突然发生应用程序崩溃。它基于表单的应用程序,因此用户填写表单中的大量数据,如果应用程序突然崩溃,则用户丢失所有输入的数据。
App正在使用Core Data在本地保存数据。
有一点我们将输入的数据保存在核心数据中,但不会在每个第二个用户填充数据时保存。
此外,如果应用程序崩溃,核心数据也会消失。
答案 0 :(得分:4)
事实上,如果您的应用程序崩溃,则回调:
- (void)applicationWillTerminate:(UIApplication *)application
不会被调用。如果由于某些原因系统需要关闭您的应用程序(通常是因为资源很少或者因为您的后台作业在允许的最长时间之后仍在工作)或者您正在使用< iOs 4.您无法知道应用程序何时崩溃(但是当您重新启动应用程序时,您可以知道它是否已崩溃)。
因此,对于您的特定情况,您有两种解决方案:
使用具有快速点火率的NSTimer,或者每次编辑字段时调用fonction并更新核心数据上下文,然后将其保存在磁盘上。
NSError *error = nil;
[managedObjectContext save:&error]
您是否在上下文中设置了persistentStoreCoordinator?如果不是,核心数据将永远不会将您的数据保留在磁盘上。
崩溃不会突然出现,找到可能发生崩溃的地方并修复它,或者如果你不能,请使用try-catch来保持你的应用程序正常运行(但是,请尝试不要这样做......)。
希望这个帮助
答案 1 :(得分:1)
在特殊情况下,您可以 使用,try catch
阻止,但不能到处。
try {
//write your code
}catch(NSException *e){
//See what's the error
}finally{
//Save your context
}
这是我思考的最佳解决方案。但是,您可以创建一个NSTimer
,在合理的秒数内执行方法,您可以保存并保存上下文。
您也可以在AppDelegate的方法中保存您的上下文(如果您的目标是iOS 4.0及更高版本,如果您的应用因某种原因而被iOS自行退出),
- (void)applicationWillTerminate:(UIApplication *)application{};
当你的应用程序进入后台时,下面的方法将始终调用
- (void)applicationDidEnterBackground:(UIApplication *)application{};
答案 2 :(得分:1)
您可以实现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 -
但是,我不知道申请退出前会有多少时间。但我想你将有足够的时间来完成数据库备份任务。
答案 3 :(得分:-1)
使用
委托AppDelgate的方法将数据保存在核心数据中。