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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以在用于SQLite的类中使用String列表吗?相关的知识,希望对你有一定的参考价值。

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

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

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

public string[] CoconutWaterBrands { get; set; }

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

答案

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

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

另一答案

与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包使用。

另一答案

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

private string coconutWaterBrands;

[Ignore]
public List<string> CoconutWaterBrands { 
    get
    {
        return JsonConvert.DeserializeObject<List<string>>(coconutWaterBrands);
    } 
    set
    {
        coconutWaterBrands = JsonConvert.SerializeObject(value);
    }
}

以上是关于我可以在用于SQLite的类中使用String列表吗?的主要内容,如果未能解决你的问题,请参考以下文章

Factory Pattern用于实例化Factory类中的类

如何使用 LINQ 在列表中的类中添加两个字段?

如何关联两个不相关的类,以便它们可以在抽象类中用于相同的方法

通过另一个类中的列表输出数据库信息 - Eclipse Android SQLite

我可以在flift的sqlite表中插入双精度或字符串列表吗?

实现一个名为Person的类和它的子类Employee, Manager是Employee的子类,设计一个接口Add用于涨工资,普通