3

sqliteを使用してデータベースにデータを挿入するには、データベースをコピーして書き込み可能にする必要があります。だから私は私のクラスにこのメソッドを持っています、それは私がスタックオーバーフローや他の多くのサイトで見たすべての提案です:

-(void)createEditableCopyOfDatabaseIfNeeded 
{  
    BOOL success;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sample.db"];

    success = [fileManager fileExistsAtPath:writableDBPath];

    if (success) return;
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sample.db"];
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
        if (!success) {
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
        }

}

もちろん、データベースにアクセスするための次のコードがあります。

FMDatabase *db; = [FMDatabase databaseWithPath:[[NSBundle mainBundle] pathForResource:@"sample" ofType:@"db"]];
if (![db open]) {
    NSLog(@"Error!");
}
else {
    NSLog(@"Database opened!!");
}

[self createEditableCopyOfDatabaseIfNeeded];
[db executeUpdate:@"Insert into user (name, phone, comment) values(?, ?, ?)", @"Name1", @"13548", @"This is a comment", nil];
NSLog(@"Inserted");

FMResultSet *s = [db executeQuery:@"SELECT * FROM user"];
while ([s next]) {
    NSLog(@"%@", [s stringForColumn:@"comment"]);
}

今、私はいくつかの質問があります:

  1. 挿入コードは、実行/実行時にシミュレーターで完全に機能しました。ただし、これは実際のsample.dbには影響しませんでした。これは、Macのハードドライブのどこかに書き込み可能なコピーが必要であると結論付けました。それは許容範囲です。しかし、これらのコードをiPhoneで実行するcreateEditableCopyOfDatabaseIfNeededと、メソッドが認識されず、次のエラーが発生しまし Unknown error finalizing or resetting statement > (8: attempt to write a readonly database)た。FMDBを使用してこれらのコードを機能させるにはどうすればよいですか?

  2. iPhoneで実行している場合、コピーされたデータベースはどこにありますか?コピーした後、iPhoneは私のMacに接続していなくても、そのデータベースを再び使用しますか?

デバイスで実行したときに何かを挿入できません。助けてください。

どうもありがとう!

4

2 に答える 2

5

あなたがこれを読んでいるなら、私はあなたの問題の説明があります。

  1. Resource Bundleにファイルがある場合、それは読み取り専用ファイルです。したがって、リソースディレクトリへのデータベースパスは、読み取り目的でのみ使用できます。

  2. データベースをコピーするために作成したコードに従って、データベースはアプリケーションのドキュメントディレクトリに作成されます。このパスは、iPhoneをMacから取り外しても影響を受けません。

于 2012-08-28T07:56:30.980 に答える
0

これを試してデータベースに挿入してください

[db open];

FMResultSet *results = [db executeQueryWithFormat:@"SELECT cms_desc FROM cms_media where cms_name=%@",@"name"];

NSString *str;

while([results next]) 

{

    str=[results stringForColumn:@"cms_desc"];
}

[results close];

[db close];

プロジェクト内の.sqliteファイルをドラッグアンドドロップし、デバイス内のアプリをリセットするだけです

于 2012-04-11T11:06:08.637 に答える