Xamarin.forms извлекает данные firebase по дате - PullRequest
0 голосов
/ 07 мая 2020

В моем приложении xamarin.forms я использую базу данных firebase для хранения информации о пользователях. Я пытаюсь получить данные между определенным диапазоном дат.

Моя модель данных

public class Person
    {
        public string Name { get; set; }
        public int PersonId { get; set; }
        public string Address { get; set; }
        public string PhoneNumber { get; set; }
        public string EmailID { get; set; }
        public string Password { get; set; }
        public bool Status { get; set; }
        public bool IsAdmin { get; set; }
        public List<UserLocationData> userdata { get; set; }
    }

    public partial class UserLocationData
    {
        public string Latitude { get; set; }
        public string Longitude { get; set; }
        public DateTime DateTime { get; set; }
    }

Из моего приложения I я отправлю две даты (дату начала и дату окончания), чтобы я хотел получить данные, которые имеют параметр DateTime внутри этого диапазона. Как написать для этого запрос?

Что я пробовал

В моем вспомогательном классе Firebase,

 public async Task<List<Person>> GetPersonLocation(int personId,DateTime startDate,DateTime endDate)
    {       
        return (await firebase
          .Child("Persons")       
          .OrderBy("DateTime")
          .StartAt(startDate.ToString("yyyy-MM-dd hh:mm:ss tt"))
          .EndAt(endDate.ToString("yyyy-MM-dd hh:mm:ss tt"))
          .OnceAsync<Person>()).Select(item => new Person
          {
              Name = item.Object.Name,
              PersonId = item.Object.PersonId,
              PhoneNumber = item.Object.PhoneNumber,
              EmailID = item.Object.EmailID,
              Address = item.Object.Address,
              Password = item.Object.Password,
              IsAdmin = item.Object.IsAdmin,
              Status = item.Object.Status,
              userdata=item.Object.userdata

          }).ToList();

    }

Я получаю такое исключение:

Response: {
  "error" : "Index not defined, add \".indexOn\": \"DateTime\", for path \"/Persons\", to the rules"
}

Это кажется неправильным. Любая помощь приветствуется.

1 Ответ

1 голос
/ 08 мая 2020

Согласно вашему описанию, вы хотите использовать отношение Один ко многим в sqlite и запрашивать данные между двумя данными, я прав?

Если да, я предлагаю вам изменить ваша модель данных, потому что ваши две модели не имеют никаких отношений.

public  class person
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Name { get; set; }

    [OneToMany(CascadeOperations  = CascadeOperation.All)]
    public virtual IEnumerable<UserLocationData> userdata { get; set; }
}

public class UserLocationData
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string Latitude { get; set; }    
    public DateTime DateTime { get; set; }
    [ForeignKey(typeof(person))]
    public int personid { get; set; }
}

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

var persons = await sqliteconn.Table<person>().ToListAsync();
        var locations = await sqliteconn.Table<UserLocationData>().ToListAsync();

        var query = from p in persons
                    join location in locations on p.Id equals location.personid
                    into list1
                    select new person
                    {
                        Id = p.Id,
                        Name = p.Name,
                        userdata = list1.Where(s => s.DateTime >= Convert.ToDateTime("2019-02-01") && s.DateTime <= Convert.ToDateTime("2019-03-01"))
                    };           

        var list = query.ToList();

Есть тот же поток, который вы можете посмотреть:

Xamarin формирует отношение SQLite

Обновление:

Вы можете попробовать получить все данные из Таблица лиц для firebase, затем посмотрите, есть ли какие-то данные в пользовательских данных, если да, теперь вы можете фильтровать данные

...