0

私はiPhone開発とMacOSに不慣れです、ばかげた質問に耐えてください。しかし、私は深く掘り下げようとしましたが、問題の解決策を見つけることができませんでした。

コマンドプロンプトを使用してsqliteでデータベースを作成しました。データベースはUsers/DNamto/resources.dbに保存されます

しかし、次のコードスニペットを使用してiPhoneアプリケーションでこのデータベースを開こうとすると

// Get the documents directory
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    docsDir = [dirPaths objectAtIndex:0];

    // Build the path to the database file
    databasePath = [[NSString alloc]initWithString: [docsDir stringByAppendingPathComponent:@"resources.db"]];

データベースを開くことができません。アプリケーションが検索しているデータベースパスは次のとおりです。/Users/DNamto/Library/ApplicationSupport/iPhoneSimulator/6.0/Applications/C82C3DAF-4E95-49A7-9A4F-4D69B056DC9D/Documents/resources.db

誰かが正しいデータベースパスを取得するのを手伝ってもらえますか?アプリケーションがDBパスにリンクするように、DBパスをハードコーディングできますか?はいの場合は、コードスニペットを提供してください。

4

2 に答える 2

1

できません。実際のデバイスでは、ハードコードされたパスを取得することはできません。

相対パスが必要です。

ここでの問題は、データベースがドキュメントディレクトリに存在しないことです。

データベースをメインバンドルに追加する必要があります。実行時に、データベースがドキュメントディレクトリに存在するかどうかを確認する必要があります。存在しない場合は、を使用してデータベースをドキュメントディレクトリにコピーする必要があります。NSFileManager.

次のコードを使用して、データベースファイルをバンドルからドキュメントディレクトリにコピーできます。

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"resource.db"];
NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"resource.db"];
NSError *error;
[[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:folderPath error:&error];
于 2013-02-01T06:11:24.850 に答える
1

アプリケーションにデータベースを追加し、db が doc ディレクトリに存在するかどうかを確認します。存在しない場合は、doc ディレクトリにコピーしてからアクセスする必要があります。cppy の場合、doc ディレクトリの db は次のコード スニペットを使用します

- (void)copyDatabaseIfNeeded {

    BOOL success;

    NSFileManager *fileManager = [NSFileManager defaultManager];
    success = [fileManager fileExistsAtPath:[self getDBPath]];
    NSString *databasePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"dbname.sqlite"];
    if(success)
    {
        return;// remove old one.
    }
    [fileManager copyItemAtPath:databasePath toPath:[self getDBPath] error:nil];
}

データベースを開くには、次のコード スニペットを使用します。

-(void)openDatabase
{
    @try
    {
        [self copyDatabaseIfNeeded];
        if(sqlite3_open([[self getDBPath] UTF8String], &mainDatabase)==SQLITE_OK)
        {
            NSLog(@"Database opened");
        }
    }
    @catch (NSException *exception)
    {
        NSLog(@"Exception in openDatabase %@ :%@",exception.name,exception.reason);
    }
}

- (NSString *)getDBPath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"dbname.sqlite"];
}

次のコード スニペットを使用して、データベースを閉じます。

-(void)closeDatabase:(sqlite3_stmt*)statement
{
    @try
    {
        sqlite3_finalize(statement);
        sqlite3_close(mainDatabase);
    }
    @catch (NSException *exception)
    {
        NSLog(@"Exception in DatabaseController closeDatabase %@ :%@",exception.name,exception.reason);
    }
}
于 2013-02-01T06:14:11.773 に答える