我遇到了一些问题22.我正在使用FMDB的花式withParameterDictionary
方法将数据插入到我的SQLite数据库中,如下所示:
NSDictionary *aircraftDict = [NSDictionary dictionaryWithObjectsAndKeys:
self.aircraftIdTextField.text, @"aircraft_id",
self.makeModelTextField.text, @"make_model",
self.categoryClassTextField.text, @"category_class",
@YES, @"updated_flag",
nil];
NSString *addAircraftQuery = @"INSERT INTO aircrafts (aircraft_id, make_model, category_class, updated_flag) VALUES (:aircraft_id, :make_model, :category_class, :updated_flag)";
[db executeUpdate:addAircraftQuery withParameterDictionary:aircraftDict];
问题是,当其中一个文本字段为空时,它会截断NSDictionary,因为nil
值告诉字典它已到达其值列表的末尾。
我可以通过确保字典中的每个值都有一个空白对象来解决这个问题(例如像字符串@""
)。
然后我的值作为“空白”值而不是NULL
到达我的SQLite数据库。这可能不是什么大问题,但我听说使用NULL
将占用数据库中较少的空间。
如何在不过早截断我的NSDictionary的情况下将NULL
插入我的数据库?
答案 0 :(得分:4)
花了一段时间研究这个。我的解决方案(使用Swift,但目标C应该相同)是使用NSNull
而不是nil
答案 1 :(得分:2)
你可以不使用“fancy”withParameterDictionary方法,而是像这样使用枯燥的executeUpdate:
NSString *addAircraftQuery = @"INSERT INTO aircrafts (aircraft_id, make_model, category_class, updated_flag) VALUES (?, ?, ?, ?)";
[db executeUpdate:addAircraftQuery, self.aircraftDict, self.makeModelTextField.text, self.categoryClassTextField.text, @YES];
答案 2 :(得分:1)
为了保持它的幻想,请试一试,对我有用:
NSDMutableDictionary *aircraftDict = [NSDMutableDictionary dictionary];
// only insert non-nil text fields
if(self.aircraftIdTextField.text){
aircraftDict[@"aircraft_id"] = self.aircraftIdTextField.text;
}
etc for all other text fields...
NSArray* keys = [aircraftDict allKeys];
NSMutableArray *prefixedKeys = [NSMutableArray array];
[keys enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[prefixedKeys addObject:[NSString stringWithFormat:@":%@",obj]];
}];
NSString *addAircraftQuery = [NSString stringWithFormat: @"INSERT INTO aircrafts (%@) VALUES (%@)",[keys componentsJoinedByString:@","],[prefixedKeys componentsJoinedByString:@","]];
[db executeUpdate:addAircraftQuery withParameterDictionary:aircraftDict];
现在插入只包含您要插入的字段,因此它非常有效。