私はデータベースのアップグレードを行うアプリのアップデートをリリースしました。既存のテーブルなどにカラムを追加するスクリプトファイルをバンドル内で実行します。これは、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;
}
}
?すなわち、NSSearchPathForDirectoriesInDomains(NSDocumentDirectory、NSUserDomainMask、YES); – epatel
この部分はDBが常駐重要http://tinyurl.com/pkeu9m – epatel
ある: にNSArray *パス= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory、NSUserDomainMask、YES)。 NSString * documentsDirectory = [パスobjectAtIndex:0]; NSString * path = [documentsDirectory stringByAppendingPathComponent:@ "MyApp.sqlite"]; – Maxm007