0

プログラムをビルドして実行すると、/Users/Username/Library/Application Support/iPhone Simulator/User/Applications に新しいディレクトリが作成されることに気付きます。

したがって、アプリケーションのビルド間でコア データを永続化する方法はありません。この問題を回避するために (テストの観点から) 考えた方法は、iphone シミュレーターを使用して、円形のメニュー ボタンを押してアプリケーションを終了し、アプリを再実行することでした。つまり、ビルドするのではなく、シミュレーターを介して再実行して、データがコア データに保持されているかどうかを確認します。

ここで、アプリケーションを実行するたびにデータが保持されているかどうかを確認したいと考えました。私が使用しているイベントは次のとおりです。

  • (void)applicationDidFinishLaunching:(UIApplication *)アプリケーション

ただし、アプリケーションをビルドして実行した後にのみ起動しますが、アプリケーションを再起動するたびに起動しません-iPhoneシミュレーター経由(つまり、メニューボタンを押してからプログラムを再実行します)。

私が使用すべき別のイベントはありますか?? アプリケーションがロードされるたびに発生するイベントがある場合、コア データにデータが含まれているかどうかを確認するだけでよいと思います。含まれていない場合は、xml ファイルを入力して初期化します。データ 私は何もしません。そうですね?もしそうなら、そのイベントは何と呼ばれていますか?

4

4 に答える 4

5

-applicationDidFinishLaunching: アプリが起動するたびに呼び出されます。これは、デバッガーから、スプリングボード (ランチャー) のアイコンをクリックするか、またはデバイス上でこれらのいずれかを実行します。

sim では、アプリ用に .../Applications ディレクトリにフォルダーが作成され、そこに保存されているデータはすべて保持されます。フォルダーの実際の名前は、アプリをビルドして実行するたびに変わりますが、内容は同じままなので、そこにデータを保存できます。

于 2010-01-24T14:23:18.550 に答える
1

ベンの言うとおりです。表示されない理由は-applicationDidFinishLaunching、シミュレーターから起動したときにデバッガーが実行されず、メソッドがまだ起動しているためです。

あなたはまだ Core Data 開発プロセスの初期段階にいるようですね。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 に答える