6
votes

Stockez les données hors ligne et synchronisez-les une fois en ligne à l'aide de React Native et Redux Store

Je travaille sur une application native React qui utilise redux pour la gestion des états. Je souhaite que cette application fonctionne hors ligne et que toutes les données soient conservées.

Une fois que l'application a accès au réseau, toutes les données doivent être synchronisées avec la base de données en ligne à l'aide de l'API REST. Veuillez suggérer les meilleures façons d'aborder ce scénario, car je suis nouveau dans le développement d'applications REACT NATIVE / Mobile.

Aide très appréciée.

J'ai essayé de stocker toutes les données à l'aide de l'API AsyncStorage, mais je trouve qu'il est difficile de gérer toutes les données et je ne parviens pas à comprendre comment synchroniser efficacement avec la base de données en ligne une fois que l'application a accès au réseau.


2 commentaires

softwareengineering.stackexchange.com/questions/366724/...


Vérifiez le lien ci-dessus, j'espère que cela vous aidera


4 Réponses :


0
votes

Le moyen le plus simple de stocker des données hors connexion consiste à utiliser AsyncStorage . Vous pouvez enregistrer json ou sous forme de texte. Comme

AsyncStorage.getItem('saveitems', (err, result) => {
  console.log(JSON.parse(result));
});

Pour obtenir les données, vous pouvez suivre le processus ci-dessous:

AsyncStorage.setItem('saveitems', JSON.stringify([{id: 1, name: 'test', xyz: ''}]));

Si vous souhaitez gérer efficacement la connexion réseau, vous pouvez utiliser

react-native-offline

Cliquez ici pour obtenir des explications

Si vous souhaitez étudier d'autres options de stockage, vous pouvez vérifier le lien ci-dessous.

Cliquez ici p >


0 commentaires

4
votes

Stockage persistant pour redux-store

Pour stocker votre redux-store dans un emplacement persistant, vous pouvez utiliser bibliothèque redux-persist .

État du réseau dans React Native

Pour travailler avec l'état du réseau, vous devez utiliser la classe d'assistance NetInfo de React Native

Pour vérifier l'état du réseau (en ligne / hors ligne) :

NetInfo.addEventListener('connectionChange', ({type}) => {
    switch (type) {
        case 'none':
        case 'unknown':
            // offline statuses, so do nothing
            return
        default:
            // fetch your data here
    }
})

Pour gérer le changement d'état du réseau :

NetInfo.getConnectionInfo().then(({type}) => {
    switch (type) {
        case 'none':
        case 'unknown':
            // offline status
        default:
            // online status
    }
})

1 commentaires

Merci beaucoup @Michael Sivolobov. Je pense que c'est très proche de ce que je recherchais.



2
votes

Si vous souhaitez stocker une grande quantité de données, vous pouvez utiliser package react-native-sqlite-storage en tant que base de données locale.

Cela vous aidera à stocker toutes les données que vous souhaitez enregistrer et lorsque l'utilisateur se connecte au réseau, récupère toutes les données de la base de données et se synchronise avec la base de données en ligne.

Pour l'état du réseau, vous pouvez utiliser la classe NetInfo de react native.


0 commentaires

5
votes

Chaque fois que j'envoie une action à distance, je l'enregistre sur AsyncStorage avec son nom unique préféré.

Le coup de code vérifie la connectivité d'un appareil Android, puis envoie l'action une fois connecté Si nous sommes connectés à Internet, il enverra une action Sinon, il obtiendra les données d'AsyncStorage et les enverra à l'action en tant que deuxième paramètre à stocker en tant qu'état redux.

Composant qui appelle l'action

export default function fetchTasks(token, asyncStorageData) {
  if (asyncStorageData !== null) {
    return function(dispatch) {
      dispatch({
        type: FETCH_TASKS_SUCCESSFUL,
        payload: asyncStorageData
      });
    };
  }
  return function(dispatch) {
    axios
      .get(`${api_endpoint}/your/data`, {
        headers: {
          Token: token
        }
      })
      .then(response => {
        dispatch({ type: FETCH_TASKS_SUCCESSFUL, payload: response.data });
        AsyncStorage.setItem(
          "@Your:Data",
          JSON.stringify(response.data)
        );
      })
      .catch(err => {
        dispatch({ type: FETCH_TASKS_ERROR, payload: err });
      });

  };
}


2 commentaires

Je suis curieux de savoir pourquoi vous obtenez des données directement d'AsyncStorage dans votre composant au lieu de vérifier l'état en ligne et de revenir d'AsyncStorage ou de Fetching dans votre action Redux. Je ne dis pas que c'est la mauvaise façon, je ne comprends tout simplement pas pourquoi vous accédez directement à l'état dans le composant ...


Que voulez-vous dire? pouvez-vous expliquer plus?