【问题标题】:Store Firebase Data as JSON locally在本地将 Firebase 数据存储为 JSON
【发布时间】: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 工作

标签: firebase firebase-realtime-database dart flutter


【解决方案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。
    猜你喜欢
    • 2020-05-21
    • 2020-10-22
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 2015-03-22
    • 2014-01-13
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多