如何创建 array1 的 array2,其值被 DynamoDB 的每个新查询结果替换
How to create array1 of array2 which value is being replaced with every new query result from DynamoDB
我查询到 DynamoDB。结果存储在 queryResult 数组中。随着对数据库的每个新查询,queryResult 数组的值都会被更改(替换)。当我想用所有可能的结果填充我的 table 视图控制器(添加的朋友列表)时,问题就来了。
我想创建一个新数组来添加每个新收到的结果,但不幸的是它的值被每个新查询结果覆盖。例如,如果第一次我想添加 "Adam" 并且下一次 "Michael" 我想要一个包含以下值的数组:(Adam, Michael)。现在,Michael 覆盖了 Adam。我问你如何强制一个数组存储每个新添加的结果——而不是覆盖现有的结果。稍后我想遍历该数组以填充 tables 行。我将不胜感激每一个提示和建议。非常感谢。
- (IBAction)addButton:(UIButton *)sender {
//To store credentials typed by user.
NSString *userName = self.nameTypedTextField.text;
NSString *phoneNumber = self.phoneNumberTextField.text;
//To query for typed credentials.
AWSDynamoDBQueryExpression *query = [AWSDynamoDBQueryExpression new];
query.hashKeyAttribute = @"userPhoneNumber";
query.hashKeyValues = phoneNumber;
//To receive typed credentials.
AWSDynamoDBObjectMapper *objectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];
[[objectMapper query:[Users class] expression:query] continueWithBlock:^id(AWSTask *task) {
if (task.error) NSLog(@"The request failed. Error: [%@]", task.error);
if (task.exception) NSLog(@"The request failed. Exception: [%@]", task.exception);
if (task.result) {
//I receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
//I wanted to create array that adds every object that is being stored in queryResult array. It doesnt work - it simply replaces its value with new result.
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObjectsFromArray:queryResult];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//Must be converted to NSData becouse of: Attempt to set a non-property-list object as an NSUserDefualts.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:queryResult];
[userDefaults setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return nil;
}];
}
编辑:
您需要先保存您的第一个查询结果。 arrayByAddingObjectFromArray 不需要空数组 (previousQueryResult) 来添加来自其他数组 (queryResult) 的结果。否则你将以空语句结束并且你将无法叠加结果。该问题仅在首次启动应用程序时出现。
if (task.result) {
//To receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
//Get the previously stored query results.
NSData *previousData = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults = [NSKeyedUnarchiver unarchiveObjectWithData:previousData];
//If previousQueryResults is empty (due to first applcation launch).
if ([previousQueryResults count] == 0) {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:queryResult];
[[NSUserDefaults standardUserDefaults]setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
} else {
//Get the previously stored query results.
NSData *previousData2 = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults2 = [NSKeyedUnarchiver unarchiveObjectWithData:previousData2];
//Add the new query results to what was previously stored.
NSArray *updatedArray = [previousQueryResults2 arrayByAddingObjectsFromArray:queryResult];
NSLog(@"Updated array: %@", updatedArray);
//Store the combined query results to user defaults.
NSData *dataUpdated = [NSKeyedArchiver archivedDataWithRootObject:updatedArray];
[[NSUserDefaults standardUserDefaults]setObject:dataUpdated forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
在每个任务完成时,您将初始化一个新数组(其中没有任何项目)并仅在其中添加新的查询结果。这就是为什么它看起来像是 "overwriting" 的结果。任务完成后,您应该从用户默认值中获取先前的结果并将新的查询结果添加到其中。我已经更新了您的代码以展示如何做到这一点:
if (task.result) {
//I receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
// Get the previously stored query results
NSData *previousData = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults = [NSKeyedUnarchiver unarchiveObjectWithData:previousData];
// Add the new query results to what was previously stored
NSArray *array = [previousQueryResults arrayByAddingObjectsFromArray:queryResults];
// Store the combined query results to user defaults
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
我查询到 DynamoDB。结果存储在 queryResult 数组中。随着对数据库的每个新查询,queryResult 数组的值都会被更改(替换)。当我想用所有可能的结果填充我的 table 视图控制器(添加的朋友列表)时,问题就来了。
我想创建一个新数组来添加每个新收到的结果,但不幸的是它的值被每个新查询结果覆盖。例如,如果第一次我想添加 "Adam" 并且下一次 "Michael" 我想要一个包含以下值的数组:(Adam, Michael)。现在,Michael 覆盖了 Adam。我问你如何强制一个数组存储每个新添加的结果——而不是覆盖现有的结果。稍后我想遍历该数组以填充 tables 行。我将不胜感激每一个提示和建议。非常感谢。
- (IBAction)addButton:(UIButton *)sender {
//To store credentials typed by user.
NSString *userName = self.nameTypedTextField.text;
NSString *phoneNumber = self.phoneNumberTextField.text;
//To query for typed credentials.
AWSDynamoDBQueryExpression *query = [AWSDynamoDBQueryExpression new];
query.hashKeyAttribute = @"userPhoneNumber";
query.hashKeyValues = phoneNumber;
//To receive typed credentials.
AWSDynamoDBObjectMapper *objectMapper = [AWSDynamoDBObjectMapper defaultDynamoDBObjectMapper];
[[objectMapper query:[Users class] expression:query] continueWithBlock:^id(AWSTask *task) {
if (task.error) NSLog(@"The request failed. Error: [%@]", task.error);
if (task.exception) NSLog(@"The request failed. Exception: [%@]", task.exception);
if (task.result) {
//I receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
//I wanted to create array that adds every object that is being stored in queryResult array. It doesnt work - it simply replaces its value with new result.
NSMutableArray *array = [[NSMutableArray alloc] init];
[array addObjectsFromArray:queryResult];
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//Must be converted to NSData becouse of: Attempt to set a non-property-list object as an NSUserDefualts.
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:queryResult];
[userDefaults setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
return nil;
}];
}
编辑: 您需要先保存您的第一个查询结果。 arrayByAddingObjectFromArray 不需要空数组 (previousQueryResult) 来添加来自其他数组 (queryResult) 的结果。否则你将以空语句结束并且你将无法叠加结果。该问题仅在首次启动应用程序时出现。
if (task.result) {
//To receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
//Get the previously stored query results.
NSData *previousData = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults = [NSKeyedUnarchiver unarchiveObjectWithData:previousData];
//If previousQueryResults is empty (due to first applcation launch).
if ([previousQueryResults count] == 0) {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:queryResult];
[[NSUserDefaults standardUserDefaults]setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
} else {
//Get the previously stored query results.
NSData *previousData2 = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults2 = [NSKeyedUnarchiver unarchiveObjectWithData:previousData2];
//Add the new query results to what was previously stored.
NSArray *updatedArray = [previousQueryResults2 arrayByAddingObjectsFromArray:queryResult];
NSLog(@"Updated array: %@", updatedArray);
//Store the combined query results to user defaults.
NSData *dataUpdated = [NSKeyedArchiver archivedDataWithRootObject:updatedArray];
[[NSUserDefaults standardUserDefaults]setObject:dataUpdated forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}
}
在每个任务完成时,您将初始化一个新数组(其中没有任何项目)并仅在其中添加新的查询结果。这就是为什么它看起来像是 "overwriting" 的结果。任务完成后,您应该从用户默认值中获取先前的结果并将新的查询结果添加到其中。我已经更新了您的代码以展示如何做到这一点:
if (task.result) {
//I receive query result.
AWSDynamoDBPaginatedOutput *paginatedOutput = task.result;
NSArray *queryResult = [[NSArray alloc] initWithArray:paginatedOutput.items];
NSLog(@"Query result: %@", queryResult);
// Get the previously stored query results
NSData *previousData = [[NSUserDefaults standardUserDefaults] dataForKey:@"User Data"];
NSArray *previousQueryResults = [NSKeyedUnarchiver unarchiveObjectWithData:previousData];
// Add the new query results to what was previously stored
NSArray *array = [previousQueryResults arrayByAddingObjectsFromArray:queryResults];
// Store the combined query results to user defaults
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
[[NSUserDefaults standardUserDefaults] setObject:data forKey:@"User Data"];
[[NSUserDefaults standardUserDefaults] synchronize];
}