4

fmdb を使用していますが、db ファイルを追加する場所がわかりません。xcode 4.2には適合しないと思われるこの古い回答を見つけました(「リソース」フォルダーがもうないため)。

「Lita」でデータベースを作成し、拡張子 .sqlite を追加して、次のように db ファイルを追加しました。

dbsqlite

次に、次を使用しようとしました

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *path = [docsPath stringByAppendingPathComponent:@"db.sqlite"];
FMDatabase *database = [FMDatabase databaseWithPath:path];
[database open];
FMResultSet *results = [database executeQuery:@"select * from tbl"];
printf("hi");
while([results next]) {
    printf("hi2");
NSString *name = [results stringForColumn:@"clm1"];
NSString *text  = [results stringForColumn:@"clm2"];        
NSLog(@"test: %@ - %@",name, text);
}
printf("done");

私は「hi」「done」を取得していますが、「hi2」は決して取得していません...

誰でも助けることができますか?

4

3 に答える 3

6

(コンパイルされた) データベースをリソースとしてプロジェクトに追加し、最初の起動時にアプリのドキュメント フォルダーにコピーします。

これを実行するメソッドの例を次に示します。applicationDidFinishLaunching から呼び出して、結果の FMDatabase * をすべてのクエリに使用します。

- (FMDatabase *)openDatabase
{
    NSFileManager *fm = [NSFileManager defaultManager];
    NSString *documents_dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *db_path = [documents_dir stringByAppendingPathComponent:[NSString stringWithFormat:@"database.s3db"]];
    NSString *template_path = [[NSBundle mainBundle] pathForResource:@"template_db" ofType:@"s3db"];

    if (![fm fileExistsAtPath:db_path])
        [fm copyItemAtPath:template_path toPath:db_path error:nil];
    FMDatabase *db = [FMDatabase databaseWithPath:db_path];
    if (![db open])
        NSLog(@"Failed to open database!");
    return db;
}
于 2012-04-26T12:48:02.707 に答える
1

私は今、同じ問題に取り組んでいます。しかし、あなたの質問に答えると、ドキュメント フォルダーはデバイスで使用されるフォルダーです。

データベースをサポート ファイル フォルダーに配置します。

これが私にとってうまくいくものです:

//hide status bar for full screen view
[[UIApplication sharedApplication]setStatusBarHidden:YES          withAnimation:UIStatusBarAnimationNone];

//set reference to database here
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *documentDir = [documentPaths objectAtIndex:0];
            self.databasePath = [documentDir stringByAppendingPathComponent:@"RPRA.sqlite"];

    [self createAndCheckDatabase];

    // Override point for customization after application launch.
    return YES;
}

//method used to create database and check if it exists

-(void) createAndCheckDatabase
{
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    success = [fileManager fileExistsAtPath:self.databasePath];

    if(success) return;

    //else move database into documents folder
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath]
                                     stringByAppendingPathComponent:@"RPRA.db"];

    [fileManager copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil];
}
于 2012-12-02T07:47:20.940 に答える