Install dependencies
$ npx amplify-app@latest $ yarn add @aws-amplify/core @aws-amplify/datastore $ yarn add @react-native-community/netinfo $ cd ios && pod install && cd ..
Setup React Native app
Setup “amplify/backend/api/amplifyDatasource/schema.graphql”
enum PostStatus { ACTIVE INACTIVE } type Post @model { id: ID! title: String! comments: [Comment] @connection(name: "PostComments") rating: Int! status: PostStatus! } type Comment @model { id: ID! content: String post: Post @connection(name: "PostComments") }
Create Amplify app
- Delete “.config/project-config.json” to create new app
- Run “$ amplify init“
Add backend API for Amplify app
$ amplify add api ? Please select from one of the below mentioned services: GraphQL ? Provide API name: datastore ? Choose the default authorization type for the API API key ? Enter a description for the API key: testing ? After how many days from now the API key should expire (1-365): 365 ? Do you want to configure advanced settings for the GraphQL API No, I am done. ? Do you have an annotated GraphQL schema? No ? Do you want a guided schema creation? Yes ? What best describes your project: One-to-many relationship (e.g., “Blogs” with “Posts” and “Comments”) ? Do you want to edit the schema now? Yes Please edit the file in your editor: /Volumes/Data/react-native-aws-amplify-datastore/amplify/backend/api/datastore/schema.graphql
- Open “amplify/backend/api/AmplifyDatastore/schema.graphql”
- Copy paste content of “amplify/backend/api/amplifyDatasource/schema.graphql” to this one
? Press enter to continue
Push to cloud
$ amplify push Edit your schema at /Volumes/Data/react-native-aws-amplify-datastore/amplify/backend/api/datastore/schema.graphql or place .graphql files in a directory at /Volumes/Data/react-native-aws-amplify-datastore/amplify/backend/api/datastore/schema
? Do you want to generate code for your newly created GraphQL API Yes ? Choose the code generation language target javascript ? Enter the file name pattern of graphql queries, mutations and subscriptions src/graphql/**/*.js ? Do you want to generate/update all possible GraphQL operations - queries, mutations and subscriptions Yes ? Enter maximum statement depth [increase from default if your schema is deeply nested] 2
Build React Native app dealing with local data
Generate models
yarn amplify-modelgen
If no model is created, check “amplify/.config/local-env-info.json” to see “projectPath” is correct or not
Coding
/** * React Native DataStore Sample App */ import React, {Component} from 'react'; import {Text, StyleSheet, ScrollView} from 'react-native'; import Amplify from '@aws-amplify/core'; import {DataStore, Predicates} from '@aws-amplify/datastore'; import {Post, PostStatus, Comment} from './src/models'; import awsConfig from './aws-exports'; Amplify.configure(awsConfig); let subscription; class App extends Component { constructor(props) { super(props); this.state = { posts: [], }; } componentDidMount() { this.onQuery(); subscription = DataStore.observe(Post).subscribe(msg => { console.log('SUBSCRIPTION_UPDATE', msg); this.onQuery(); }); } componentWillUnmount() { subscription.unsubscribe(); } onCreatePost() { // Data is persisted in offline storage DataStore.save( new Post({ title: `New Post ${Date.now()}`, rating: (function getRandomInt(min, max) { min = Math.ceil(min); max = Math.floor(max); return Math.floor(Math.random() * (max - min)) + min; //The maximum is exclusive and the minimum is inclusive })(5, 10), status: PostStatus.ACTIVE, }), ); } async onCreatePostAndComments() { const post = new Post({ title: `New Post with comments ${Date.now()}`, rating: 5, status: PostStatus.ACTIVE, }); await DataStore.save(post); for (let i = 0; i < 2; i++) { DataStore.save( new Comment({ content: `New comment ${Date.now()}`, post, }), ); } } onQuery = async () => { const posts = await DataStore.query(Post, c => c.rating('gt', 2)); console.log('QUERY_POSTS_RESULT', posts); const comments = await DataStore.query(Comment); this.setState({posts}); console.log('QUERY_COMMENTS_RESULT', comments); }; onDelete = async () => { const deletedPosts = await DataStore.delete(Post, Predicates.ALL); console.log('DELETE_RESULT', deletedPosts); }; render() { return ( <ScrollView style={styles.scrollview} contentContainerStyle={styles.container}> <Text style={styles.text} onPress={this.onCreatePost}> Create Post </Text> <Text style={styles.text} onPress={this.onCreatePostAndComments}> Create Post & Comments </Text> <Text style={styles.text} onPress={this.onQuery}> Query Posts </Text> <Text style={styles.text} onPress={this.onDelete}> Delete All Posts </Text> {this.state.posts.map((post, i) => ( <Text key={i}>{`${post.title} ${post.rating}`}</Text> ))} </ScrollView> ); } } const styles = StyleSheet.create({ scrollview: { paddingTop: 40, flex: 1, }, container: { alignItems: 'center', }, text: { fontSize: 20, textAlign: 'center', margin: 10, }, }); export default App;
git reference: react-native-aws-amplify-datastore
Error
Check “amplify/.config/local-env-info.json” to make sure “projectPath” correct
Leave a Reply