在本地将 Firebase 数据存储为 JSON

Posted

技术标签:

【中文标题】在本地将 Firebase 数据存储为 JSON【英文标题】:Store Firebase Data as JSON locally 【发布时间】:2018-11-26 13:18:27 【问题描述】:

我想使用 JSON 作为我的 firebase 数据的本地数据库,我不想要离线数据存储。我正在使用 path_provider 将我的数据存储在手机上

所以我尝试用

存储数据
file.writeAsStringSync(json.encode(snapshot.toString()))

而且存储的数据文件看起来像一个 JSON 文件

"-key:name:name,age:age,-key:name:name,age:age"

“ ”丢失了,我无法解码。 那么这里可以做什么呢? (编辑:Firestore 是否提供任何可以帮助我解决此问题的方法?)

【问题讨论】:

你试过自己操作字符串吗? @creativecreatorormaybenot 我尝试重建 JSON 并存储它,但我认为我没有正确实现,它在每个键和值之后添加了“/”。我似乎无法让 JSON 工作 【参考方案1】:

创建一个 JSON 文件

 Future<String> get _localPath async 
    final directory = await getExternalStorageDirectory();
    return directory.path;
  


  Future<File> get _dbFile async 
    final path = await _localPath;
    return new File("$path/demo.json");
  

将数据写入文件

  Future<File> write(DataSnapshot snapshot,String chatId) async 
    final path = await _dbFile;
    final String key = snapshot.key;
    final String name = snapshot.value['senderUid'];
    final int age= snapshot.value['receivedUid'];
    String content = '"$key":"name":"$name","age":"$age"';
    return file.writeAsStringSync(content);
  

读取数据

  Future<Null> read() async 
    try 
      final file = await _dbFile;
      String content = file.readAsStringSync();
      Map<String, dynamic> chatMap=json.decode(content);
      chatMap.keys.forEach((E)debugPrint(E););
     catch (e) 
      debugPrint('Error : '+e.toString());
    
  

【讨论】:

【参考方案2】:

您可以使用shared_preferences 包来存储JSON, 或者,如果您想写入自定义文件,请使用 path_provider 包来获取您的应用有权写入的目录的路径。

您可能还需要使用 dart:io API 的异步版本来访问 Flutter 中的文件(不确定是否很难)

"-key:name:name,age:age,-key:name:name,age:age" 不是有效的 JSON

任意使用

import 'dart:convert';
...
var myJson = '-key':'name:name','age:age','-key':'name:name','age:age'";
var myJsonString = jsonEncode(myJson);
await file.writeAsString(myJsonString);

var myJsonString = '"-key":"name:name","age:age","-key":"name:name","age:age"';
await file.writeAsString(myJsonString);

【讨论】:

这就是问题所在,当我 toString() Firebase 的 DataSnapshot 返回时得到的数据不是有效的 JSON。我尝试使用 String content = '"$key":"name:$name","age:$age"' 将 Firebase 数据编码为 JSON;等待文件.writeAsString(内容);那行得通,我还没有尝试过序列化它,但是将文件写入与 firebase 数据库流同步会是一个更容易解决的问题吗? 这已经是一个字符串了。不确定您会将其序列化为什么。我也不明白“将文件写入与 firebase 数据库同步”是什么意思。我不知道这样的功能。 通过序列化我的意思是这个 [链接](flutter.io/json) 并通过同步文件我的意思是,当我使用 onChildAdded 调用 firebase 时,每次发生这种情况时都需要写入文件并且仍然是一个有效的 JSON。现在我开始认为这样存储 JSON 很好。 String content = '...' 正如您在上面的第一条评论中所拥有的那样,它已经被编码。使用 Firebase,您将使用 Map 而不是在我的答案中“使用”下方的代码块中。您从 Firebase 获得的也是一个地图,需要在写入文件之前对其进行编码。 对不起,如果我让你感到困惑,我发布了阅读和写作的答案。我知道我可以创建一个 JSON 字符串并将其存储我想操作地图,以便将其编码为 JSON。

以上是关于在本地将 Firebase 数据存储为 JSON的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中,将获取的 Firebase 数据存储在本地还是全局状态?

要在本地机器中提取为 JSON 的 Big Query 表

将所有从“Firebase 推送通知”接收的消息存储在移动数据库/本地

Firebase 网络将聊天存储为实时数据库中的数组

从 Firebase 实时将数据存储在本地 Room DB 上

如何使用 Flutter 将复杂的 JSON 数据存储到 Firebase 实时数据库中