Запрос FMDB со словарем - PullRequest
       20

Запрос FMDB со словарем

3 голосов
/ 22 февраля 2012

Мне нужно выполнить запрос, который будет выглядеть следующим образом:

INSERT INTO Appointments (field1, field2, field3, ..., field30) VALUES (value1, value2, value3, ..., value30)

Мои назначения хранятся в Словаре, и я хотел бы перебрать этот словарь, чтобы ключи были равны полям и значениямравные значения.

Я пытаюсь использовать executeUpdate:... withParameterDictionary:..., но не могу понять, как заставить это работать с несколькими полями, если я не знаю имен полей.Имена полей отправляются через JSON, и вместо того, чтобы вручную вводить 30 полей, я просто хотел бы пройтись по словарю и получить их таким образом.Приведенный выше код печатает NSLog, как должен выглядеть запрос, но ничего не вставляется в базу данных.Я знаю это, потому что я открываю файл базы данных симулятора после выполнения запросов, и он все еще пуст.

Как заставить работать приведенный выше код или как заставить executeQuery:... withParameterDictionary:... работать с несколькими именами.

Ответы [ 3 ]

6 голосов
/ 23 февраля 2012

Я провел несколько быстрых тестов, и это работает для меня:

NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:@"AAAA44", @"a", @"BBBB44", @"b", @"CCCC44", @"c", nil];
NSMutableArray* cols = [[NSMutableArray alloc] init];
NSMutableArray* vals = [[NSMutableArray alloc] init];
for (id key in dict) {
    [cols addObject:key];
    [vals addObject:[dict objectForKey:key]];
}
NSMutableArray* newCols = [[NSMutableArray alloc] init];
NSMutableArray* newVals = [[NSMutableArray alloc] init];
for (int i = 0; i<[cols count]; i++) {
    [newCols addObject:[NSString stringWithFormat:@"'%@'", [cols objectAtIndex:i]]];
    [newVals addObject:[NSString stringWithFormat:@"'%@'", [vals objectAtIndex:i]]];
}
NSString* sql = [NSString stringWithFormat:@"insert into test (%@) values (%@)", [newCols componentsJoinedByString:@", "], [newVals componentsJoinedByString:@", "]];
NSLog(@"%@", sql);
BOOL updateSuccess = [db executeUpdate:sql];

Хитрость заключается в добавлении ' к данным в массивах.

2 голосов
/ 29 мая 2013
NSDictionary *argsDict 
    = [NSDictionary dictionaryWithObjectsAndKeys:@"My Name", 
       @"name", nil];

[db executeUpdate:@"INSERT INTO myTable (name) VALUES (:name)"
    withParameterDictionary:argsDict];
0 голосов
/ 28 ноября 2015

Вот пример кода, который я только что написал для поддержки необязательных значений во время вставки. Просто кратко протестировано, но я думаю, что это работает.

    NSMutableDictionary* fieldsandvalues = [NSMutableDictionary dictionary];
    fieldsandvalues[@"word"] = userphrase.word;
    fieldsandvalues[@"translation"] = userphrase.translation;
    if (userphrase.samplesentence.length > 0) {
        fieldsandvalues[@"samplesentence"] = userphrase.samplesentence;
    }
    if (userphrase.notes.length > 0) {
        fieldsandvalues[@"notes"] = userphrase.notes;
    }

    NSMutableArray* keyswithcolon = [NSMutableArray array];
    for (NSString* key in fieldsandvalues.allKeys) {
        [keyswithcolon addObject:[NSString stringWithFormat:@":%@", key]];
    }

    NSString* sql = [NSString stringWithFormat:@"INSERT INTO userphrase (%@) VALUES (%@)", [fieldsandvalues.allKeys componentsJoinedByString:@","], [keyswithcolon componentsJoinedByString:@","]];
//  DLog(@"sql: %@", sql);
    if (![self.db executeUpdate:sql withParameterDictionary:fieldsandvalues]) {
        NSAssert(NO, @"Failed inserting userphrase into database! Last error: %@ - %@", self.db.lastError, self.db.lastErrorMessage);
        return nil;
    }
...