0

Android SDK for AWS SDB の使用を開始したばかりですが、書き込みと読み取りで予期しない結果が発生しています。これは確かに簡単な問題なので、説明をいただければ幸いです。

これが問題です。

まず、次のように SDB にレコードを書き込みます。

sdb.createDomain(new CreateDomainRequest("myDomain"));

List<ReplaceableAttribute> attributes = new ArrayList<ReplaceableAttribute>(1);
attributes.add(new ReplaceableAttribute().withName("myField").withValue(myField));

sdb.putAttributes(new PutAttributesRequest("myDomain", itemName, attributes));

Chrome SdbNavigator を使用して、myField の値が SDB に正しく書き込まれていることがわかります。

ここで、同じコードを使用してレコードを変更しますが、myField 属性の値は異なります。ここでも、SdbNavigator を使用してレコードが新しい値で正しく書き込まれていることがわかります。

最後に、デバイスからアプリをアンインストール (つまり、完全に消去) し、アプリを再インストールしてから再度実行して、次のコードを実行します。

String s = "select * from `myDomain`";
SelectRequest selectRequest = new SelectRequest(s).withConsistentRead(true);
List items = sdb.select(selectRequest).getItems();

int count = items.size();

for (int i=0; i<count; i++) {
    Item item = (Item)(items.get(i));
    String itemName = item.getName();

    myField = getStringValueForAttributeFromList("myField", item.getAttributes());
}

getStringValueForAttributeFromList() は次のように定義されます。

protected String getStringValueForAttributeFromList( String attributeName, List<Attribute> attributes ) {
    for ( Attribute attribute : attributes ) {
        if ( attribute.getName().equals( attributeName ) ) {
            return attribute.getValue();
        }
    }
    return "";      
}

予期しない部分は、sdbNavigator がレコードに 2 番目の (正しい) 値があることを示しているにもかかわらず、getStringValueForAttributeFromList() 関数が myField 属性の最初の (現在は正しくない) 値を返すことです。

何が起こっているのか、どのように修正するのか?? ありがとう。

4

1 に答える 1

0

解決済み: 私が直面していた問題は、SDB が同じレコード (項目) で同じ名前の複数の属性を許可するため、属性 myField に設定した最初の値を取得していたことです。

一意性を保証したい場合は、次のように置換可能な属性にフラグを設定する必要があります。

ReplaceableAttribute ra = new ReplaceableAttribute().withName("myField").withValue(myField);
ra.setReplace(true); attributes.add(ra);

そして、上記のように putAttributesRequest() を呼び出します。ありがとう。

于 2012-09-02T20:00:42.943 に答える