在本地将 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 数据存储在本地还是全局状态?
将所有从“Firebase 推送通知”接收的消息存储在移动数据库/本地