Можно ли использовать список строк в классе, предназначенном для SQLite?

Какие существуют ограничения на типы данных, используемые в классе, которые будут использоваться SQLite-net для представления таблицы? В частности, могу ли я использовать это:

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

... или мне это нужно:

public string[] CoconutWaterBrands { get; set; }

... или что-то еще?

Ответ 1

ORM (например, утечка абстракции) будет иметь такую ​​проблему. Поля в классе будут соответствовать столбцам в таблице. Если вы используете List или массивы, ORM либо должен каким-то образом объединить эти значения в списке в одном столбце, так как ему придется выбрать какой-то разделитель, и что, если разделитель появится внутри вашего строкового значения, в конечном счете вы будете медленно находите себя в кроличьей дыре.

Я не думаю, что массивы поддержки/списка SQLite-net. Вам нужно будет использовать строку (и разделить и присоединить ее по мере необходимости) или создать новую таблицу для представления отношений "один ко многим".

Ответ 2

Подобно Sandy Answer, с точки зрения сериализации/десериализации списка, вы можете использовать Text blobbed properties из библиотеки расширений SQLite-Net, Так, например, в вашем классе Model:

public class SomethingToDoWithCoconuts
{
    [TextBlob(nameof(CoconutWaterBrandsBlobbed))]
    public List<string> CoconutWaterBrands { get; set; }
    public string CoconutWaterBrandsBlobbed { get; set; } // serialized CoconutWaterBrands
}

из документация по свойствам blobbed Text:

Свойства text-blobbed сериализуются в свойство text при сохранении и десериализации при загрузке. Это позволяет хранить простые объекты в одной таблице в одном столбце.

У свойств с текстом blobbed есть небольшие накладные расходы на сериализацию и десериализацию объектов и некоторые ограничения, но они являются лучшим способом хранения простых объектов, таких как List или Dictionary основных типов или простых отношений. Для свойств с текстом blobbed требуется объявленное свойство строки, в котором хранится сериализованный объект.

Свойства text-blobbed не могут иметь отношения к другим объектам и обратную связь с его родителем.

Сериализатор на основе JSON используется, если никакой другой сериализатор не указан с использованием метода TextBlobOperations.SetTextSerializer. Чтобы использовать сериализатор JSON, в проект должна быть включена ссылка на библиотеку Newtonsoft Json.Net, также доступную как пакет NuGet.

Ответ 3

Чтобы предоставить более конкретное решение вопроса, вы можете использовать Newtonsoft.Json для сериализации в блоке JSON:

т.е.

private string coconutWaterBrands;

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