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];
}
}
ありがとう、あなたは私の一日を保存しました! :) – Filip