#ios #objective-c #cocoa-touch
#iOS #objective-c #cocoa-touch
Вопрос:
Я получаю данные из своей базы данных, и данные извлекаются с помощью цикла while.
success = [db executeQuery:@"SELECT * FROM apidataTwo;"];
while([success next]){
int first = [success intForColumn:@"id"];
NSString *id = [NSString stringWithFormat:@"%d",first];
[_tempArray addObject:id];
NSString *country_name = [success stringForColumn:@"country_name"];
[_tempArray addObject:country_name];
NSString *breezometer_description = [success stringForColumn:@"breezometer_description"];
[_tempArray addObject:breezometer_description];
NSString *country_description = [success stringForColumn:@"country_description"];
[_tempArray addObject:country_description];
NSString *dateString= [success stringForColumn:@"dateString"];
[_dateSectionArray addObject:dateString];
[_dataDictionary setObject:_tempArray forKey:dateString];
}
Предположим, мы получаем один и тот же ключ в разных итерациях цикла. Когда я передаю массив в NSMutableDictionary
, предыдущие значения будут заменены и потеряны.
И если я продолжу обновлять NSMutableArray
, то значения предыдущего ключа также будут добавлены к другому ключу.
Итак, в подобных ситуациях, когда мы хотим объединить значения с одним и тем же ключом, каким должен быть наш подход.
Словарь должен выглядеть следующим образом:
{
2016-10-05" = (
5,
"United States",
"Fair Air Quality",
"Good air quality"
);
"2016-10-06" = (
5,
"United States",
"Fair Air Quality",
"Good air quality"
);
}
Комментарии:
1.
if (_dataDictionary[dateString]){[(NSMutableArray*)_dataDictionary[dateString] addObjects:theNotIncremetingArray]}else{[_dataDictionary setObject:theNotIncremetingArray forKey:dateString];}
?2. @Larme Массив, который я, как вы сказали, использовал, должен быть неизменяемым?
3. Если вы хотите изменить
addObjects:
его, он должен быть изменяемым. Я опубликовал то, что, как я мог понять, было вашим вопросом, потому что это довольно неясно с «продолжать увеличивать массив».4. @Larme Массив, в котором я храню строковые значения из базы данных, является изменяемым, поэтому после каждой итерации добавляются новые значения, и это становится значением даже для тех ключей, которые я не хочу.
5. В конце вы хотите, чтобы все ваши данные
_dataDictionary
были включены, если их больше за тот же день, вы помещаете их в один и тот же массив для ключаdateString
? Дело в том, что непонятно, почему вы добавляетеid
country_name
и т.д. в массив, а не в словарь.
Ответ №1:
После того, как вы определили ключ для этого пакета данных, попробуйте извлечь объект из словаря для этого ключа. Если objectForKey:
возвращает nil
, то создайте новый изменяемый массив. Затем установите этот массив в качестве объекта словаря для этого ключа.
Затем каждый новый пакет данных добавляется в массив, а не в словарь. Вот набросок структуры:
while( /* processing data */){
// Collect this batch
NSArray * entry = ...;
// Figure out the dictionary key for the batch.
// (it doesn't have to be a string, this is just for example)
NSString * key = ...;
// Try to retrieve the object for that key
NSMutableArray * entries = _dataDictionary[key];
// If the result is `nil`, the key is not in the dictionary yet.
if( !entries ){
// Create a new mutable array
entries = [NSMutableArray array];
// Add that to the dictionary as the value for the given key
_dataDictionary[key] = entries;
}
// Now `entries` is a valid `NSMutableArray`, whether it already
// existed or was just created. Add this batch.
[entries addObject:entry];
// Move on to the next batch.
}
Комментарии:
1. @JoshCorwell Где мы добавляем значения из массива записей в ключ словаря. Должны ли мы добавлять значения из ключа после последней строки?
2. Вверху вы добавляете отдельные значения
entry
. Затем вы добавляетеentry
вentries
.entries
уже есть в словаре.3. Но где вы добавили записи в словарь. Точка, в которой вы добавили, — это место, где значение массива записей равно нулю.
4. В строке 23 в моем примере,
[entries addObject:entry];
,entries
нетnil
. Он либо извлекается из словаря, либо создается внутри оператора if.