Преобразование списка <int>в список <object>для связи «один ко многим» с расширениями sqlite- net - PullRequest
0 голосов
/ 08 марта 2020

Я создаю приложение Xamarin. Android и для базы данных использую sqlite- net. Я пытался создать таблицу с такой структурой

public class Templates
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public int Category { get; set; }
    [TextBlob("imagesBlobbed")]
    public List<int> Images { get; set; }
    public string imagesBlobbed { get; set; }
}

, но я хочу, чтобы каждый раз, когда я добавлял шаблон, он проверял, существует ли он, проверяя изображения следующим образом:

public static void AddTemplate(SQLiteConnection db, int category, List<int> images)
{
    var alreadyExist = db.Table<Templates>().Where(record => record.Images == images);

    if (alreadyExist?.Count() == 0)
    {
        var template = new Templates()
        {
            Category = category,
            Images = images,
        };
        db.InsertWithChildren(template, recursive: true);
    }
}

но это не работает, и я предполагаю, что это не работает, потому что вы не можете запросить с параметром «Изображения», в базе данных хранится как большой двоичный объект. Поэтому я предполагаю, что мне нужно преобразовать List во что-то еще, что более легко поддерживается в sqlite.

Я думаю об использовании расширений sqlite- net, которые поддерживают отношения один-ко-многим, и делают что-то вроде этого:

[Table("Templates")]
public class Template
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public int Category { get; set; }
    [OneToMany]
    public TemplateImage Images { get; set; } = new List<int>();
}
[Table("TemplateImages")]
public class TemplateImage
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public int Image1 { get; set; }
    public int Image2 { get; set; }
    public int Image3 { get; set; }
    public int Image4 { get; set; }
    public int Image5 { get; set; }
    [ForeignKey(typeof(Template))]
    public int TemplateId { get; set; }
}

В моем приложении каждый шаблон имеет 5 изображений, но это может измениться в будущем. Каков правильный подход в соответствии с дизайном БД: иметь объект TemplateImage с 5 изображениями или иметь только одно изображение для каждого объекта TemplateImage, например:

[Table("Templates")]
public class Template
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public int Category { get; set; }
    [OneToMany]
    public List<TemplateImage> Images { get; set; } = new List<int>();
}
[Table("TemplateImages")]
public class TemplateImage
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public int Image { get; set; }
    [ForeignKey(typeof(Template))]
    public int TemplateId { get; set; }
}

Является ли второй подход более медленным? Есть ли другой лучший способ для этого?

...