В моем приложении 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 });
}
Любая помощь приветствуется.