Постоянство данных и жизненный цикл данных ядра iPhone - PullRequest
0 голосов
/ 24 января 2010

Всякий раз, когда я собираю и запускаю свою программу, я замечаю, что создается новый каталог в: / Пользователи / Имя пользователя / Библиотека / Поддержка приложений / iPhone Simulator / Пользователь / Приложения

Поэтому у меня нет возможности сохранять основные данные между сборками приложений. Я решил обойти эту проблему (с точки зрения тестирования), просто используя симулятор iphone, чтобы выйти из приложения, нажав круглую кнопку меню и перезапустив мое приложение. То есть, не собирать его, а просто повторно запустить его с помощью симулятора, чтобы увидеть, сохраняются ли данные в основных данных.

Теперь я хотел проверить, сохраняются ли данные при каждом запуске приложения. Событие, которое я использую:

  • (void) applicationDidFinishLaunching: (UIApplication *) приложение

Но он срабатывает только после того, как я собрал и запустил приложение, но не запускается каждый раз, когда я перезапускаю приложение - с помощью симулятора iphone (то есть нажатие кнопки меню и повторный запуск моей программы).

Есть ли другое событие, которое я должен использовать ?? Если бы у меня было событие, которое срабатывает каждый раз при загрузке приложения, я думаю, что я мог бы просто проверить, есть ли в данных ядра данные, если нет, я просто заполнил бы его файлом xml для его инициализации, если оно имеет Данные я ничего не делаю. Звучит правильно? Если так, то как называется это событие?

Ответы [ 4 ]

5 голосов
/ 24 января 2010

-applicationDidFinishLaunching: будет вызываться КАЖДЫЙ раз, когда ваше приложение запускается, будь то отладчик, нажатие на значок в Springboard (панели запуска) или любой из них на устройстве.

На симе для вашего приложения создается папка в каталоге ... / Applications, и любые данные, хранящиеся в ней, сохраняются. Фактическое имя папки будет меняться каждый раз, когда вы создаете и запускаете свое приложение, но содержимое останется прежним, поэтому вы можете хранить там данные.

1 голос
/ 24 января 2010

Как пишет vfn, вам необходимо либо присоединить отладчик, либо сохранить значения журнала на диске.

Я выполнял OAuth, и для этого требуется, чтобы симулятор покинул приложение и провел некоторую аутентификацию в Safari, а затем Safari снова откроет приложение, используя схему URL. Это означало, что я не смог получить журнал различных шагов аутентификации, зарегистрированных после закрытия приложения.

В любом случае, я написал этот класс, который будет записывать сообщения в файл «log.txt», расположенный в ~ / user * / library / application support / iPhone Simulator / user / yourapp * / documents

* 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
1 голос
/ 24 января 2010

Бен прав. Причина, по которой вы не видите -applicationDidFinishLaunching, заключается в том, что при запуске из симулятора отладчик не запускается, метод все еще запускается.

Похоже, вы все еще в начале процесса разработки Core Data. Вам, вероятно, будет полезно включить Легкая миграция .

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 интеллектуально обновить модель для вас.

Извините, это немного не по теме, но я потратил много времени, стирая и перезагружая свое хранилище данных, потому что я не понимал, что существует такая вещь, как легкая миграция.

0 голосов
/ 24 января 2010

Вы пробовали работать с

-(void)applicationDidBecomeActive { 

}
...