【问题标题】:How to create array1 of array2 which value is being replaced with every new query result from DynamoDB如何创建 array2 的 array1 值被 DynamoDB 的每个新查询结果替换
【发布时间】:2016-05-09 20:16:41
【问题描述】:

我查询到 DynamoDB。结果存储在 queryResult 数组中。随着对数据库的每个新查询,queryResult 数组的值正在更改(替换)。当我想用所有潜在结果填充我的表格视图控制器(添加的朋友列表)时,问题就来了。

我想创建一个新数组来添加每个新收到的结果,但不幸的是,它的值会被每个新的查询结果覆盖。例如,如果我第一次想添加“Adam”,下一次想添加“Michael”,我想要一个包含值的数组:(Adam, Michael)。现在,迈克尔覆盖了亚当。我问你如何强制一个数组存储每个新添加的结果——而不是覆盖现有的结果。稍后我想遍历该数组以填充表格行。我将不胜感激每一个提示,建议。非常感谢。

- (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 需要 noempty 数组 (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];
        }
    }

【问题讨论】:

    标签: ios objective-c arrays initialization nsuserdefaults


    【解决方案1】:

    在每次任务完成时,您都在初始化一个新数组(其中没有任何项目)并只在其中添加新的查询结果。这就是为什么它似乎“覆盖”了结果。当任务完成时,您应该从用户默认值中获取以前的结果并将新的查询结果添加到其中。我已经更新了你的代码来展示如何做到这一点:

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

    【讨论】:

    • 谢谢你,你拯救了我的一天! :)
    猜你喜欢
    • 2022-11-06
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多