【问题标题】:transform from Firestore API to firebase rtdb api从 Firestore API 转换为 firebase rtdb api
【发布时间】:2022-01-09 14:06:38
【问题描述】:

最近我从教程中学习创建一个事件,但原始事件是在 firestore 中制作的,我正在尝试使用 firebase rtdb,

这里是原始代码:

class FirebaseApi {
  static Future<String> createTodo(Todo todo) async {
    final docTodo = FirebaseFirestore.instance.collection('todo').doc();

    todo.id = docTodo.id;
    await docTodo.set(todo.toJson());

    return docTodo.id;
  }
}

这是我创建的代码,抱歉我的基础知识现在很好,我应该返回什么

class FirebaseApi {

  static Future<String> createTodo(Todo todo) async{

    final todoRefMessages = FirebaseDatabase.instance.ref().child('todo');
    
    final newTodo = FirebaseDatabase.instance.ref().child('todo').get().then((snapshot) async{
      final json = Map<dynamic, dynamic>.from(snapshot.value);

      final newTodo = Todo(
        createdTime: Utils.toDateTime(json['createdTime']),
        title: json['title'],
        description: json['description'],
        id: json['id'],
        isDone: json['isDone'],
      );

      await todoRefMessages.set(newTodo.toJson());
      return newTodo;
    });

    todo.id= newTodo.id;//here got error, The getter 'id' isn't defined for the type 'Future<Todo>

    return newTodo.id;

  }
}

能否请您告诉我如何创建相同的方法,但对于 firebase rtdb,提前致谢!

【问题讨论】:

    标签: flutter firebase-realtime-database google-cloud-firestore


    【解决方案1】:

    对 Firestore 的调用为您提供了对 todo 集合中不存在的新文档的引用:

    final docTodo = FirebaseFirestore.instance.collection('todo').doc();
    

    在实时数据库中相当于这个是:

    final todoRef = FirebaseDatabase.instance.ref("todo").push();
    

    然后将 JSON 存储到 Firestore 中的该文档中:

    await docTodo.set(todo.toJson());
    

    实时数据库中的等价物是:

    await todoRef.set(todo.toJson());
    

    如果您的代码的其他部分有错误,我建议您在 Firestore 和实时数据库实现之间保持 createTodo 方法的功能完全相同。

    例如,我假设Todo todo 对象在实现之间完全相同。如果不是,则问题不太可能出在数据库 API 调用中,而可能出在 Todo 的实现中。

    【讨论】:

    • 亲爱的弗兰克,非常感谢您的帮助,这对我来说仍然很困惑,对于firestore,直接获取id似乎可以(todo.id = docTodo.id),但我不能这样做你的答案是这样的(todo.id = todoRef.id),这是我正在努力的部分,你能否解释一下,这样写(todo.id = todoRef.key)是否正确?谢谢!
    • 我认为这与 Firestore 没有任何关系,因为据我所知,Todo 类是你的。但是由于FirebaseDatabase.instance.ref().child('todo').get().then((snapshot) async{,您似乎在第二个 sn-p 中遇到了范围界定问题。由于第一个 sn-p 不从 Firestore 读取文档,因此第二个 sn-p 也不应该从实时数据库中读取任何内容。这就是为什么我在回答中为您逐行翻译,以便 createTodo 实现可以相同 - 只是 Firebase API 调用不同。
    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 2019-03-17
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    相关资源
    最近更新 更多