0

每当我构建和运行我的程序时,我注意到在以下位置创建了一个新目录:/Users/Username/Library/Application Support/iPhone Simulator/User/Applications

因此,我无法在应用程序构建之间保留核心数据。我想解决这个问题的方法(从测试的角度来看)是只使用 iphone 模拟器通过按下圆形菜单按钮退出应用程序并重新运行我的应用程序。即,不构建它,而只是通过模拟器重新运行它以查看数据是否保留在核心数据中。

现在我想检查每次运行应用程序时数据是否持续存在。我正在使用的事件是:

  • (void)applicationDidFinishLaunching:(UIApplication *)application

但它只在我构建和运行应用程序后触发,但每次我重新启动应用程序时都不会触发 - 通过 iphone 模拟器(即,按下菜单按钮然后重新运行我的程序)。

我应该使用另一个事件吗?如果每次加载应用程序时都会触发一个事件,我想我可以检查一下核心数据中是否有数据,如果没有,我只需用 xml 文件填充它来初始化它,如果有的话数据我什么都不做。听起来对吗?如果是这样,那个事件叫什么?

4

4 回答 4

5

-applicationDidFinishLaunching: 每次你的应用程序启动时都会被调用,无论是从调试器,点击跳板(启动器)中的图标,还是设备上的任何一个。

在 sim 上,为您的应用程序在 .../Applications 目录中创建了一个文件夹,并且存储在其中的任何数据都将被持久化。每次构建和运行应用程序时,文件夹的实际名称都会更改,但内容将保持不变,因此您可以在其中存储数据。

于 2010-01-24T14:23:18.550 回答
1

本是对的。您没有看到的原因-applicationDidFinishLaunching是因为当您从模拟器启动时调试器没有运行,该方法仍在触发。

听起来您仍处于核心数据开发过程的早期阶段。您可能会从启用Lightweight Migration中受益。

NSError *error;
NSURL *storeURL = <#The URL of a persistent store#>;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

if (![psc addPersistentStoreWithType:<#Store type#>
    configuration:<#Configuration or nil#> URL:storeURL
    options:options error:&error]) {
    // Handle the error.
}

每次更改数据模型时都不必销毁数据存储,这应该允许 Core Data 智能地为您更新模型。

抱歉,这有点离题,但我花了很多时间擦除和重新加载我的数据存储,因为我没有意识到有这种轻量级迁移这样的事情。

于 2010-01-24T14:36:52.290 回答
1

正如 vfn 所写,您需要附加调试器或将日志值保存到磁盘。

我正在做 OAuth,这需要模拟器离开应用程序并进行一些身份验证是 Safari,然后 Safari 将使用 URL 方案重新打开应用程序。这意味着我无法获得应用退出后记录的不同身份验证步骤的日志。

无论如何,我编写了这个类,它将消息记录到位于 ~/user*/library/application support/iPhone Simulator/user/yourapp*/documents 中的“log.txt”

*user 和 yourapp 当然是变量名。

//
//  LogFile.m
//  
//
//  Created by RickiG on 11/30/09.
//  Copyright 2009 www.rickigregersen.com.. All rights reserved.
//

#import "LogFile.h"


@implementation LogFile

+ (void) stringToLog:(NSString *) str {

    NSDate *now = [NSDate date];
    NSDateFormatter *logTimeFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [logTimeFormatter setDateFormat:@"HH:mm:ss"];
    NSString *timeStr = [NSString stringWithFormat:@"%@", [logTimeFormatter stringFromDate:now]];
    NSString *logMsg = [NSString stringWithFormat:@"%@\n%@\n\n", timeStr, str];
    NSString *docsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *path = [docsDirectory stringByAppendingPathComponent:@"log.txt"];

    NSData *dataToWrite = [[NSString stringWithString:logMsg] dataUsingEncoding:NSUTF8StringEncoding];

    // Check if file exists
    NSFileManager *fileManager = [NSFileManager defaultManager];

    if([fileManager fileExistsAtPath:path]) { // Returns a BOOL     

        NSData *dataFromFile = [[NSData alloc] initWithContentsOfFile:path];
        NSMutableData *combinedDataToWrite = [NSMutableData dataWithData:dataFromFile];
        [combinedDataToWrite appendData:dataToWrite];
        [combinedDataToWrite writeToFile:path atomically:YES];
        [dataFromFile release];

    } else {    

        [fileManager createFileAtPath:path contents:dataToWrite attributes:nil];
    }
}

@end
于 2010-01-24T14:47:27.760 回答
0

您是否尝试过与

-(void)applicationDidBecomeActive { 

}
于 2010-01-24T14:25:46.530 回答