Обновить определенный узел и связанные дочерние элементы в базе данных Firebase? - PullRequest
0 голосов
/ 03 июня 2018

Прежде всего, я действительно новичок в Android и, возможно, просто застрял в своей логике ... Я пытаюсь обойти эту проблему уже несколько дней.Я делаю приложение, в котором вы можете отслеживать сигареты, которые вы курили.мое дерево выглядит так:

мое дерево

Когда я добавляю запись, сохраняется время в миллисекундах и разница с последним дочерним элементом.Теперь, когда я добавляю запись, которая находится перед существующей записью (через Date / TimePicker), данные сортируются по time_in_millis правильно, но «diff_in_ms» неверно:

После добавлениязапись между

Это код, как я получаю Данные из предыдущей записи для вычисления diff_in_ms:

final Query lastQuery = drLast.child(db_date);
lastQuery.orderByChild("time_in_millis").limitToLast(1);
lastQuery.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {

    if (dataSnapshot.getValue() != null) {


      for (DataSnapshot LastDataSnap: dataSnapshot.getChildren()) {

        LastEntry getLast = LastDataSnap.getValue(LastEntry.class);

        ltim = getLast.getTime_in_millis();
      }
    } else {

      ltim = calendar.getTimeInMillis();
    }
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {

  }
});

Этот класс, который обрабатывает данные для заполнения ListView:

public class DataHandler {

  //Handles Data before populating the List
  private long time_in_millis, ms, ms1, diff_in_ms;
  private String date, time, diff, db_date;

  public DataHandler() {

  }

  public DataHandler(long time_in_millis, String date, String time, String diff, long diff_in_ms, String db_date) {
    this.time_in_millis = time_in_millis;
    this.date = date;
    this.time = time;
    this.diff = diff;
    this.diff_in_ms = diff_in_ms;
    this.db_date = db_date;


  }

  public long getTime_in_millis() {
    return time_in_millis;
  }

  public String getDate() {

    ms = time_in_millis;
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.");
    date = String.valueOf(dateFormat.format(ms));
    return date;
  }

  public String getTime() {

    ms1 = time_in_millis;
    SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
    time = String.valueOf(timeFormat.format(ms1));
    return time;
  }

  public String getDiff() {

    // I tried to get here the time_in_millis from the last child and calculate it, but the app always got stuck on the device

    if (diff_in_ms != 0) {

      diff = String.format("%02d" + "h " + "%02d" + "m", TimeUnit.MILLISECONDS.toHours(diff_in_ms),
        TimeUnit.MILLISECONDS.toMinutes(diff_in_ms) % TimeUnit.HOURS.toMinutes(1));
    } else {

      diff = "---";
    }
    return diff;
  }

  public long getDiff_in_ms() {
    return diff_in_ms;
  }

  public String getDb_date() {
      return db_date;

Я пытался вычислить разницу при заполнении списка в моем классе модели, но приложение всегда зависало на телефоне.Теперь на мой вопрос: если diff_in_ms <0, тогда я должен обновить узлы "diff_in_ms" всех следующих потомков, потому что он связан с потомком и не обязательно с последним.Как это сделать? </p>

Или лучше рассчитать его при получении данных из БД?

Любая помощь приветствуется ...

РЕДАКТИРОВАТЬ: Сейчас этоработает с запросом в моем классе модели:

public class DataHandler {

  //Handles Data before populating the List
  private long time_in_millis, ms, ms1, ltim, diff_in_ms;
  private String date, time, diff, db_date;

  DatabaseReference drLast = FirebaseDatabase.getInstance().getReference();
  Calendar calendar = Calendar.getInstance();

  public DataHandler() {

  }

  public DataHandler(long time_in_millis, String date, String time, String diff, String db_date) {
    this.time_in_millis = time_in_millis;
    this.date = date;
    this.time = time;
    this.diff = diff;
    this.db_date = db_date;
  }

  public long getTime_in_millis() {
    return time_in_millis;
  }

  public String getDate() {

    ms = time_in_millis;
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.");
    date = String.valueOf(dateFormat.format(ms));
    return date;
  }

  public String getTime() {

    ms1 = time_in_millis;
    SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm");
    time = String.valueOf(timeFormat.format(ms1));
    return time;
  }

  public String getDiff() {

    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    db_date = format.format(calendar.getTime());

    final Query lastQuery = drLast.child(db_date);
    lastQuery.orderByChild("time_in_millis").limitToLast(1);
    lastQuery.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {

        if (dataSnapshot.getValue() != null) {

          for (DataSnapshot LastDataSnap: dataSnapshot.getChildren()) {

            DataToSave getLast = LastDataSnap.getValue(DataToSave.class);

            ltim = getLast.getTime_in_millis();
          }
        } else {

          ltim = calendar.getTimeInMillis();
        }

        //Calculate the difference
        
        diff_in_ms = time_in_millis - ltim;

        if (diff_in_ms != 0) {

          diff = String.format("%02d" + "h " + "%02d" + "m", TimeUnit.MILLISECONDS.toHours(diff_in_ms),
            TimeUnit.MILLISECONDS.toMinutes(diff_in_ms) % TimeUnit.HOURS.toMinutes(1));
        } else {

          diff = "---";
        }
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {}
    });

    return diff;
  }

  public String getDb_date() {
    return db_date;
  }
}

Но он не показывает значений для различия в ListView.

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