1

iPhoneアプリの構築を支援するために、Firefox sqliteマネージャーを使用しています。ここには、iPhone シミュレーターで完全に機能する UPDATE クエリが含まれています。しかし、実機(iPhone)から実行すると失敗します。エラーはありません。データベースを更新しないだけです。

私は2つの考えられる原因を考えています: 1) 更新するデータベースは、シミュレーターのようなものではありません 2) 私が読んだデータベースは、更新されたものではありません

誰も同じような経験をしていますか?

次のようにコードします。

        NSFileManager *fileMgr = [NSFileManager defaultManager];
        NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"Exercises.sqlite"];

        BOOL success = [fileMgr fileExistsAtPath:dbPath];
        if(!success)
        {
            NSLog(@"Cannot locate database file '%@'.", dbPath);
        }
        if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
        {
            NSLog(@"An error has occured.");
        }

        NSString *ranID = [@"UPDATE Status SET money = " stringByAppendingFormat:@"%d", money + 100];

        const char *sql2 = [ranID UTF8String];
        sqlite3_stmt *sqlStatement2;
        if(sqlite3_prepare(db, sql2, -1, &sqlStatement2, NULL) != SQLITE_OK)
        {
            NSLog(@"Problem with prepare statement 2");
        }
        if (sqlite3_step(sqlStatement2)==SQLITE_ROW) 
            NSLog(@"succeed");

前もって感謝します。

4

3 に答える 3

0

何が起こっているのかというと、バンドル内のデータベース内に書き込もうとしているのですが、バンドル内のファイルへの書き込みアクセス権がありません。データベースを更新する場合は、ドキュメント ディレクトリにコピーする必要があります。

データベース ファイルをコピーするには

NSString *documentsPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Exercises.sqlite"];

[[NSFileManager defaultManager] copyItemAtPath:dbPath toPath:documentsPath error:NULL];

次に、常に新しいファイル パス ( documentsPath) を使用してデータベースにアクセスします。

于 2012-06-30T18:16:13.447 に答える
0

アプリのバンドル内のファイルは、デバイスでは読み取り専用です。

Library/Application Support ディレクトリなど、最初にアプリのサンドボックス内のどこかにコピーする必要があります。( - [NSFileManager URLsForDirectory:inDomains:] を NSApplicationSupportDirectory とともに使用して、このパスを見つけることができます。書き込みを試みる前に、必ずディレクトリを作成してください。)

于 2012-06-30T18:16:39.337 に答える
0

私たちの変更をコミットしていないようです。ここここで同様の投稿を参照してください

于 2012-06-30T18:17:15.280 に答える