4

我遇到了一些问题 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. 这可能没什么大不了的,但我听说 usingNULL会占用更少的数据库空间。

如何在NULL不提前截断我的 NSDictionary 的情况下插入我的数据库?

4

3 回答 3

5

也花了一些时间研究这个。我的解决方案(使用 Swift,但 Objective C 应该是相同的)是使用NSNull而不是nil

于 2015-04-24T07:43:46.633 回答
2

您可以不使用“花哨”的 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];
于 2013-08-14T01:42:46.413 回答
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];

现在插入只包含您要插入的字段,因此它非常高效。

于 2014-03-06T01:23:20.270 回答