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] 执行更新:插入事件(标题、日期、地址、纬度、经度、位置、facebookID、picPath、描述)值(?,?,?,?, ?, @ ,?,?,?)

4

1 回答 1

1

两个观察:

  1. lastErrorMessage如果您有错误,您应该检查数据库。如果您要在关闭数据库之前多次调用数据库,则将数据库指针存储在单独的变量中会有所帮助。

    您绝对不想[TRSharedLocalDatabase openDatabase]多次调用您的数据库的一个会话。或者您可以重构它以符合单例模式。

  2. 理想情况下,您应该?在 SQL withexecuteUpdate方法中使用占位符,而不是 printf 样式的占位符 with (请参阅executeUpdateWithFormat 文档executeUpdateWithFormat中的警告)。如果没有,您的文本字段中的字符需要转义(例如引号)将不会出现。(这也可以保护您免受 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];
于 2013-08-06T16:46:26.920 回答