我可以在用于SQLite的类中使用String列表吗?

问题描述 投票:13回答:3

SQLite-net将用于表示表的类中使用的数据类型有哪些限制?具体来说,我可以使用这个:

public List<string> CoconutWaterBrands { get; set; }

......或者我需要这个:

public string[] CoconutWaterBrands { get; set; }

......还是别的什么?

c# sqlite type-conversion windows-store-apps sqlite-net
3个回答
10
投票

ORM(又名抽象泄漏)会产生这种问题。类中的字段将对应于表中的列。如果你使用List或数组,那么ORM必须以某种方式将列表中的这些值组合在一个列中,因为它必须选择某种分隔符,如果分隔符出现在你的字符串值中,最终你会在兔子洞里慢慢找到你的自我。

我不认为SQLite-net支持数组/列表。您将需要使用字符串(并根据需要拆分并加入它)或创建一个新表来表示一对多关系。


13
投票

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

来自documentation on Text blobbed properties

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

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

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

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


9
投票

要为问题提供更具体的解决方案,可以使用Newtonsoft.Json序列化为JSON blob:

private string coconutWaterBrands;

[Ignore]
public List<string> CoconutWaterBrands { 
    get
    {
        return JsonConvert.DeserializeObject<List<string>>(coconutWaterBrands);
    } 
    set
    {
        coconutWaterBrands = JsonConvert.SerializeObject(value);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.