如何使用 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
过去 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