RN-AsyncStorage

作者: hliccy | 来源:发表于2017-07-14 00:50 被阅读77次

    基本概念

    1 AsyncStorage

    * AsyncStorage 是一个简单的、异步的、持久化的 Key-Value 存储系统,它对于 App 来说是全局性的。它用来代替 LocalStorage。
    * 由于它的操作是全局的,官方建议我们最好针对 AsyncStorage 进行一下抽象的封装再使用,而且不是直接拿 AsyncStorage 进行使用。 (react-native-storage)
    * AsyncStorage 存储的位置根据系统的不同而有所差异。iOS 中的存储类似于 NSUserDefault,通过 plist 文件存放在设备中。Android 中会存储在 RocksDB 或者 SQLite 中,取决于你使用哪个。
    
    

    2 相关方法

    根据键来获取值, 获取的值放在回调函数中

    static getItem(key: string, callback:(error, result))
    

    根据键来设置值。

    static setItem(key: string, value: string, callback:(error))
    

    根据键来移除项。

    static removeItem(key: string, callback:(error))
    

    合并现有值和输入值。

    static mergeItem(key: string, value: string, callback:(error))
    

    清除所有的项目

    static clear(callback:(error))
    

    获取所有的键

    static getAllKeys(callback:(error, keys))
    

    清除所有进行中的查询操作。

    static flushGetRequests()
    

    获取多项,其中 keys 是字符串数组,比如:['k1', 'k2']

    static multiGet(keys, callback:(errors, result))
    

    设置多项,其中 keyValuePairs 是字符串的二维数组,比如:[['k1', 'val1'], ['k2', 'val2']]

    static multiSet(keyValuePairs, callback:(errors))
    

    删除多项,其中 keys 是字符串数组,比如:['k1', 'k2']

    static multiRemove(keys, callback:(errors))
    

    多个键值合并,其中 keyValuePairs 是字符串的二维数组,比如:[['k1', 'val1'], ['k2', 'val2']]

    static multiMerge(keyValuePairs, callback:(errors))
    

    3 使用

    /**
     * Created by licc on 2017/7/13.
     */
    
    import React, { Component }from  'react';
    import  {
        AsyncStorage,
        Button,
        View,
        Text,
        TextInput,
        TouchableHighlight,
        StyleSheet
    } from  'react-native';
    
    import NavigationBar from './NavigationBar'
    
    export default class AsyncStorageExample extends Component {
    
        constructor(props){
            super(props);
    
            this.state = {
                username:'',
                password:''
            }
        }
    
        componentDidMount(){
    
            var keys = ['username', 'password'];
            AsyncStorage.multiGet(keys, (errs, result)=>{
    
                var _that = this;
    
                if (errs) return;
    
                _that.setState({
                    username:(result[0][1]!== null)? result[0][1]:'',
                    password:(result[1][1]!== null)? result[1][1]:''
                });
            });
        }
    
        render(){
            return (
                <View>
                    <NavigationBar
                        title={'登录'}
                        statusBar={{backgroundColor:'blue'}}
                    />
                    <View style={styles.row}>
    
                        <View style={styles.head}>
                            <Text style={styles.label}>用户名</Text>
                        </View>
    
                        <View style={styles.flex}>
                            <TextInput
                                style={styles.input}
                                value = {this.state.username}
                                onChangeText={(username)=>this.setState({username})}
                            />
                        </View>
    
                    </View>
    
    
                    <View style={styles.row}>
    
                        <View style={styles.head}>
                            <Text style={styles.label}>密码</Text>
                        </View>
    
                        <View style={styles.flex}>
                            <TextInput
                                style={styles.input}
                                value={this.state.password}
                                onChangeText={(password)=>this.setState({password})}
                            />
                        </View>
    
                    </View>
    
    
                    <View style={styles.row}>
                            <Text style={styles.btn} onPress={this.doLogin.bind(this)}>登录</Text>
                            <Text style={styles.btn} onPress={this.clear.bind(this)}>清除</Text>
                    </View>
    
                </View>
            );
        }
    
    
        doLogin(){
    
           let info = [['username', this.state.username], ['password', this.state.password]]
    
            AsyncStorage.multiSet(info, (errs)=>{
                if (errs) {
                    alert('登录失败');
                    return;
                }
    
                alert('登录成功');
            });
        }
    
        clear(){
            AsyncStorage.clear((errs)=>{
               if (!errs){
                   this.setState({
                       username:'',
                       password:''
                   });
    
                   alert('存储的数据已清除完毕!');
               }
            });
        }
    
    
    
    
    }
    
    const styles = StyleSheet.create({
    
        flex:{
            flex:1,
        },
    
        topStatus:{
            marginTop:25,
        },
    
        row:{
            flexDirection:'row',
            height:55,
            paddingTop:10
        },
    
        head:{
            width:80,
            marginLeft:5,
            backgroundColor:'#23BEFF',
            height:45,
            justifyContent:'center',
            alignItems: 'center'
        },
    
        label:{
            color:'#fff',
            fontSize:15,
            fontWeight:'bold'
        },
    
        input:{
            height:45,
            borderWidth:1,
            marginRight: 5,
            paddingLeft: 10,
            borderColor: '#ccc'
        },
    
        btn:{
            flex:1,
            backgroundColor:'#FF7200',
            height:45,
            textAlign:'center',
            color:'#fff',
            marginLeft:5,
            marginRight:5,
            lineHeight:45,
            fontSize:15,
        },
    
    });
    
    

    *注 第三方封装
    react-native-storage

    相关文章

      网友评论

        本文标题:RN-AsyncStorage

        本文链接:https://www.haomeiwen.com/subject/uytnhxtx.html