相关疑难解决方法(0)

Firestore - 如何构建订阅源并遵循系统

我在我的测试社交网络应用程序中使用Firebase实时数据库,您可以在其中关注并接收您关注的人员的帖子.传统的社交网络.我将我的数据库构造成这样的东西 -

Users
--USER_ID_1
----name
----email
--USER_ID_2
----name
----email

Posts
--POST_ID_1
----image
----userid
----date
--POST_ID_2
----image
----userid
----date

Timeline
--User_ID_1
----POST_ID_2
------date
----POST_ID_1
------date
Run Code Online (Sandbox Code Playgroud)

我还有另一个节点"内容",它只包含所有用户帖子的ID.因此,如果"A"跟在"B"之后,那么B的所有帖子ID都添加到A的时间轴.如果B发布了一些内容,那么它也会添加到其所有关注者的时间轴中.

现在这是我的实时数据库解决方案,但它显然存在一些可扩展性问题

  • 如果有人拥有10,000个关注者,则新帖子被添加到所有10,000个关注者的时间线中.
  • 如果有人拥有大量帖子,那么每个新粉丝都会在他的时间轴中收到所有这些帖子.

这些都是一些问题.

现在,我正在考虑将整个事情转移到firestore上,因为它声称是"可扩展的".那么我应该如何构建我的数据库,以便在firestore中消除我在实时数据库中遇到的问题.

java android database-design firebase google-cloud-firestore

44
推荐指数
5
解决办法
6627
查看次数

有没有办法通过使用FirestoreRecyclerAdapter组合查询游标来分页查询?

我有一个看起来像这样的查询:

Query first = ref.orderBy("name", Query.Direction.ASCENDING).limit(10);
Run Code Online (Sandbox Code Playgroud)

这是我向我显示数据的方式RecyclerView.

firestoreRecyclerOptions = new FirestoreRecyclerOptions.Builder<ModelClass>().setQuery(query, ModelClass.class).build();
myFirestoreRecyclerAdapter = new MyFirestoreRecyclerAdapter(firestoreRecyclerOptions);
recyclerView.setAdapter(myFirestoreRecyclerAdapter);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用此处指定的分页,但我无法解决它.

first.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @Override
    public void onSuccess(QuerySnapshot documentSnapshots) {
        DocumentSnapshot lastVisible = documentSnapshots.getDocuments().get(documentSnapshots.size() - 1);
        Query second = ref.orderBy("name", Query.Direction.ASCENDING).startAfter(lastVisible).limit(10);
        //Create a firestoreRecyclerOptions and setting the adapter
    }
});
Run Code Online (Sandbox Code Playgroud)

有没有办法通过组合使用查询游标来分页查询FirestoreRecyclerAdapter?这甚至可能吗?

java android firebase android-recyclerview google-cloud-firestore

9
推荐指数
1
解决办法
1166
查看次数

使用FirestoreRecyclerAdapter(Android)进行Firestore分页

我在https://firebase.google.com/docs/firestore/query-data/query-cursors上查看了文档

我想与之合作FirestoreRecyclerAdapter

有人有针对该用例的示例工作代码吗?我有一个列表,该列表可能很长。我想设置一个限制,并通过将查询游标与limit()方法结合使用来遵循分页查询的策略。

到目前为止,这是我在ListActivity中拥有的:

     // Construct query for first 25 teachers, ordered by firstName
    firstQuery = FirebaseFirestore.getInstance()
            .collection("School").document(user.getUid())
            .collection("teachers")
            .orderBy("firstName")
            .limit(25);


    FirestoreRecyclerOptions<Teacher> options = new FirestoreRecyclerOptions.Builder<Teacher>()
            .setQuery(firstQuery, Teacher.class)
            .build();

    adapter = new FirestoreRecyclerAdapter<Teacher, TeacherHolder>(options) {
        @Override
        public void onBindViewHolder(final TeacherHolder holder, final int position, Teacher teacherItem) {
            // Bind the Teacher object to the TeacherHolder
            //progressBar.setVisibility(View.GONE);
            ....



        }
Run Code Online (Sandbox Code Playgroud)

要实施firestore docs给出的策略,下一步我该如何做。

// Construct query for first 25 cities, ordered by population
Query first = db.collection("cities")
    .orderBy("population")
    .limit(25); …
Run Code Online (Sandbox Code Playgroud)

android infinite-scroll firebase android-recyclerview google-cloud-firestore

6
推荐指数
1
解决办法
1375
查看次数

如何从Firestore查询中排除元素?

我有用户的集合,我想从数据库中查询所有用户,并在显示它们RecyclerView除一人外,.这是我的数据库架构:

users [collection]
  - uid [document]
     - uid: "fR5bih7SysccRu2Gu9990TeSSyg2"
     - username: "John"
     - age: 22
  - //other users
Run Code Online (Sandbox Code Playgroud)

如何查询数据库如下:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Query q = db.collection("users").whereNotEqualTo("uid", uid);
Run Code Online (Sandbox Code Playgroud)

所以我需要将这个查询对象传递给一个FirestoreRecyclerOptions对象,以便显示所有其他用户RecyclerView.

这甚至可能吗?如果没有,我该如何解决?谢谢!

编辑:

options = new FirestoreRecyclerOptions.Builder<UserModel>()
        .setQuery(query, new SnapshotParser<UserModel>() {
            @NonNull
            @Override
            public UserModel parseSnapshot(@NonNull DocumentSnapshot snapshot) {
                UserModel userModel = documentSnapshot.toObject(UserModel.class);
                if (!userModel.getUid().equals(uid)) {
                    return userModel;
                } else {
                    return new UserModel();
                }
            }
        }).build();
Run Code Online (Sandbox Code Playgroud)

java android kotlin firebase google-cloud-firestore

6
推荐指数
3
解决办法
3723
查看次数

如何优化每次应用启动时的 Firestore 读取

了解基于读/写操作的 Firestore 费用。但是我注意到 Firestore 每次应用程序启动都会从服务器读取,如果许多用户非常频繁地打开应用程序,它会导致大量读取。

Q1我可以限制用户首次登录时从服务器读取。之后它只是在每次应用程序启动时读取那些更新文档?

例如,有一个聊天应用程序组。100 个用户 100 条消息 100 个应用程序启动/用户/天

它会变成每天 1,000,000 次读取计数吗?这是荒谬的高。

Q2读取是每个文档的计数,无关紧要的是根集合/子集合,对吗?例如,我从包含 10 个子集合的根集合中读取,每个子集合有 10 个文档,这将导致 100 个读取计数,对吗?

谢谢。

firebase google-cloud-functions google-cloud-firestore

5
推荐指数
1
解决办法
1838
查看次数

如何避免使用缓存进行不必要的Firestore读取

我有按日期排序的旅行数据(大集合)列表。

现有行为

我将所有行程数据存储到SqlLite Db中。对于添加的每个新数据,我通常会收到fcm通知,并且使用上次更新的时间概念仅同步了添加的新数据。这样,当cx打开应用程序时,他将始终从我的数据库中读取数据,从而节省了读取网络操作。

我如何在Firestore中实现相同目标?

需要考虑的几个问题:

  • Firestore get()始终尝试首先从服务器获取数据,即使我将CACHE添加到查询中,我如何也只能同步已更新的文档
  • 在我的Recyler视图中,我希望按字段日期而不是lut(last-modified-time)对数据进行排序
  • 使用FireStore Snapshot Listener,我无法查询这么大的记录集。

java android firebase firebaseui google-cloud-firestore

3
推荐指数
2
解决办法
3600
查看次数

获取集合 startAfter documentID

有没有办法在 documentID 之后获取文档,例如

private fun fetchCollectoionnAfterDocumentID(limit :Long){

        val db = FirebaseFirestore.getInstance()
        var query:Query = db.collection("questionCollection")
            .startAfter("cDxXGLHlP56xnAp4RmE5") //
            .orderBy("questionID", Query.Direction.DESCENDING)
        .limit(limit)

        query.get().addOnSuccessListener {
            var questions = it.toObjects(QuestionBO::class.java)
            questions.size
        }
    }
Run Code Online (Sandbox Code Playgroud)

我想在给定的Document ID之后获取排序的问题。我知道我可以使用DocumentSnapShot. 为了第二次或在应用程序恢复后获取,我必须将其保存DocumentSnapshot在首选项中。

可以在文档 ID 之后获取吗?

startAfter - > cDxXGLHlP56xnAp4RmE5

编辑 我知道我可以使用lastVisible DocumentSnapshot做到这一点。但我必须将lastVisible DocumentSnapshot保存在sharedPreference.

当应用程序首次启动时,从questionCollection中获取 10 个问题。下次必须在这些之后再提取 10 个问题lastVisible。因此,为了获取下一个 10,我必须将 DocumentSnapshot 对象保存在 sharedPreference 中。在看到我的数据库结构后建议我一个更好的方法。

还有一件事 questionID 与文档参考 ID 相同。

在此处输入图片说明

kotlin firebase google-cloud-firestore

2
推荐指数
2
解决办法
1340
查看次数