【问题标题】:Accessing data from firebase realtime database inside recyclerview从 recyclerview 中的 firebase 实时数据库访问数据
【发布时间】:2019-04-13 00:43:02
【问题描述】:

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

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

    李>
  2. 然后我进行了一次查询以从数据库中获取所有 cmets 计数并将它们本地保存在 SQLite 数据库中,在 recyclerview 中我查询 SQLite 数据库以获取 cmets 计数但在 SQLite 中插入 100 行具有文章 id 和 cmets 计数的速度很慢.

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

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

获取cmets方法

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) {

        }
    });
}

插入 cmets 方法

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) {
    }
}

【问题讨论】:

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


    【解决方案1】:

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

    这里的解决方法是在数据库中的某个位置保留一个计数属性,并在您添加/删除子节点时更新它。

    因此,您可以考虑使用可能类似于以下内容的新部分:

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

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

    【讨论】:

    • 我已经这样做了。我的问题是如何获得这些计数,以便我消耗最少的带宽和数据库连接。
    • 这样。不是通过查询或存储在 SQLite 数据库中,只需在删除或添加子项后递增计数器即可。您将消耗最少的带宽和数据库连接。所以要获取计数器,只需要一个请求。
    • 正是这个问题,当列表有 100 篇文章时,它会查询 firebase 100 次,导致带宽过多。
    • 不,这不是真的。在这种情况下没有查询。您没有查询任何内容,您只需在添加/删除对文章的评论后增加或减少一个数字。如果需要显示 cmets 的数量,则只创建一个数据库调用来读取一个数字,可以是 1210 甚至是 1000。你不查询你的数据库,因为你没有计算任何东西。号码已经在那里了。现在清楚了吗?
    • 我检查了 firebase profiler,每次我调用数据库读取一篇文章的 cmets 计数时,它都会显示一个连接,所以在 100 篇文章的列表中,我得到了 100 个到 firebase 的连接,仅用于阅读和显示每篇文章的评论数。这 100 个连接会导致超过 100 kbs 的额外带宽。
    猜你喜欢
    • 2019-02-16
    • 2020-08-13
    • 1970-01-01
    • 2021-06-14
    • 2021-04-22
    • 2021-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多