我的recyclerview从json api获取数据并填充文章列表。我现在已经在firebase实时数据库的帮助下实现了注释系统。我想在recyclerview的每个文章图片下方显示评论数。我尝试了几种方法来实现这一点,但是它们都不是很有效。
起初,我基于每个视图的文章唯一ID来实现数据库查询,但是由于recyclerview有100多个文章,因此它对数据库进行了100多次实例调用,并导致了巨大的带宽问题。
然后,我进行了一次查询,以获取数据库中所有评论的计数,并将其保存在SQLite数据库中以及本地recyclerview中,我查询SQLite数据库以获取评论计数,但是在SQLite中插入带有文章ID和评论计数的100行比较缓慢
对于这种任务我会花费最少的带宽并获得评论计数的人,你们推荐什么最佳方法?
我的数据库结构是这样的。
获取评论方法
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) {
}
}
答案 0 :(得分:1)
对于这种任务我会花费最少的带宽并获得评论计数的人,你们推荐什么最佳方法?
这里的解决方法是将count属性保留在数据库中的某个位置,并在添加/删除子节点时对其进行更新。
因此,您可以考虑使用一个看起来与此类似的新部分:
Fireabase-root
|
--- numberOfComments
|
--- commentId: 12
|
--- commentId: 10
|
--- commentId: 20
因此,每当您添加或删除帖子时,都将其增加/减少一。而且由于注释的数量可能会在多用户环境中更新,因此我建议您使用FirebaseTransactions,如我在 post 中的回答所解释的。