0

編集:シミュレーターでも動作しているようには見えません。

いくつかの詳細情報、機能したアーカイブバージョンをインストールしてから、機能しないバージョンをその上にインストールすると、すべてがうまく機能するようです。しかし、アーカイブされたバージョンを削除して新しいバージョンをインストールすると、すべてが機能しなくなります。

iPhone でアプリをテストしていたところ、完全に機能していました。アーカイブして ipa を電話にインストールすると、データベースが機能しなくなりました。データベースをロードしてもエラーは発生せず、前にも言ったように、ちょうど機能していました。私はコードを変更しませんでした。シミュレーターではまだ機能するので、データベースのコピーに関係していることはわかっています。関連するコードは次のとおりです。

dbPath=[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()];
// Get the documents directory
NSFileManager *fmngr = [[NSFileManager alloc] init];
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"database.sql" ofType:nil];
NSError *error;
if(![[NSUserDefaults standardUserDefaults] boolForKey:@"didLaunchFirstTime"])
{
    [[NSUserDefaults standardUserDefaults] setBool:TRUE forKey:@"didLaunchFirstTime"];
    [fmngr removeItemAtPath:[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()] error:&error];

    if(![fmngr copyItemAtPath:filePath toPath:[NSString stringWithFormat:@"%@/Documents/database.sql", NSHomeDirectory()] error:&error])
    {
        // handle the error
        NSLog(@"Error creating the database: %@", [error description]);

    }
}

データベースのクエリに FMDB を使用しているため、クエリは次のようになります。ユーザーが検索ボタンを押したときに呼び出される別のメソッドにあります。

FMResultSet *s = [db executeQueryWithFormat:@"SELECT Gurmukhi, ShabadID, FirstLetterStr FROM Shabad WHERE FirstLetterStr LIKE %@", searchString];

また、ipaを解凍して、データベースが空でないかどうかを確認しましたが、そうではありません。何が起こっているのかわかりません。

4

1 に答える 1

1

アプリでディレクトリ パスをハードコーディングしないでください。Apple はそれらを取得する関数を提供しています。

バンドル内のファイルを見つけたい場合は、次の方法で取得します。

NSString *dbPathOld = [[NSBundle mainBundle] pathForResource:@"データベース" ofType:@"sql"];

これで、アプリで提供した sql ファイルへのパスを取得できました。

コピーする場合は、次のコードを使用します。

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *dbPathNew = [docDir stringByAppendingPathComponent:@"database.sql"];

他のコメント:

1) NSFileManager *fm = [NSFileManager defaultManager]; を使用しないのはなぜですか?

2) 標準のデフォルトを使用して、アプリ デリゲートの初期化メソッドに登録していますか? 値を更新した後にそれらを同期していますか(実際には「didLaunchFirstTime」が2回目に設定されています)?確実に知ることができるように、ログ メッセージを追加することをお勧めします。

于 2012-08-20T13:27:32.893 に答える