使用 SQLite-net-pcl 无法更新数据

问题描述

所以我遇到了这个非常烦人的问题,我似乎无法让它更新我创建的任何数据库,更糟糕的是我可以看到实例显示更新的信息但没有应用它。我真的很陌生,这是我的第一个课程项目。 这是用于更新数据的代码: '''

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();
            }

'''

这里是数据访问方法

'''

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);
                    }
                }
            }
        }

'''

这是将信息发送到第一个代码块以绑定数据的页面 '''

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;
            }
        }
    }
}

'''

最后这是我的数据库模型:

'''

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));
        }
    }
}

'''

任何帮助将不胜感激

'''

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();
            }
        }

'''

这就是一切似乎都出错的地方,我只是不知道为什么

谢谢你杰森,你是对的,错误在于调用了保存函数并覆盖了它!!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)