SQLite-net 将用于表示表的类中使用的数据类型有哪些限制?具体来说,我可以使用这个:
public List<string> CoconutWaterBrands { get; set; }
...或者我需要这个:
public string[] CoconutWaterBrands { get; set; }
……还是别的什么?
SQLite-net 将用于表示表的类中使用的数据类型有哪些限制?具体来说,我可以使用这个:
public List<string> CoconutWaterBrands { get; set; }
...或者我需要这个:
public string[] CoconutWaterBrands { get; set; }
……还是别的什么?
与 Sandy 的回答类似,在序列化/反序列化列表方面,您可以使用Text blobbed properties
SQLite -Net Extensions library。因此,例如在您的 Model 类中:
public class SomethingToDoWithCoconuts
{
[TextBlob(nameof(CoconutWaterBrandsBlobbed))]
public List<string> CoconutWaterBrands { get; set; }
public string CoconutWaterBrandsBlobbed { get; set; } // serialized CoconutWaterBrands
}
来自Text blobbed properties 的文档:
Text-blobbed 属性在保存时序列化为文本属性,并在加载时反序列化。这允许将简单对象存储在同一表中的单个列中。
Text-blobbed 属性在序列化和反序列化对象方面有少量开销和一些限制,但它是存储简单对象(如基本类型或简单关系的 List 或 Dictionary)的最佳方式。文本块属性需要一个声明的字符串属性,其中存储了序列化的对象。
文本块属性不能与其他对象有关系,也不能与其父对象有反向关系。
如果没有使用 TextBlobOperations.SetTextSerializer 方法指定其他序列化程序,则使用基于 JSON 的序列化程序。要使用 JSON 序列化程序,项目中必须包含对 Newtonsoft Json.Net 库的引用,也可以作为 NuGet 包提供。
ORM(又名抽象泄漏)会有这种问题。类中的字段将对应于表中的列。如果你使用 List 或数组,那么 ORM 要么必须以某种方式将列表中的这些值组合在一个列中,因为它必须选择某种分隔符,如果分隔符出现在你的字符串值中怎么办,最终你会在兔子洞里慢慢找到自己。
我不认为 SQLite-net 支持数组/列表。您将需要使用字符串(并根据需要拆分和连接它)或创建一个新表来表示一对多关系。
要为该问题提供更具体的解决方案,您可以使用 Newtonsoft.Json 序列化为 JSON blob:
IE
private string coconutWaterBrands;
[Ignore]
public List<string> CoconutWaterBrands {
get
{
return JsonConvert.DeserializeObject<List<string>>(coconutWaterBrands);
}
set
{
coconutWaterBrands = JsonConvert.SerializeObject(value);
}
}