1

私のsqliteデータベースにいくつかの値を挿入しようとしています。db はすでに電話の doc フォルダにあります。何が問題なのかわかりません。トレースの実行を設定しましたが、データベースはエラーがないことを示しています。誰かが私を助けることができますか?

if([[TRSharedLocalDatabase openDatabase] executeUpdateWithFormat:@"INSERT INTO event (title,date,address,latitude,longitude,location,facebookID,picPath,description) VALUES (%@,%@,%@,%@,%@,%@,%@,%@,%@)",event.title ,event.date, event.address, [NSNumber numberWithDouble:event.geoPoint.longitude], [NSNumber numberWithDouble:event.geoPoint.latitude], event.location.objectId, event.facebookID ,picPath ,event.description]) {    
    NSLog(@"Ok");  
} else {  
    NSLog(@"Not Ok");  
}  

+(FMDatabase *)openDatabase {  
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];  
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"4PartyLocalSystem.sqlite"];  
    **FMDatabase *database = [FMDatabase databaseWithPath:writableDBPath];**  
    [database open];  
    [database setTraceExecution:YES];  
    return database;   
}

2013-08-06 13:21:42.499 4Party[13018:907] executeUpdate: INSERT INTO イベント (タイトル、日付、住所、緯度、経度、場所、facebookID、picPath、説明) 値 (?,?,?,?, ?, @ ,?,?,?)

4

1 に答える 1

1

2 つの観察:

  1. lastErrorMessageエラーがある場合は、データベースを調べる必要があります。データベースを閉じる前にデータベースへの複数の呼び出しを行う場合は、データベース ポインターを別の変数に格納すると役立ちます。

    [TRSharedLocalDatabase openDatabase]データベースとの 1 つのセッションで複数回呼び出すことは絶対に避けてください。または、シングルトン パターンに準拠するようにリファクタリングすることもできます。

  2. 理想的には、printf スタイルのプレースホルダーではなく、method で?SQL のプレースホルダーを使用する必要があります ( executeUpdateWithFormat ドキュメントの警告を参照してください)。そうでない場合、エスケープする必要のある文字 (引用符など) を含むテキスト フィールドはエスケープされません。(これにより、SQL インジェクション攻撃からも保護されます。)executeUpdateexecuteUpdateWithFormat

したがって:

FMDatabase *database = [TRSharedLocalDatabase openDatabase];
if (!database) {
    NSLog(@"Unable to open database");
    return;
}

if([database executeUpdate:@"INSERT INTO event (title,date,address,latitude,longitude,location,facebookID,picPath,description) VALUES (?,?,?,?,?,?,?,?,?)",event.title ,event.date, event.address, [NSNumber numberWithDouble:event.geoPoint.longitude], [NSNumber numberWithDouble:event.geoPoint.latitude], event.location.objectId, event.facebookID ,picPath ,event.description]) {    
    NSLog(@"Ok");  
} else {  
    NSLog(@"Not Ok: %@", [database lastErrorMessage]);  
}  

[database close];
于 2013-08-06T16:46:26.920 に答える