从RecyclerView内部的Firebase实时数据库访问数据

时间:2018-11-09 12:36:36

标签: android firebase firebase-realtime-database android-recyclerview android-sqlite

我的recyclerview从json api获取数据并填充文章列表。我现在已经在firebase实时数据库的帮助下实现了注释系统。我想在recyclerview的每个文章图片下方显示评论数。我尝试了几种方法来实现这一点,但是它们都不是很有效。

  1. 起初,我基于每个视图的文章唯一ID来实现数据库查询,但是由于recyclerview有100多个文章,因此它对数据库进行了100多次实例调用,并导致了巨大的带宽问题。

  2. 然后,我进行了一次查询,以获取数据库中所有评论的计数,并将其保存在SQLite数据库中以及本地recyclerview中,我查询SQLite数据库以获取评论计数,但是在SQLite中插入带有文章ID和评论计数的100行比较缓慢

对于这种任务我会花费最少的带宽并获得评论计数的人,你们推荐什么最佳方法?

我的数据库结构是这样的。

enter image description here

获取评论方法

public void getComments() {
    keyrf = FirebaseDatabase.getInstance().getReference().child("Keys");
    keyrf.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            HashMap map = new HashMap();
            for( DataSnapshot child : dataSnapshot.getChildren() ) {
                String childKey = child.getKey();
                String c = child.child("c").getValue().toString();

                map.put(childKey, c);
                addComments(MainActivity.this, childKey, c);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

插入评论方法

public static void addComments(Context context, String childKey, String c) {
    try {
        SQLiteDatabase myDB = context.openOrCreateDatabase("MyDb", Context.MODE_PRIVATE, null);

        myDB.execSQL("CREATE TABLE IF NOT EXISTS comments (articleId INTEGER not null unique, comment INTEGER not null)");
        String sql = "REPLACE INTO comments (articleId, comment) VALUES (?, ?)";
        SQLiteStatement statement = myDB.compileStatement(sql);
        statement.bindString(1, childKey);
        statement.bindString(2, c);
        statement.execute();
    } catch (Exception e) {
    }
}

1 个答案:

答案 0 :(得分:1)

  

对于这种任务我会花费最少的带宽并获得评论计数的人,你们推荐什么最佳方法?

这里的解决方法是将count属性保留在数据库中的某个位置,并在添加/删除子节点时对其进行更新。

因此,您可以考虑使用一个看起来与此类似的新部分:

Fireabase-root
   |
   --- numberOfComments
          |
          --- commentId: 12
          |
          --- commentId: 10
          |
          --- commentId: 20

因此,每当您添加或删除帖子时,都将其增加/减少一。而且由于注释的数量可能会在多用户环境中更新,因此我建议您使用FirebaseTransactions,如我在 post 中的回答所解释的。