Можно ли использовать список строк в классе, предназначенном для 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);
}
}