Xamarin.forms - обновление базы данных Firebase с несколькими значениями (Android) - PullRequest
1 голос
/ 03 мая 2020

В моем приложении xamarin.forms (часть Android) я использую базу данных firebase для хранения некоторых данных. В моей базе данных есть пользовательские данные, которые содержат идентификатор пользователя, адрес электронной почты, широту и долготу. Я могу обновить и получить эти данные.

Моя проблема

Я пытаюсь загрузить широту и долготу пользователей в поля широты и долготы в моей базе данных. В настоящее время я могу обновить поля, которые будут перезаписывать существующие данные. Я хочу вместо того, чтобы перезаписывать каждую запись широты и долготы, она будет сохранена как новая запись. Потому что я хочу перечислить широты и долготы в списке. Поскольку все мои операции обновления и получения происходят в общем коде. Но эта конкретная вставка должна быть в обслуживании. Итак, как вставить каждую широту и долготу в качестве новой записи вместо замены старой?

Моя модель класса

public class Person
    {           
        public int PersonId { get; set; }
        public string EmailID { get; set; }
        public string Latitude{ get; set; }
        public string Longitude{ get; set; }
    }

Обычное обновление данных

  await firebaseHelper.UpdatePerson(Convert.ToInt32(empid),email, latitude, longitude);

Часть помощника Firebase

 public async Task UpdatePerson(int personId,  string emailid, string latitude, string longitude)
        {
            var toUpdatePerson = (await firebase
              .Child("Persons")
              .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();

            await firebase
              .Child("Persons")
              .Child(toUpdatePerson.Key)
              .PutAsync(new Person() { PersonId = personId,EmailID=emailid,Latitude=latitude,Longitude=longitude });
    }

РЕДАКТИРОВАТЬ :

По предложению Лео, я добавил широта и долгота, как список в моем классе модели. Первоначально в своем создании Person я добавил это в FirebaseHelper.cs

 public async Task UpdatePerson(int personId, string name, string address, string phonenumber, string emailid, string password, bool status)
        {
            var toUpdatePerson = (await firebase
              .Child("Persons")
              .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();

            await firebase
              .Child("Persons")
              .Child(toUpdatePerson.Key)
              .PutAsync(new Person() { PersonId = personId, Name = name,Address=address,PhoneNumber=phonenumber,EmailID=emailid,Password=password,Status=status });
        }

Я пытаюсь обновить широту и долготу из сервиса android. Моя служба android выглядит следующим образом.

[Service]
class LocationService : Service
{
    internal static readonly string CHANNEL_ID = "my_notification_channel";
    internal static readonly int NOTIFICATION_ID = 100;
    FirebaseHelperClass firebaseHelper = new FirebaseHelperClass();
    public override IBinder OnBind(Intent intent)
    {
        return null;
    }
    /*
     * This service will run until stopped explicitly because we are returning sticky
     */
    public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
    {
        Toast.MakeText(this, "Location tracking started", ToastLength.Long).Show();
        StartServiceInForeground();
        return StartCommandResult.Sticky;
    }
    /*
     * When our service is to be destroyed, show a Toast message before the destruction.
     */
    public override void OnDestroy()
    {
        base.OnDestroy();
        Toast.MakeText(this, "Location tracking stopped", ToastLength.Long).Show();
    }

      void StartServiceInForeground()
    {

        Device.StartTimer(TimeSpan.FromSeconds(10), () =>
        {

            try
            {               
                 // Here I am calling the Firebase Helper class
                 firebaseHelper.UpdatePersonLocation(2,null,null);
            }

            catch (Exception)
            {

            }

            return true; 
        });


        if (Build.VERSION.SdkInt >= BuildVersionCodes.O)
        {
            var intent = new Intent(this, typeof(MainActivity));

            var channel = new NotificationChannel(CHANNEL_ID, "Pedometer Service Channel", NotificationImportance.High)
            {
                Description = "Foreground Service Channel"
            };

            var notificationManager = (NotificationManager)GetSystemService(NotificationService);
            notificationManager.CreateNotificationChannel(channel);
            var pendingIntent = PendingIntent.GetActivity(this, MainActivity.NOTIFICATION_ID, intent, PendingIntentFlags.Immutable);
            var notification = new Notification.Builder(this, CHANNEL_ID)
            .SetContentTitle("SR Associates")
            .SetContentText("Tracking moode is on")
            .SetContentIntent(pendingIntent)
            .SetSmallIcon(Resource.Drawable.user)                
            .SetOngoing(true)
            .Build();
             StartForeground(NOTIFICATION_ID, notification);
        }


    }

}

Моя часть обновления широты и долготы FirebaseHelper

  public async Task UpdatePersonLocation(int personId, string latitude, string longitude)
        {
            var location = await Geolocation.GetLastKnownLocationAsync();
            var toUpdatePerson = (await firebase
              .Child("Persons")
              .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();

            List<string> latitudes = toUpdatePerson.Object.Latitude;
            List<string> longitudes = toUpdatePerson.Object.Longitude;
            latitudes.Add(location.Latitude.ToString());
            longitudes.Add(location.Longitude.ToString());
            await firebase
              .Child("Persons")
              .Child(toUpdatePerson.Key)
              .PutAsync(new Person() { PersonId = personId, Latitude = latitudes, Longitude = longitudes });
        }

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

Ответы [ 2 ]

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

Вы хотите, чтобы 1 человек имел несколько широты и долготы.

Если да, может быть, вы могли бы определить Latitude и Longitude как List. (Так как нет updateChildren метод, такой как в native firebase для Android lib, вы можете посмотреть здесь )

public class Person
{           
    public int PersonId { get; set; }
    public string EmailID { get; set; }
    public List<string> Latitude{ get; set; }
    public List<string> Longitude{ get; set; }
}

, а затем использовать PutAsync метод FirebaseDatabase.net lib для перезаписи старых данных в узлах Latitude и Latitude.

 public async Task UpdatePerson(int personId, string latitude, string longitude)
    {
        var toUpdatePerson = (await firebase
          .Child("Persons")
          .OnceAsync<Person>()).Where(a => a.Object.PersonId == personId).FirstOrDefault();

        List<string> latitudes= toUpdatePerson.Object.Latitude;
        List<string> longitudes= toUpdatePerson.Object.Longitude;
        latitudes.Add(latitude);
        longitudes.Add(longitude);
        await firebase
          .Child("Persons")
          .Child(toUpdatePerson.Key)
          .PutAsync(new Person() { PersonId = personId, Latitude= latitudes,Longitude = longitudes});
    }

Обновление

добавить персонажа:

public async Task AddPerson(int personId,string emailId, string latitude, string longitude)
    {
        List<string> latitudes = new List<string>();
        List<string> longitudes = new List<string>();
        latitudes.Add(latitude);
        longitudes.Add(longitude);
        await firebase
          .Child("Persons")
          .PostAsync(new Person() { PersonId=personId, EmailID = emailId, Latitude = latitudes,Longitude=longitudes });
    }

эффект в базе данных реального времени как показано ниже:

enter image description here

после того, как я позвоню AddPerson метод:

enter image description here

затем после вызова UpdatePerson метод:

enter image description here

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

То, что вы пытаетесь сделать, - это записать периодические c данные всех ваших пользователей в таблице местоположений.

Таким образом, вы больше не выполняете обновление (вызов asyn c), но хотите каждый раз создавать / вставлять новую строку (вызов Post asyn c). Таким образом, у вас есть исторические данные всех мест, где был пользователь.

Похоже, что вы уже следовали учебному пособию, подобному следующему: https://www.c-sharpcorner.com/article/xamarin-forms-working-with-firebase-realtime-database-crud-operations/, поэтому, если вы перейдете к разделу Вставка, в нем будет подробно описано, как вы добавили новую запись. Теперь нужно просто продолжать добавлять записи

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