Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 消除Dynamo更新查询的范围键条件?_Android_Amazon Web Services_Amazon Dynamodb - Fatal编程技术网

Android 消除Dynamo更新查询的范围键条件?

Android 消除Dynamo更新查询的范围键条件?,android,amazon-web-services,amazon-dynamodb,Android,Amazon Web Services,Amazon Dynamodb,我怎样才能让Dynamo的UpdateItemRequest忽略范围键,或者做一个粗略的测试,比如NOTNULL 我使用的是一个包含记录更新时间的范围键。另外,我使用不是键的ID字段更新所选的行。我使用UpdateItemRequest中的expectedAttribute更新ID字段。Dynamo的UpdateItemRequest强制我指定一个范围键值。我的ID更新代码将不知道范围键值。我是否可以不指定范围键而不获得错误?或者我可以提供一个简单的范围键测试,比如NOTNULL吗 当我删除范围

我怎样才能让Dynamo的UpdateItemRequest忽略范围键,或者做一个粗略的测试,比如NOTNULL

我使用的是一个包含记录更新时间的范围键。另外,我使用不是键的ID字段更新所选的行。我使用UpdateItemRequest中的expectedAttribute更新ID字段。Dynamo的UpdateItemRequest强制我指定一个范围键值。我的ID更新代码将不知道范围键值。我是否可以不指定范围键而不获得错误?或者我可以提供一个简单的范围键测试,比如NOTNULL吗

当我删除范围键时,AWS抛出一个错误,“提供的键元素与架构不匹配”

//构建更新映射
HashMap updates=新建HashMap();
AttributeValue av=新的AttributeValue(),带n(“1”);
AttributeValueUpdate avu=新的AttributeValueUpdate().withValue(av).withAction(AttributeAction.PUT);
更新。放置(“第1列”,avu);
AttributeValue av2=新的AttributeValue(),带n(“2”);
AttributeValueUpdate avu2=新的AttributeValueUpdate().withValue(av2).withAction(
定语从句;
更新.put(“Column2”,avu2);
//构建关键地图
HashMap keyMap=新HashMap();
AttributeValue hashValue=新的AttributeValue(),带n(“10”);
keyMap.put(“hashKey”,hashValue);
AttributeValue lastModKeyValue=新的AttributeValue(),带n(“1404175127074”);
//******我想取下这把钥匙,但迪纳摩出错了
放置(“problemRangeKey”,lastModKeyValue);
//期望值比较
AttributeValue idValue=新的AttributeValue(),带n(“100”);
ExpectedAttributeValue expected=新的ExpectedAttributeValue(idValue);
UpdateItemRequest request=new UpdateItemRequest().withTableName(DatabaseConstants.CHART\u TABLE)
.withKey(键映射)。WithAttributeUpdate(更新)。addExpectedEntry(ID,预期值);
ddb.updateItem(请求);
为清楚起见,以下是如何使用range键在特定时间后查找行。如果我删除这个时间范围,那么每次我都会进行一次大扫描,以在特定时间后查找行

 Map keyConditions = new HashMap();

    AttributeValue attribute = new AttributeValue().withN("10");

    Condition hashKeyCondition = new Condition().withComparisonOperator(ComparisonOperator.EQ.toString())
            .withAttributeValueList(attribute);

    keyConditions.put("hashKey", hashKeyCondition);

    // specify new records
    long lastQueryTime = PrefsActivity.getLastDynamoQueryTime(activity);
    String lastTimeString = String.valueOf(lastQueryTime);

    Log.v(TAG, "get Charts from dynamo that are after " + lastTimeString);

    // update the query time to now
    long now = System.currentTimeMillis();
    PrefsActivity.setLastDynamoQueryTime(activity, now);

    AttributeValue timeAttribute = new AttributeValue().withN(lastTimeString);

    Condition timeCondition = new Condition().withComparisonOperator(ComparisonOperator.GT.toString())
            .withAttributeValueList(timeAttribute);

    keyConditions.put("problemRangeKey", timeCondition);


        List<Map<String, AttributeValue>> ChartsInMaps = new ArrayList<Map<String, AttributeValue>>();

        Map lastEvaluatedKey = null;

        QueryRequest request = new QueryRequest().withTableName("tableName")
                    .withKeyConditions(keyConditions).withExclusiveStartKey(lastEvaluatedKey);

        QueryResult result = ddb.query(request);
Map keyConditions=newhashmap();
AttributeValue属性=新的AttributeValue();
Condition hashKeyCondition=new Condition()。withComparisonOperator(ComparisonOperator.EQ.toString())
.withAttributeValueList(属性);
keyConditions.put(“hashKey”,hashKeyCondition);
//指定新记录
long lastQueryTime=PrefsActivity.getLastDynamoQueryTime(活动);
String lastTimeString=String.valueOf(lastQueryTime);
Log.v(标记“从dynamo获取在“+lastTimeString”之后的图表);
//将查询时间更新到现在
long now=System.currentTimeMillis();
setLastDynamoQueryTime(活动,现在);
AttributeValue timeAttribute=新的AttributeValue().withN(lastTimeString);
Condition timeCondition=new Condition()。带有ComparisonOperator(ComparisonOperator.GT.toString())
.withAttributeValueList(时间属性);
keyConditions.put(“problemRangeKey”,timeCondition);
List ChartsInMaps=new ArrayList();
Map lastEvaluatedKey=null;
QueryRequest请求=新建QueryRequest()。带有tableName(“tableName”)
.withKeyConditions(keyConditions)。withExclusiveStartKey(lastEvaluatedKey);
QueryResult result=ddb.query(请求);
我正在使用最新的AWS Android SDK。在上面的示例中,我将hashKey设置为“10”。实际上,情况会有所不同

提前感谢您的帮助


Jeff

问题是,您想用特定的hashKey值和特定的列值(列名是id)更新所有项目

该表是哈希范围架构。由于不知道range键,因此必须使用该hashKey获取所有行,然后根据列值(ID==value)进行筛选。你可以使用它来高效地完成这项工作。然后,对于查询中的每一行,使用期望值(ID==value)执行一个条件put,以确保正确

QueryRequest request = new QueryRequest();
// set up query request (table name, etc)
// set up query filter (ID == value)

QueryResponse response = client.query(request)

for (item in response.items):
    PutItemRequest req = new PutItemRequest();
    // set up put item request
    // set up primary key for item to update
    //    hashkey = item.hashkey
    //    rangekey = item.rangeKey
    // set up expected value (ID == value)
    client.updateItem(req)
另一方面,由于您希望在特定时间之后高效地查询所有行,因此可以创建一个以“time”作为范围键的表,而不是将“time”作为基表的范围键。您仍然可以使用LSI进行高效查询(与按时间扫描表和筛选相比)。更重要的是,如果“ID”属性可以用hashkey唯一地标识一行,那么可以将“ID”作为基表的范围键。这样,您还可以高效地更新该项,因为您已经知道hashkey值和range key值(id值)


当然,只有当您的hashkey和“ID”能够唯一标识一行时,它才真正对您有利:)

谢谢-我按照您的建议创建了一个本地二级索引。很好!
QueryRequest request = new QueryRequest();
// set up query request (table name, etc)
// set up query filter (ID == value)

QueryResponse response = client.query(request)

for (item in response.items):
    PutItemRequest req = new PutItemRequest();
    // set up put item request
    // set up primary key for item to update
    //    hashkey = item.hashkey
    //    rangekey = item.rangeKey
    // set up expected value (ID == value)
    client.updateItem(req)