我所需要的非常简单,在SQL中,我只需要SORT ASCENDING或DESCENDING。
但是使用GraphQL,AppSync,DynamoDB和React-Native已经有一段时间了,我仍然不知道如何按名称对输出列表进行排序...
我使用的是简单的场景,没有React-Native Apollo,仅使用Connect组件。
我的输出列表:
class PlantScreenNoApollo extends React.Component {
...
render() {
return (
<View style={{flex:1, flexDirection:"column", justifyContent:"flex-start"}}>
<View style={{flex:1,
flexDirection:"row",
justifyContent:"center",
}}>
<TextInput style={styles.sTextInput}
onChangeText={ (text) => this._updateFilter(text) }
value={this.state.filter}/>
<Ionicons name={"ios-search"} size={30} />
</View>
<View style={{ flex:1,
flexDirection:"column",
justifyContent:"flex-start",
alignContent: "center",
minHeight: "70%",}}>
<Connect query={ this.state.filter!=="" ?
graphqlOperation(queries.listPlants, {
filter: {
name: {
contains: this.state.filter
}
}
})
:
graphqlOperation(queries.listPlants)
}>
{
( { data: { listPlants }, loading, error } ) => {
if(error) return (<Text>Error</Text>);
if(loading || !listPlants) return (<ActivityIndicator />);
return (
<FlatList
data={listPlants.items}
renderItem={({item}) => {
return (
<View style={{borderBottomWidth:1, borderBottomColor:"green", padding:5}}>
<TouchableOpacity onPress={()=>this._onPress(item)}>
<View style={styles.hcontainer}>
<Image source={{uri:this.state.logoURL}}
style={styles.iconImage}
/>
<View style={styles.vcontainer}>
<Text style={styles.textH3}>{item.name}</Text>
<View style={styles.hcontainerflexstart}>
{ item.tea && <Image source={{uri:this.state.teaIconURL}} style={styles.iconImageSmall} />}
{ item.bath && <Image source={{uri:this.state.bathIconURL}} style={styles.iconImageSmall} />}
{ item.insence && <Image source={{uri:this.state.insenceIconURL}} style={styles.iconImageSmall} />}
{ item.children && <Image source={{uri:this.state.childrenIconURL}} style={styles.iconImageSmall} />}
</View>
</View>
<Text style={styles.textP}>{item.description.substr(0,50) + "(...)"}</Text>
</View>
</TouchableOpacity>
</View>
);
}}
keyExtractor={(item, index) => item.id}
/>
);
}
}
</Connect>
</View>
<View style={{flex:1, flexDirection:"column", justifyContent:"flex-start"}}>
...
</View>
</View>
);
};
}
这是我的查询描述(由模型+代码生成自动生成)
export const listPlants = `query ListPlants(
$filter: ModelPlantFilterInput
$limit: Int
$nextToken: String
) {
listPlants(filter: $filter, limit: $limit, nextToken: $nextToken) {
items {
id
name
description
...
}
nextToken
}
}
我只想按名称对扫描进行排序。
我什至试图创建一个二级索引,但是它没有任何改变...
有人知道实现此目标的最佳方法吗?
答案 0 :(得分:1)
更改您的listPlants解析器以执行查询而不是执行扫描,您可以利用scanIndexForward布尔值基于提供的索引来确定要返回的结果是升序还是降序(在您的情况下为“名称”)
这将要求您为DynamoDB中的name属性建立索引。
有关更多信息,请参阅以下文档中的“查询”部分:
尤其是:
ScanIndexForward
指定索引遍历的顺序:如果为true(默认值),则以升序执行遍历;否则为false。如果为false,则以降序执行遍历。
具有相同分区键值的项目按排序键按排序顺序存储。如果排序键数据类型为数字,则结果以数字顺序存储。对于字符串类型,结果以UTF-8字节的顺序存储。对于Binary类型,DynamoDB将二进制数据的每个字节都视为无符号。
如果ScanIndexForward为true,则DynamoDB以结果存储的顺序(按排序键值)返回结果。这是默认行为。如果ScanIndexForward为false,则DynamoDB按排序键值以相反的顺序读取结果,然后将结果返回给客户端。