0

So i have this really annoying problem where i Can't seem to get it to update any of the databases i have created, whats worse the i can see the instance is showing the updated information but isn't applying it. I'm really new to this and is my first course project. This is the code that is being used to update the data: '''

using Project.Database;
using Project.DataClasses;
using Project.Pages.SuperPages;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Essentials;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Project.Pages.UpdateDeleteListItem
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class UpdateDeleteList : ContentPage
    {
        private new readonly Label Title;
        private Style LabelStyle;
        private StoreDetails UpdateStoreDetails;
        private Entry SNum;
        private Entry SName;
        private Entry SMName;
        private Entry Addy;

        public UpdateDeleteList(string pageType, object Item)
        {
            InitializeComponent();
            BindingContext = Item;
            UpdateStoreDetails = (StoreDetails)Item;
            SetLabelStyle();
            string titleMsg = "Update or Delete Selected " + pageType;
            Frame frame = new Frame();
            Label title = new Label() {Text = titleMsg };
            Title = title;
            StackLayout titleStack = new StackLayout() { Children = { Title } };
            frame.Content = titleStack;
            if (pageType == "Store")
            {
                StoreUDLItem(frame);
            }
            if (pageType == "Ticket")
            {
                TicketUDLItem(frame);
            }
            StylePage();
        }
        private void SaveButton_Clicked(object sender, EventArgs args)
        {
            if (StoreCheckValues() == true)
            {
                var store = SName;
                var storeManager = SMName;
                var storeNumber = SNum;
                var address = Addy;
                var storeDataAccess = new StoreDataAccess();
                
                UpdateStoreDetails.StoreName = store.Text;
                UpdateStoreDetails.StoreManger = storeManager.Text;
                UpdateStoreDetails.StoreNumber = storeNumber.Text;
                UpdateStoreDetails.Address = address.Text;
                    //MerchandiserKey = GetMerchId()
                
                storeDataAccess.SaveStoreDetails(UpdateStoreDetails);
                storeDataAccess.SaveAllStoreDetails();
            }

'''

here is the data access methods:

'''

using Project.DataClasses;
using SQLite;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Text;
using Xamarin.Forms;

namespace Project.Database
{
    class StoreDataAccess
    {
        private SQLiteConnection database;
        private static object collisionLock = new object();
        public ObservableCollection<StoreDetails> StoreDetails { get; set; }

        public StoreDataAccess()
        {
            
                database = DependencyService.Get<IDatabaseConnection>().DbConnectionStore();
                database.CreateTable<StoreDetails>();
                this.StoreDetails = new ObservableCollection<StoreDetails>(database.Table<StoreDetails>());
                //AddNewTicket(new Ticket ticket);

        }
        //add ticket method
        public void AddNewStore(StoreDetails item)
        {
            this.StoreDetails.Add(item);
        }

        //retrieve ticket method
        public StoreDetails GetStoreDetails(int id)
        {
            lock (collisionLock)
            {
                return database.Table<StoreDetails>().FirstOrDefault(StoreDetails => StoreDetails.StoreId == id);
            }
        }

        //save ticket
        public int SaveStoreDetails(StoreDetails storeDetailsInstance)
        {
            lock (collisionLock)
            {
                if (storeDetailsInstance.StoreId != 0)
                {
                    database.Update(storeDetailsInstance);
                    return storeDetailsInstance.StoreId;
                }
                else
                {
                    database.Insert(storeDetailsInstance);
                    return storeDetailsInstance.StoreId;
                }
                //database.Commit();
            }
        }
        public void SaveAllStoreDetails()
        {
            lock (collisionLock)
            {
                foreach (var storeDetailsInstance in this.StoreDetails)
                {
                    if (storeDetailsInstance.StoreId != 0)
                    {
                        database.Update(storeDetailsInstance);
                    }
                    else
                    {
                        database.Insert(storeDetailsInstance);
                    }
                }
            }
        }

'''

This is the page that is sending the information to the first code block to bind the data too '''

using Project.Database;
using Project.DataClasses;
using Project.Pages.UpdateDeleteListItem;
using SQLite;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Project.Pages.ListPages
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class StoreList : ContentPage
    {
        private ObservableCollection<StoreDetails> Items { get; set; }
        private readonly StoreDataAccess storeDataAccess;
        private readonly SQLiteConnection database;

        public StoreList()
        {
            InitializeComponent();
            
            storeDataAccess = new StoreDataAccess();
            this.BindingContext = this.storeDataAccess;

            Items = storeDataAccess.StoreDetails;

            StoreView.ItemsSource = Items;
        }

        async void Handle_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            if (e.Item == null) { return; }
            else
            {
                //var id = Items[e.ItemIndex].StoreId;
                await Navigation.PushAsync(new UpdateDeleteList("Store", e.Item));
                //Deselect Item
                ((ListView)sender).SelectedItem = null;
            }    
            
        }
        //page reload handle
        protected override void OnAppearing()
        {
            base.OnAppearing();
            var dbName = "StoreListDatabase.db3";
            var path = Path.Combine(System.Environment.GetFolderPath(Environment.SpecialFolder.Personal), dbName);

            if (database == null)
            {
                new StoreDataAccess();
            }
            using (SQLiteConnection conn = new SQLiteConnection(path))
            {
                Items = storeDataAccess.StoreDetails;
                StoreView.ItemsSource = Items;
            }
        }
    }
}

'''

and lastly here is my databbase model for it:

'''

using System;
using System.Collections.Generic;
using System.Text;
using Xamarin.Forms;
using SQLite;
using System.ComponentModel;

namespace Project.DataClasses
{
    class StoreDetails : INotifyPropertyChanged
    {
        private int _storeId;
        [PrimaryKey, AutoIncrement, NotNull]
        public int StoreId
        {
            get { return _storeId; }
            set { _storeId = value; OnPropertyChanged(nameof(StoreId)); }
        }

        private string _storeName;
        [NotNull, DefaultValue("Enter Store Name")]
        public string StoreName
        {
            get { return _storeName; }
            set { _storeName = value; OnPropertyChanged(nameof(_storeName)); }
        }

        private string _storeManger;
        [NotNull, DefaultValue("Enter Store Managers Name")]
        public string StoreManger
        {
            get { return _storeManger; }
            set { _storeManger = value; OnPropertyChanged(nameof(StoreManger)); }
        }

        private string _storeNumber;
        [NotNull, DefaultValue("Enter Store Number")]
        public string StoreNumber
        {
            get { return _storeNumber; }
            set { _storeNumber = value; OnPropertyChanged(nameof(StoreNumber)); }
        }

        private string _address;
        [NotNull, DefaultValue("Enter Address")]
        public string Address
        {
            get { return _address; }
            set { _address = value; OnPropertyChanged(nameof(Address)); }
        }

        private int _merchandiserKey;
        [NotNull]
        public int MerchandiserKey
        {
            get { return _merchandiserKey; }
            set { _merchandiserKey = value; OnPropertyChanged(nameof(MerchandiserKey)); }
        }


        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged(string propertyName)
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

'''

any help would be greatly appreciated

'''

public int SaveStoreDetails(StoreDetails storeDetailsInstance)
        {
            lock (collisionLock)
            {
                if (storeDetailsInstance.StoreId != 0)
                {
                    database.Update(storeDetailsInstance);
                    return storeDetailsInstance.StoreId;
                }
                else
                {
                    database.Insert(storeDetailsInstance);
                    return storeDetailsInstance.StoreId;
                }
                //database.Commit();
            }
        }

'''

this is the area where it all seems to be going wrong i just don't know why

Thank You Jason, you were correct in that the error was in calling both the savefunctions and overwriting it!!

  • "i can see the instance is showing the updated information but isn't applying it" - I have no idea what this means, and you have posted a HUGE amount of code that is difficult to read through. Are you getting any errors or exceptions? Have you tried a simple test - insert a record in the db, then read it, then update it, then read it again to verify? – Jason Apr 26 '21 at 12:01
  • thanks for the reply and sorry this is my first question and i have been able to insert multiple records, read it and delete all of it, i just can't get it to update and again i do apologize about amount of code – Nick Harding Apr 26 '21 at 12:14
  • @Jason i have edited it refer to the last section of code posted as this is what im refering to thanks again in advance – Nick Harding Apr 26 '21 at 12:22
  • why are you calling `SaveAllStoreDetails` after you update a single store? This would appear to overwrite the changes you just made – Jason Apr 26 '21 at 12:29
  • THANK YOU SO MUCH! I have been at this issue for days! I had it in there as i thought it would commit the whole list, i didnt expect that it would overwrite. – Nick Harding Apr 26 '21 at 12:43

0 Answers0