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

問題は、これらのテキスト フィールドの 1 つが空白の場合、nil値が値のリストの最後に到達したことを辞書に伝えるため、NSDictionary が切り捨てられることです。

ディクショナリ内の各値に対して空白のオブジェクトがあることを確認することで、この問題をうまく回避できます (たとえば、 string のように@"")。

しかし、私の値は、. ではなく「空白」の値として SQLite データベースに到着しますNULL。これは大したことではないかもしれませんが、使用NULLするとデータベース内のスペースが少なくて済むと聞きました。

NULLNSDictionary を途中で切り捨てずにデータベースに挿入するにはどうすればよいですか?

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 に答える