2013-08-06 93 views
1

我試圖插入一些值到我的sqlite數據庫。數據庫已經在手機上的doc文件夾中。我不知道發生了什麼問題。我設置跟蹤執行,但數據庫告訴我,它沒有任何錯誤。有人能幫我嗎?iOS:SQLite插入查詢不起作用

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年8月6日13:21:42.499 4Party [13018:907]的executeUpdate:INSERT INTO事件(標題,日期,地址,緯度,經度,位置,facebookID,picPath介紹)VALUES

+2

拉斐爾,如果你提供的有關'TRSharedLocalDatabase'更多信息,這將是有益的。你可以分享「openDatabase」方法的代碼嗎?確切地說,如果不瞭解更多關於代碼的功能,將很難幫助您。 – Aaron

+0

openDatabase方法僅用於打開數據庫。這裏是:NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString * documentsDirectory = [paths objectAtIndex:0]; NSString * writableDBPath = [documentsDirectory stringByAppendingPathComponent:@「4PartyLocalSystem.sqlite」]; FMDatabase * database = [FMDatabase databaseWithPath:writableDBPath]; [數據庫打開]; [數據庫setTraceExecution:YES]; 返回數據庫; –

+1

請通過編輯將問題添加到問題中,而不是將其添加到評論中。在評論 –

回答

1

兩次觀測(,,,,,@,,,????????):

  1. 你應該檢查數據庫的lastErrorMessage如果你有一個電子RROR。如果要在關閉數據庫之前對數據庫執行多個調用,那麼它可以幫助將數據庫指針存儲在單獨的變量中。

    您絕對不想在您的數據庫中多次調用[TRSharedLocalDatabase openDatabase]一次會話。或者你可以重構它以符合單例模式。

  2. 理想情況下,你應該在你的SQL與executeUpdate方法,而不是printf風格的佔位符使用?佔位符與executeUpdateWithFormat(見executeUpdateWithFormat documentation警告)。如果不是,則需要轉義字符的文本字段(例如引號)將不會被使用。 (這也保護您免受SQL注入攻擊。)

這樣:

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]; 
+0

謝謝!我將FMDatabase存儲在一個變量中,然後DB可以記錄lastErrorMessage!現在我修復了查詢! –