Почему не удается обновить приложение iPhone из App Store при обновлении базы данных? - PullRequest
2 голосов
/ 23 мая 2009

Я выпустил обновление приложения, которое обновляет базу данных, т.е. выполняет файл сценария в комплекте, который добавляет столбец к существующей таблице и т. д. Я проверил это, развернув на моем устройстве сборки предыдущих версий из xcode, а затем развернув последнюю версию. Обновление работало нормально.

Вчера мой дистрибутив был принят в магазин приложений. Когда я запускаю его, мой кошмарный сценарий материализуется, он не работает во время обновления БД! Я проверил сборку дистрибутива, и есть файл upgradeSQL, так что он не является пропущенным файлом ресурсов, хотя я не уверен. Я понятия не имею, как я должен отладить это. В чем разница между сборкой дистрибутива из магазина приложений и сборкой выпуска / отладки, развернутой из xcode, кроме подписи кода? Не имеет смысла для меня.

Это мой журнал сбоев и код, который не работает:

0   libSystem.B.dylib               0x3141d414 pread + 20
1   libsqlite3.0.dylib              0x303a2154 unixRead + 40
2   libsqlite3.0.dylib              0x303bd7c4 sqlite3PagerAcquire + 3748
3   libsqlite3.0.dylib              0x303c7718 sqlite3BtreeNext + 260
4   libsqlite3.0.dylib              0x303c7b84 sqlite3BtreeNext + 1392
5   libsqlite3.0.dylib              0x304272b8 sqlite3VdbeExec + 38668
6   libsqlite3.0.dylib              0x30428944 sqlite3Step + 504
7   libsqlite3.0.dylib              0x303ecbc4 sqlite3_exec + 600
8   MyApp                       0x00046ae4 +[DBUpgradeService executeUpgradeScript:] (DBUpgradeService.m:94)
9   MyApp                       0x000469aa +[DBUpgradeService upgradeV1_0ToV1_1] (DBUpgradeService.m:67)
10  MyApp                       0x0004687a +[DBUpgradeService upgradeDBIfNecessary] (DBUpgradeService.m:27)
11  MyApp                       0x000021ec -[MyAppAppDelegate applicationDidFinishLaunching:] (MyAppAppDelegate.m:49)
12  UIKit                           0x30a4ef24 -[UIApplication performInitializationWithURL:asPanel:] + 160
13  UIKit                           0x30a57dec -[UIApplication _runWithURL:] + 644
14  Foundation                      0x306945a2 __NSFireDelayedPerform + 326
15  CoreFoundation                  0x30269d88 CFRunLoopRunSpecific + 2642
16  CoreFoundation                  0x30269320 CFRunLoopRunInMode + 44
17  GraphicsServices                0x31567e58 GSEventRunModal + 268
18  UIKit                           0x30a4fa6c -[UIApplication _run] + 520
19  UIKit                           0x30a591d0 UIApplicationMain + 1132
20  MyApp                       0x00002090 main (main.m:20)
21  MyApp                       0x0000202c start + 44



+ (BOOL) executeUpgradeScript:(NSString*) scriptName{
    NSString *resourcePath = [[NSBundle mainBundle] resourcePath];
    NSString *scriptPath = [resourcePath stringByAppendingPathComponent:scriptName];

    NSString* upgradeScript = [NSString stringWithContentsOfFile:scriptPath];
    NSArray* lines = [upgradeScript componentsSeparatedByString:@"\n"];
    //begin transaction
    NSString* begin = [NSString stringWithString:@"BEGIN TRANSACTION"];

    sqlite3_exec([DatabaseManager getDatabase], begin.UTF8String , nil , nil , nil);
    BOOL failed = NO;
    for( NSString* line in lines) {
        const char *sql = line.UTF8String;
        char* error = nil;
        sqlite3_exec([DatabaseManager getDatabase], sql , nil , nil , &error); //THIS LINE FAILS
        if(error != nil) {
            NSLog([NSString stringWithCString:error]);
            failed = YES;
            break;
        }
    }

    if(failed){
        return NO;
    }
    else{
        NSString* commit = [NSString stringWithString:@"COMMIT"];
        sqlite3_exec([DatabaseManager getDatabase], commit.UTF8String , nil , nil , nil);
        return YES;

    }
}

Ответы [ 2 ]

1 голос
/ 23 мая 2009

Если обновление БД занимает много времени на этапе запуска, приложение может быть удалено.

Одним из способов решения такой проблемы может быть помещение обновления в NSThread

- (void)upgradeSomething:(id)sender
{
  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

  // Do something here that takes time

  // and maybe signal when done with some flag or thing...

  [pool release];
}

- (void)awakeFromNib
{
    // The usual stuff

    // and detach a NSThread for upgrade 

    [NSThread detachNewThreadSelector:@selector(upgradeSomething:) 
                             toTarget:self 
                           withObject:nil]
}

Считайте здесь , чтобы узнать, как сохранить цикл событий.

1 голос
/ 23 мая 2009

Вам не разрешено изменять файлы в вашем пакете приложений (см. Ссылку компании epatel). Как часть процесса сборки приложение подписывается, и изменение файлов в пакете нарушает подпись.

Вы должны использовать каталог документов вашего приложения. Вы должны заменить свое назначение resourcePath на:

NSString *resourcePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...