如何使用 Sqlite.net 在 xamarin.forms 中的 ObservableCollection 中保存 ObservableCollection

How to safe a ObservableCollection within a ObservableCollection in xamarin.forms with Sqlite.net

过去 3 天我试图将 collection 保存在我的数据库中。 我以各种方式尝试过……但没有成功。 我尝试的最后一个是序列化我的 collection 并在每次 collection 更改时将其保存到 byte[]。 在 appstart 上,我试图在我的 collection.

中反序列化它

我只是想展示最重要的东西。

我可以从我的数据库中毫无问题地保存和重新加载这个 class。

[Serializable]
    public class MainElement : INotifyPropertyChanged
    {        
        public event PropertyChangedEventHandler PropertyChanged;
        public static int count = 0;
        [PrimaryKey]
        public int Id { get; set; }
        public string Name { get; set; }

        public byte[] _elements;

        private ObservableCollection<SecondElement> elements;


        [OneToMany]
        public ObservableCollection<SecondElement> Elements 
        {
            get
            {
                return elements;
            }
            set 
            { 
                elements = value;
                this.SerializeElementsFromMainElement();
                //_elements = ExtensionAndDb.SerializeElementsFromMainElement(elements);
                OnPropertyChanged();
            }
        }

        public MainElement()
        {
            Id = count++;
            Elements = new ObservableCollection<SecondElement>();
            this.DeSerializeElementsFromMainElement();
            //Elements = ExtensionAndDb.DeSerializeElementsFromMainElement(_elements);  
        }    

        public void OnPropertyChanged([CallerMemberName] string propertyname = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyname));
        }
        public void DeSerializeElementsFromMainElement()
        {            
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream stream = new MemoryStream(_elements);
            using (stream)
            {
                Elements = bf.Deserialize(stream) as ObservableCollection<SecondElement>;
            }
        }
        public void SerializeElementsFromMainElement()
        {
            BinaryFormatter bf = new BinaryFormatter();
            MemoryStream stream = new MemoryStream();
            using (stream)
            {
                bf.Serialize(stream, Elements);
                _elements = stream.ToArray();
            }
        }
    }

每个 MainElement 都存储在 MainList (ObservableCollection) 中。 一切都很好。

但我无法保存或重新加载 public byte[] _elements; from/to collection。

我知道我的代码不好,但如果有人有想法或可以告诉我如何在 Sqlite 中将 public ObservableCollection<SecondElement> Elements 和我的 class 一起保存,我将不胜感激。 我已经尝试了 3 天

如果您需要更多代码,请告诉我。

提前致谢。

根据你的描述,你想对ObservableCollection进行序列化和反序列化,建议你使用Newtonsoft.Json来实现

首先通过 Nuget 包安装 Newtonsoft.Json

比如我做一个esample:

public class person
{
    public string username { get; set; }
    public int age { get; set; }
}

public ObservableCollection<person> persons { get; set; }
private string list;
    public Page13()
    {
        InitializeComponent();
        persons = new ObservableCollection<person>()
        {
            new person(){username="cherry",age=12},
            new person(){username="barry",age=14}
        };

    }

Btn1.clicked是序列化数据,Btn2.clicked是反序列化数据。

 private void Btn1_Clicked(object sender, EventArgs e)
    {
         list = Newtonsoft.Json.JsonConvert.SerializeObject(persons);

    }

    private void Btn2_Clicked(object sender, EventArgs e)
    {
        var myValue = Newtonsoft.Json.JsonConvert.DeserializeObject<ObservableCollection<person>>(list) ;
    }   

如果Observablecollection改变了,你可以通过Id或者其他查询到这个数据,然后更新这个数据。

这里有一篇关于sqlite更新、插入和保存数据的文章,你可以看看:

https://dzone.com/articles/register-and-login-using-sqlite-in-xamarinforms