【问题标题】:AsyncStorage saving array in wrong formatAsyncStorage 以错误的格式保存数组
【发布时间】:2021-11-25 02:02:51
【问题描述】:

我一直在构建一个日记应用程序,我想在 AsyncStorage 中保存这些日子,这很有效,但如果我想添加一个日子,那就太奇怪了,这就是我的功能:
这是回报: [[[{"date":"t","value":"t","name":"t"}],{"date":"p","value":"p","name":"p"}],{"date":"h","value":"h","name":"h"}]

async function createDay(date: string, journal: string, name: string) {
    try {

        try {
            const getalldays = await AsyncStorage.getItem('@journal')
            const alldays = await JSON.parse(getalldays!)

            if (JSON.parse(alldays!) !== null) {
                console.log('SHORT')
                await alldays!.push(JSON.parse(alldays!))
            }

            const newDay = { date: date, value: journal, name: name }
            await alldays.push(newDay)

            await AsyncStorage.setItem('@journal', JSON.stringify(alldays))

            const newall = await AsyncStorage.getItem('@journal')

            console.log(newall)

            return;
        } catch (error) {
            console.log(error)
            return;
        }
    } catch (err) {
        console.error(err)
    }
}

【问题讨论】:

    标签: react-native expo asyncstorage


    【解决方案1】:

    据我了解的问题,您希望以这种格式存储数据

    [
      { date: 'h', value: 'h', name: 'h' },
      { date: 'h', value: 'h', name: 'h' },
      { date: 'h', value: 'h', name: 'h' },
      { date: 'h', value: 'h', name: 'h' },
    ]
    

    我建议您为所有 Storage operations 创建一个帮助文件

    第 1 步:

    在您的App.js 所在的位置创建一个名为storage 的文件夹。现在在storage 文件夹中,创建一个名为AsyncStore.js 的文件,看起来应该是这样的

    AsyncStore.js

    import AsyncStorage from '@react-native-async-storage/async-storage';
    
    const setData = async (token, value) => {
      try {
        await AsyncStorage.setItem(token, JSON.stringify(value));
        return true;
      } catch (e) {
        return false;
      }
    };
    
    const getData = async (token) => {
      try {
        const jsonValue = await AsyncStorage.getItem(token);
        return jsonValue != null ? JSON.parse(jsonValue) : null;
      } catch (e) {
        return null;
      }
    };
    
    const removeData = async (token) => {
      try {
        await AsyncStorage.removeItem(token);
      } catch (e) {
        return null;
      }
    };
    
    export default { setData, getData, removeData };
    

    第 2 步:

    把你的存储函数createDay改成这个

    async function createDay(date, journal, name) {
      try {
        const response = await Storage.getData('@journal'); // Get last data stored
    
        let tempData = []; // Make a new array
    
        if (response) tempData = [...response]; // Copy elements if array is not null
    
        tempData.push({ date: 'h', value: 'h', name: 'h' }); // Push New element to array
    
        await Storage.setData('@journal', tempData); // Set new Array in local Storage
      } catch (err) {
        console.error(err); // Some error while storing data
      }
    }
    

    结果

    我制作了一个示例 Snack here 供您查看工作实现。如果您想检查数据是否存储完好,您可以检查如下所示

    import * as React from 'react';
    import { Text, View, StyleSheet, Button } from 'react-native';
    
    import AsyncStore from './storage/AsyncStore';
    
    export default function App() {
      const [JournalData, SetJournalData] = React.useState([]);
    
      React.useEffect(() => {
        RestoreData(); // Restoring the last data stored here
      }, []);
    
      const RestoreData = async () => {
        try {
          const response = await AsyncStore.getData('@journal');
          if (response) {
            console.log(response);
            SetJournalData(response);
          }
        } catch (e) {
          console.log(e);
        }
      };
    
      async function createDay(date, journal, name) {
        try {
          const response = await AsyncStore.getData('@journal'); // Get last data stored
    
          let tempData = []; // Make a new array
    
          if (response) tempData = [...response]; // Copy elements if array is not null
    
          tempData.push({ date: 'h', value: 'h', name: 'h' }); // Push New element to array
    
          SetJournalData(tempData);
          await AsyncStore.setData('@journal', tempData); // Set new Array in local Storage
        } catch (err) {
          console.error(err); // Some error while storing data
        }
      }
    
      return (
        <View style={styles.container}>
          <Button title="Add Some Data" onPress={createDay} />
          <Text>{`Listing total ${JournalData.length} items`}</Text>
          {JournalData.map((item, index) => (
            <Text
              key={
                index
              }>{`item Number = ${index} date = ${item.date} value = ${item.value} name = ${item.name}`}</Text>
          ))}
        </View>
      );
    }
    
    const styles = StyleSheet.create({
      container: {
        flex: 1,
        justifyContent: 'center',
        backgroundColor: '#ecf0f1',
        padding: 8,
      },
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-04
      • 2016-04-06
      • 2020-09-04
      • 2018-06-02
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      相关资源
      最近更新 更多