Добавить строку дат в календарь qml - PullRequest
0 голосов
/ 04 октября 2018

ОБНОВЛЕНО ПОСЛЕ РЕГУЛИРОВКИ

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

    property var arrayFromFirebase: []

onFirebaseReady: {
          firebaseDb.getUserValue("dates", {
                                      orderByChild: true
                        }, function(success, key, value) {
                                  if(success) {
                                      console.log(JSON.stringify(value))
                                for( date in value){arrayFromFirebase.push(date.date)}
                                      }
                              })
      }

Image {
       visible: arrayFromFirebase.indexOf(styleData.date.getDate()) > -1
       }

Мой журнал все еще читает arrayFromFirebase в формате:

[{"date":"2018-10-01T21:17:00.926"},{"date":"2018-10-02T12:00:00.000"},{"date":"2018-10-03T12:00:00.000"},{"date":"2018-10-06T12:00:00.000"},{"date":"2018-10-07T12:00:00.000"},{"date":"2018-10-08T12:00:00.000"}]

ОРИГИНАЛЬНЫЙ ВОПРОС

IЕсли у меня есть календарь, в котором мои пользователи сохраняют выбранные даты, которые хранятся в FireBase, мой календарь построен на примере, приведенном в ссылке

Календарь QtQuick

Мои даты пользователей сохраняютсячтобы запустить базу данных, и когда я читаю их, я могу получить их в журнале, используя JSON.stringify,

. При записи сохраненных дат в мою базу данных я использую следующий код:

    property var userData: {      
  "selectedDates": [         
        { },
      ]
}

  AppButton {
      id: saveButton
      text: "Save & Request"
      anchors.right: parent.right
      textColor: "#4e4e4e"
      backgroundColor: "#d1d1d1"
      onClicked: {
        userData.selectedDates.push({ "date": calendar.selectedDate});
        console.log(JSON.stringify(userData));
        firebaseDb.setUserValue("dates", userData.selectedDates)
      }
  }

Затемпри чтении дат я использую следующее:

  FirebaseDatabase {
      config: customConfig
      onFirebaseReady: {
          firebaseDb.getUserValue("dates", {
                                      startAt: {
                                          Key: "1/date",
                                      }
                        }, function(success, key, value) {
                                  if(success) {
                                      console.log(JSON.stringify(value))
                                      }
                              })
      }
  }

Как только это прочитано, журнал отображает даты следующим образом:

[{"date":"2018-10-01T21:17:00.926"},{"date":"2018-10-02T12:00:00.000"},{"date":"2018-10-03T12:00:00.000"},{"date":"2018-10-06T12:00:00.000"},{"date":"2018-10-07T12:00:00.000"},{"date":"2018-10-08T12:00:00.000"}]

Я хочу взять эту строку дат и добавить маркерыв мой календарьчтобы показать, что они забронированы?

Как мне поступить об этом?

Тип FirebaseDatabase задокументирован здесь

КАЛЕНДАРЬ QML-КОД

CalendarQMLCode

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Итак, после отпуска в разработке у меня есть рабочее решение!Так что смотрите ниже (исключая весь лишний код) и спасибо всем за вашу помощь !!(особенно @Redanium для вашего терпения)

Main.qml:
App {

    property var arrayFromFireBase: []

 onLoggedIn:  {
      firebaseDb.getUserValue("dates/selectedDates", {},
                                    function(success, key, value) {
                                    if(success) {
                                         for(var idx in value)
                                            arrayFromFireBase.push(new Date(value[idx].date).getTime())
                                    })}}

Тогда на моей странице календаря следующее:

CalendarPage.qml:

Page {
AppButton {
          id: saveButton
          text: "Save & Request"
              onClicked: {
                  userData.selectedDates.push({"date": calendar.selectedDate});
                  console.log(JSON.stringify(userData));
                  firebaseDb.setUserValue("dates", userData)
                  }
           }

property var userData: { 
            "selectedDates": [{}]
           }

Image {
       visible: arrayFromFireBase.indexOf(styleData.date.getTime()) > -1
      }
}
0 голосов
/ 05 октября 2018

ОБНОВЛЕНИЕ (после комментария @derM)

Нет необходимости использовать модель sqlite DB

Просто в dayDelegate мы играем с индикатором событияimage visibility

Для этого после получения ваших данных из firebase сохраните их в массив (назовем его arrayFromFireBase) и проверьте, находится ли styleData.date в этом массиве

FirebaseDatabase {
  config: customConfig
  onFirebaseReady: {
      firebaseDb.getUserValue("dates", {
                                  startAt: {
                                      Key: "1/date",
                                  }
                    }, function(success, key, value) {
                              if(success) {
                                  console.log(JSON.stringify(value))
                                  // value here is JSON ARRAY
                                  // value =[{"date":"2018-10-01T21:17:00.926"},{"date":"2018-10-02T12:00:00.000"}]
                                  // so value[0].date ="2018-10-01T21:17:00.926"
                                  //then you gonna insert here your dates in arrayFromFireBase as strings as follow
                                  for(i=0 ; i < arrayFromFireBase.length-1 ; i++) 
                                    arrayFromFireBase.push(new Date(value[i].date).getTime())
                                  }
                          })
  }
}
Calendar {
    ...
    style: CalendarStyle {
        dayDelegate: Item {
            ...
            Image {
                // HERE WE MUST COMPARE TIME (we used Date.getTime()) FROM FIREBASE with the calendar's date converted to time also 
                visible: arrayFromFireBase.indexOf(styleData.date.getTime()) > -1
                ...
                source: "qrc:/images/eventindicator.png"
            }
        }
    }
}

СТАРЫЙ ОТВЕТ


Часть кода была взята из Qt Quick Controls - Пример календаря

Justдобавлено void SqlEventModel::insertDates(QStringList dates)

C ++ деталь

SqlEventModel::SqlEventModel()
{
 createConnection();
}

void SqlEventModel::createConnection()
{
 QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
 db.setDatabaseName(":memory:");
 if (!db.open()) {
     qFatal("Cannot open database");
     return;
 }
}
void SqlEventModel::insertDates(QStringList dates){
 QSqlQuery query;
 // We store the time as seconds because it's easier to query.
 // It depends on what you want as columns for your events
 query.exec("create table Event (name TEXT, startDate DATE, startTime INT, 
  endDate DATE, endTime INT)");
 foreach(QString date in dates){

  // It depends on what you want as columns for your events
  query.exec(QString("insert into Event values('%1', '%2', 
  %3, '%4', %5)").arg(date[0]).arg(date[1]).arg(date[2]).arg(date[3]).arg(date[4]));
 }
 return;
}

QML деталь

SqlEventModel {
 id: eventModel
}

FirebaseDatabase {
  config: customConfig
  onFirebaseReady: {
      firebaseDb.getUserValue("dates", {
                                  startAt: {
                                      Key: "1/date",
                                  }
                    }, function(success, key, value) {
                              if(success) {
                                  console.log(JSON.stringify(value))
                                  //Insert here your dates in sql model
                                  eventModel.insertDates(value)
                                  }
                          })
  }
}
...