1

私は SQLITE データベースを初めて使用し、FMDB を使用しています。私のアプリでは、データベースにデータを挿入したいと考えています。次のコードを使用してデータを挿入しました。

-(void)insertBookmark
{

    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];
    NSString *dbFilePath = [bundlePath stringByAppendingPathComponent:@"ISGData.sqlite"];
    FMDatabase *database = [FMDatabase databaseWithPath:dbFilePath];
    [database open];
    [database executeUpdate:@"INSERT INTO bookmark (pageno) VALUES (?);",page, nil];
    NSLog(@"%@",[database lastErrorMessage]);
    [database close];

}

ここで、「ブックマーク」は、整数型の「pageno」という名前のエンティティを持つデータベース内のテーブルの名前です。クエリで int 値を渡していると、不正なアクセスを示すアプリがクラッシュします。文字列値を渡すと、ログに「エラーではありません」と表示されますが、値がデータベースに挿入されません。私のコードに間違いはありますか?

4

2 に答える 2

4

アプリケーション バンドル内のデータベースを変更しようとしています。バンドル自体は読み取り専用です。これを行うには、まずデータベース ファイルをドキュメント ディレクトリにコピーしてから、それを開いて変更する必要があります。

つまり、関数の最初の 3 行を次のように置き換えます。

FMDatabase *database = [self openDatabase];

このopenDatabase回答のように定義されている場合:既存のデータベース fmdb をどのように開き、どこに含めるか?

于 2013-04-22T07:44:27.367 に答える
0

ハンパスは正しいです。書き込み操作を実行するには、ドキュメント ディレクトリにコピーする必要があります。

BOOL success;
NSError *error;

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingString:@"ISGData.sqlite"];

success = [fileManager fileExistsAtPath:filePath];
if (success) return;

NSString *path = [[[NSBundle mainBundle] resourcePath] stringByAppendingFormat:@"ISGData.sqlite"];
success = [fileManager copyItemAtPath:path toPath:filePath error:&error];

if (!success) {
    NSAssert1(0, @"Failed to copy DB. Error %@", [error localizedDescription]);
}
于 2013-04-22T07:49:06.973 に答える