react-native 中的本地数据备份

Posted

技术标签:

【中文标题】react-native 中的本地数据备份【英文标题】:local data backup in react-native 【发布时间】:2021-11-19 12:16:33 【问题描述】:

我正在训练 react-native。 我正在尝试弄清楚如何在本地保存数据。

我有一个待办事项列表并选择分配给此任务的人员。

我想保存我添加的任务,以便在我停止和重新启动应用程序时保留它们。我正在考虑使用异步存储,所以我这样做了:

const storeData = async (task) => 尝试 等待 AsyncStorage.setItem('key', 任务) 抓住 (e) // lance une erreur

但它似乎不起作用。

这是我在这个页面上的所有代码。你能帮我让我的代码工作,并向我解释这个函数在这个过程中的行为吗?

谢谢。

import React, useState from 'react';
import  KeyboardAvoidingView, Text, View, TextInput, TouchableOpacity, Keyboard, ScrollView  from 'react-native';
import Task from '../../Task';
import SelectDropdown from 'react-native-select-dropdown'
import styles from "../../../assets/styles"

export default function Trucs() 
  const [task, setTask] = useState();
  const [taskItems, setTaskItems] = useState([]);
  const users = ["Jibé", "Charly"]

  const handleAddTask = () => 
    Keyboard.dismiss();
    setTaskItems([...taskItems, task])
    setTask(null);
  

  const storeData = async (task) => 
    try 
      await AsyncStorage.setItem('key', task)
     catch (e) 
      // lance une erreur
    
  

  const completeTask = (index) => 
    let itemsCopy = [...taskItems];
    itemsCopy.splice(index, 1);
    setTaskItems(itemsCopy)
    storeData(task)
  
  
  return (
    <View style=styles.wrap>
      /* Added this scroll view to enable scrolling when list gets longer than the page */
      <ScrollView
        contentContainerStyle=
          flexGrow: 1
        
        keyboardShouldPersistTaps='handled'
      >
      /* Today's Tasks */
      <View style=styles.tasksWrapper>
        <Text style=styles.sectionTitle>Trucs à faire</Text>
          /* This is where the tasks will go! */
          
            taskItems.map((item, index) => 
              return (
                <TouchableOpacity key=index  onPress=()  => completeTask(index)>
                    <View>
                        <Task text=item/>
                        <SelectDropdown
                          data=users
                          onSelect=(selectedItem, index) => 
                            console.log(selectedItem, index)
                          
                          buttonTextAfterSelection=(selectedItem, index) => 
                            // text represented after item is selected
                            // if data array is an array of objects then return selectedItem.property to render after item is selected
                            return selectedItem
                          
                          rowTextForSelection=(item, index) => 
                            // text represented for each item in dropdown
                            // if data array is an array of objects then return item.property to represent item in dropdown
                            return item
                          />
                    </View>                    
                </TouchableOpacity>
              )
            )
          
      </View>        
      </ScrollView>
      /* Write a task */
      /* Uses a keyboard avoiding view which ensures the keyboard does not cover the items on screen */
      <KeyboardAvoidingView 
       // behavior=Platform.OS === "ios" ? "padding" : "height"
        style=styles.writeTaskWrapper
      >
        <TextInput style=styles.input placeholder='Rajouter un truc à faire' value=task onChangeText=text => setTask(text) />
        <TouchableOpacity onPress=() => handleAddTask()>
          <View style=styles.addWrapper>
            <Text style=styles.addText>+</Text>
          </View>
        </TouchableOpacity>
      </KeyboardAvoidingView>      
    </View>
  );

【问题讨论】:

【参考方案1】:

我觉得您没有正确获取存储在 AsyncStorage 中的数据。看看我的两个函数,用于按键存储和检索数据。

  const storeData = async (key, value) => 
    try 
      await AsyncStorage.setItem(key, value);
     catch (error) 
      console.log(error);
    
  ;

  const getData = async (key) => 
    try 
      const data = await AsyncStorage.getItem(key);
      if (data !== null) 
        console.log(data);
        return data;
      
     catch (error) 
      console.log(error);
    
  ;

然后,您可以在想要获取存储元素的任何地方调用 getData("yourKey")。

【讨论】:

【参考方案2】:

这里有几点:

1- AsyncStorage.setItem() 接受一个键和一个值都是字符串。所以你需要在你的 storeData 方法中做await AsyncStorage.setItem('key', JSON.stringify(task))

2- 您需要在组件安装后读取数据,并使用 useEffect 之类的方法将其放入您的状态中,以便在您重新启动应用程序后显示。例如:

useEffect(() => 
  AsyncStorage.getItem('key').then((res) => 
    setTask(JSON.parse(res));
  )
 , [])

【讨论】:

以上是关于react-native 中的本地数据备份的主要内容,如果未能解决你的问题,请参考以下文章

是否有任何本地 GraphQL 数据库用于 react-native?

react-native 如何从本地JSON文件中获取数据?

如何使用 React-native 访问 Django 本地服务器数据?

本地化 React 和 React-Native 组件,使其尽可能可重用

react-native 中的 navigator.geolocation.getCurrentPosition 是不是与本地地理定位方法一样准确?

如何使用 javascript 将 API 数据转换为 react-native 中的部分列表数据