2009-05-23 14 views
2

私はデータベースのアップグレードを行うアプリのアップデートをリリースしました。既存のテーブルなどにカラムを追加するスクリプトファイルをバンドル内で実行します。これは、xcodeからデバイスに以前のバージョンのビルドをデプロイしてから、最新バージョンをデプロイすることでテストしました。アップグレードはうまくいきました。データベースのアップグレード中にApp StoreからiPhoneアプリのアップデートに失敗するのはなぜですか?

昨日は私のディストリビューションのビルドは、アプリストアに受け入れられました。私が起動すると、悪夢のシナリオが実現し、DBのアップグレード中に失敗します!私はディストリビューションのビルドをチェックして、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; 

    } 
} 
+0

?すなわち、NSSearchPathForDirectoriesInDomains(NSDocumentDirectory、NSUserDomainMask、YES); – epatel

+0

この部分はDBが常駐重要http://tinyurl.com/pkeu9m – epatel

+0

ある: にNSArray *パス= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory、NSUserDomainMask、YES)。 NSString * documentsDirectory = [パスobjectAtIndex:0]; NSString * path = [documentsDirectory stringByAppendingPathComponent:@ "MyApp.sqlite"]; – Maxm007

答えて

1

DBのアップグレードが起動フェーズで長時間かかる場合は、アプリを追い出すことができます。このような問題を解決するための

一つの方法は、アクティブなイベントループを維持するための理由で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] 
} 

読むhereにアップグレードを置くことである可能性があります。 DBは、デバイス上に存在しない

+1

はい私はそれも自分自身を考え出した。アップグレードに時間がかかり過ぎると、実際に私のアプリが強制的にクラッシュするタイマーでした。私は別のスレッドでDBのアップグレードを実行します。そうすれば、applicationDidLaunchコールは戻ることができ、すべてはグレービーでした。私は、iPhoneのOSは、デバッガを接続せずに配布ビルドにタイマーを適用するだけだと思う​​。 私はAd HocのデプロイメントをiTunesで実行して正しいトラックに置いてくれました。 私はアプリストアのアプリを引き出し、新しいアップデートを送信しました。来週土曜日までに稼働してください。みんなありがとうございました。 – Maxm007

1

(epatelのlinkを参照してください)。ビルドプロセスの一環として、アプリケーションが署名され、バンドル内のファイルを変更すると署名が破られます。

あなたは、アプリケーションのドキュメントディレクトリを使用する必要があります。

NSString *resourcePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
+0

これは本当に変です。最初にアプリはどのように承認されましたか? – Kriem

+0

これはちょっと変わったようですが、Appleがおそらく特別なバージョンのOSを実行していることを考えれば、おそらくアプリケーションバンドルの変更によって引き起こされた問題を拾わなかったでしょう。 –

+0

私にバグレポートのように聞こえる。 :) – Kriem

関連する問題