Доступ к данным из базы данных Firebase в реальном времени внутри утилита - PullRequest
0 голосов
/ 09 ноября 2018

Мой просмотрщик данных получает данные из json api и заполняет список статей. Теперь я внедрил систему комментирования с помощью базы данных Firebase в реальном времени. Я хочу показать количество комментариев под изображением каждой статьи в обзоре реселлера. Я попробовал несколько способов реализовать это, но все они не очень эффективны.

  1. Сначала я реализовал запрос к базе данных, основанный на уникальном идентификаторе статьи для каждого представления, но, поскольку у recyclerview было более 100 статей, поэтому он делал более 100 обращений к базе данных и вызывал огромную проблему пропускной способности.

  2. Затем я сделал один запрос, чтобы получить счетчик всех комментариев из базы данных, и сохранил их локально в базе данных SQLite и в программе recyclerview. Я запрашиваю базу данных SQLite, чтобы получить количество комментариев, но вставка 100 строк с идентификатором статьи и количеством комментариев в SQLite идет медленно. .

Как вы, ребята, порекомендуете лучший метод для такой задачи, когда я потрачу наименьшее количество трафика и получу также количество комментариев?

Моя структура БД выглядит следующим образом.

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 голосов
/ 09 ноября 2018

Как вы, ребята, порекомендуете лучший метод для такой задачи, когда я потрачу наименьшее количество трафика и получу также количество комментариев?

Обходной путь здесь - сохранить свойство count где-нибудь в базе данных и обновлять его всякий раз, когда вы добавляете / удаляете дочерние узлы.

Так что вы можете рассмотреть возможность использования нового раздела, который может выглядеть примерно так:

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

Таким образом, каждый раз, когда вы добавляете или удаляете сообщение, увеличивайте / уменьшайте это число на единицу. И поскольку количество комментариев может быть обновлено в многопользовательской среде, я рекомендую вам использовать FirebaseTransactions , как объясняется в моем ответе из этого сообщения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...