如何在SQLite.net中存储对象列表?

13

假设我有这两个对象:

class Customer {
   [PrimaryKey]
   public string id;
   [??????]
   public List<int> addresses;
}

class Address {
     [PrimaryKey, AutoIncrement]
     public int id;
     public string street;
     public int number;
}

有没有办法使用SQLite.NET ORM保存Customers对象?因为我在保存列表方面遇到了很大的困难。

如果没有这样的方法,是否有某种事件可以实现或者我可以覆盖某个方法,以便在加载对象时代码将被触发?

我想到的是,在地址列表上方添加[Ignore],当事件触发时,我可以使用SQLite.net从另一个表中加载地址的ID。

感谢您提供的任何帮助。


2
我不相信SQLite.NET本身支持这种操作。您必须手动查询数据库,基于两个模型的ID填充列表。但是,我使用了[SQLite扩展](https://bitbucket.org/twincoders/sqlite-net-extensions)库,可以实现您想要的功能。在一个WPF项目中,我使用该库取得了巨大的成功......我不知道在Xamarin中它会有多好的效果,但我认为值得一试。 - Mage Xy
1
我在使用Xamarin时,这个库非常好用,真的很棒! - Iain Smith
1个回答

17

看看这个答案在这里

你可以使用SQLite-Net Extensions库中的文本Blob属性。

因此,例如,在您的模型类中:

public class Customer 
{
   [PrimaryKey]
   public string id;
   [TextBlob("addressesBlobbed")]
   public List<int> addresses { get; set; }
   public string addressesBlobbed { get; set; } // serialized CoconutWaterBrands
}

关于文本 blobbed 属性的文档:

当保存时,文本 blobbed 属性被序列化为文本属性,并在加载时进行反序列化。这允许在同一表中的单个列中存储简单的对象。

文本 blobbed 属性具有序列化和反序列化对象的小开销和一些限制,但是它们是存储基本类型或简单关系的 List 或 Dictionary 等简单对象的最佳方式。文本 blobbed 属性需要一个声明的字符串属性,其中存储序列化的对象。

文本 blobbed 属性不能与其他对象建立关系,也不能与其父对象建立反向关系。

如果未使用 TextBlobOperations.SetTextSerializer 方法指定其他序列化程序,则使用基于 JSON 的序列化程序。要使用 JSON 序列化程序,必须将 Newtonsoft Json.Net 库的引用包含在项目中,也可作为 NuGet 包使用。

希望这可以帮助你。


1
是的,文本 blobbed 的方式不是我最初想到的(最初我的想法是创建一个属性,将所有数字用 | 分隔成字符串,并且设置器将这些数字拆分为列表,但我不喜欢那个想法 :)),但整个 sqlite-net 扩展似乎包含了一对多关系的方法,所以对我来说这似乎是可以工作的,谢谢。 - Cruces
1
是的,它肯定可以处理一对多的关系,请查看上面链接中文档中的股票/估值示例。 - Iain Smith
是的,这就是我正在查看的内容,希望它能与Xamarin一起使用 :) 我会在几分钟内接受你的答案,不能在发布问题后立即这样做。 - Cruces
啊,很酷,不用担心,肯定可以用Xamarin做出两个应用程序。 - Iain Smith
啊,这是我分享的链接,但这可不是开玩笑的... 在将对象存储到SQLite中时,您应该始终保持水分充足。 - Iain Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接