Using SQLite-net-pcl and can't update the data

548 views Asked by At

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!!

0

There are 0 answers