2016-05-09 9 views
0

DynamoDBにクエリします。結果はqueryResult配列に格納されます。データベースへの新しいクエリのたびに、queryResult配列の値が変更(置換)されます。この問題は、テーブルビューコントローラ(追加された友人のリスト)にすべての潜在的な結果を設定したいときに発生します。Array2のarray1を作成する方法DynamoDBの新しいクエリ結果ごとに値が置換される

すべての新しい受信結果を追加する新しい配列を作成したいと思いますが、残念ながらその値は新しいクエリ結果ごとに上書きされます。たとえば、初めて「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; 
    }]; 

}

EDIT: あなたが最初にあなたの非常に最初のクエリの結果を保存する必要があります。 arrayByAddingObjectFromArrayは、他の配列(queryResult)の結果を追加するには、noempty配列(previousQueryResult)が必要です。さもなければ、あなたはnullステートメントで終わるでしょう、そして、あなたは結果を積み重ねることができません。この問題は、最初のアプリケーションの起動時にのみ発生します。

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

答えて

0

各タスクの完了時に、新しい配列(項目がない)を初期化し、新しいクエリ結果のみを追加します。これが、結果を「上書きする」ように見える理由です。タスクが終了すると、ユーザーの既定値から以前の結果を取得し、新しいクエリ結果を追加する必要があります。あなたのコードを更新して、それを実行する方法を示しました。

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

ありがとう、あなたは私の一日を保存しました! :) – Filip

関連する問題