我在我的测试社交网络应用程序中使用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
我还有另一个节点"内容",它只包含所有用户帖子的ID.因此,如果"A"跟在"B"之后,那么B的所有帖子ID都添加到A的时间轴.如果B发布了一些内容,那么它也会添加到其所有关注者的时间轴中.
现在这是我的实时数据库解决方案,但它显然存在一些可扩展性问题
这些都是一些问题.
现在,我正在考虑将整个事情转移到firestore上,因为它声称是"可扩展的".那么我应该如何构建我的数据库,以便在firestore中消除我在实时数据库中遇到的问题.
java android database-design firebase google-cloud-firestore
我有一个看起来像这样的查询:
Query first = ref.orderBy("name", Query.Direction.ASCENDING).limit(10);
这是我向我显示数据的方式RecyclerView.
firestoreRecyclerOptions = new FirestoreRecyclerOptions.Builder<ModelClass>().setQuery(query, ModelClass.class).build();
myFirestoreRecyclerAdapter = new MyFirestoreRecyclerAdapter(firestoreRecyclerOptions);
recyclerView.setAdapter(myFirestoreRecyclerAdapter);
我正在尝试使用此处指定的分页,但我无法解决它.
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
    }
});
有没有办法通过组合使用查询游标来分页查询FirestoreRecyclerAdapter?这甚至可能吗?
java android firebase android-recyclerview google-cloud-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);
            ....
        }
要实施firestore docs给出的策略,下一步我该如何做。
// Construct query for first 25 cities, ordered by population
Query first = db.collection("cities")
    .orderBy("population")
    .limit(25); …android infinite-scroll firebase android-recyclerview google-cloud-firestore
我有用户的集合,我想从数据库中查询所有用户,并在显示它们RecyclerView除一人外,雷.这是我的数据库架构:
users [collection]
  - uid [document]
     - uid: "fR5bih7SysccRu2Gu9990TeSSyg2"
     - username: "John"
     - age: 22
  - //other users
如何查询数据库如下:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
Query q = db.collection("users").whereNotEqualTo("uid", uid);
所以我需要将这个查询对象传递给一个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();
了解基于读/写操作的 Firestore 费用。但是我注意到 Firestore 每次应用程序启动都会从服务器读取,如果许多用户非常频繁地打开应用程序,它会导致大量读取。
Q1我可以限制用户首次登录时从服务器读取。之后它只是在每次应用程序启动时读取那些更新文档?
例如,有一个聊天应用程序组。100 个用户 100 条消息 100 个应用程序启动/用户/天
它会变成每天 1,000,000 次读取计数吗?这是荒谬的高。
Q2读取是每个文档的计数,无关紧要的是根集合/子集合,对吗?例如,我从包含 10 个子集合的根集合中读取,每个子集合有 10 个文档,这将导致 100 个读取计数,对吗?
谢谢。
我有按日期排序的旅行数据(大集合)列表。
现有行为
我将所有行程数据存储到SqlLite Db中。对于添加的每个新数据,我通常会收到fcm通知,并且使用上次更新的时间概念仅同步了添加的新数据。这样,当cx打开应用程序时,他将始终从我的数据库中读取数据,从而节省了读取和网络操作。
我如何在Firestore中实现相同目标?
需要考虑的几个问题:
有没有办法在 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
        }
    }
我想在给定的Document ID之后获取排序的问题。我知道我可以使用DocumentSnapShot. 为了第二次或在应用程序恢复后获取,我必须将其保存DocumentSnapshot在首选项中。
可以在文档 ID 之后获取吗?
startAfter - > cDxXGLHlP56xnAp4RmE5
编辑 
我知道我可以使用lastVisible DocumentSnapshot做到这一点。但我必须将lastVisible DocumentSnapshot保存在sharedPreference.
当应用程序首次启动时,从questionCollection中获取 10 个问题。下次必须在这些之后再提取 10 个问题lastVisible。因此,为了获取下一个 10,我必须将 DocumentSnapshot 对象保存在 sharedPreference 中。在看到我的数据库结构后建议我一个更好的方法。
还有一件事 questionID 与文档参考 ID 相同。