Xamarin формирует отношение SQLite - PullRequest
0 голосов
/ 11 июня 2018

Я действительно долго искал, но не могу найти и понять, как это работает.Я собираюсь создать приложение в формах Xamarin и начать с SQLite.Мне нужно иметь уникальные элементы списка для каждого основного элемента в приложении.

Например, у меня есть список с элементами.Когда я выбираю элемент в списке, появляется новая страница и отображаются элементы этого элемента.

Так что, с моей точки зрения, мне нужны две таблицы SQLite с отношениями между ними.

Это главная таблица со всеми профилями

    [Table("Profiles")]
public class ProfileItems
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    public string ProfileName { get; set; }
    public string ProfileRace { get; set; }
    public string iconn = "icon.png";
    public string ProfileIcon { get; set; }
    public DateTime BDay { get; set; }

    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public List<LoggItems> Loggs { get; set; }

}

Это таблица журнала для каждого профиля, которая должна быть уникальной для каждого профиля

    [Table("Loggs")]
public class LoggItems
{
    [PrimaryKey, AutoIncrement]

    public int Id { get; set; }
    public string Title { get; set; }
    public string Text { get; set; }

    [ForeignKey(typeof(ProfileItems))]
    public int ProfileId { get; set; }
}

Добавление элементов, подобных этому

  public class ProfileDatabase
{

    readonly SQLiteAsyncConnection database;

    public ProfileDatabase(string dbPath)
    {
        database = new SQLiteAsyncConnection(dbPath);
        database.CreateTableAsync<ProfileItems>().Wait();
        database.CreateTableAsync<LoggItems>().Wait();
    }


    //Profile
    public Task<List<ProfileItems>> GetProfileAsync()
    {
        return database.Table<ProfileItems>().ToListAsync();
    }

    public Task<ProfileItems> GetProfileAsync(int id)
    {
        return database.Table<ProfileItems>().Where(i => i.Id == id).FirstOrDefaultAsync();
    }

    public Task<int> SaveProfileAsync(ProfileItems profileItems)
    {
        if (profileItems.Id != 0)
        {
            return database.UpdateAsync(profileItems);
        }
        else
        {
            return database.InsertAsync(profileItems);
        }
    }

    public  Task<int> DeleteProfileAsync(ProfileItems profileItems)
    {
        return database.DeleteAsync(profileItems);
    }


    //Logg
    public Task<List<LoggItems>> GetLoggAsync()
    {
        return database.Table<LoggItems>().ToListAsync();
    }

    public Task<LoggItems> GetLoggAsync(int id)
    {
        return database.Table<LoggItems>().Where(i => i.Id == id).FirstOrDefaultAsync();
    }

    public Task<int> SaveLoggAsync(LoggItems loggItems)
    {
        if (loggItems.Id != 0)
        {
            return database.UpdateAsync(loggItems);
        }
        else
        {
            return database.InsertAsync(loggItems);
        }
    }

    public Task<int> DeleteLoggAsync(LoggItems loggItems)
    {
        return database.DeleteAsync(loggItems);
    }
}

И журналы, и списки / таблицы профилей работают, но они не имеют каких-либо связей между ними, поэтому журналы показывают одинаковоево всем профиле.

Пожалуйста, помогите мне, как я должен это сделать.

Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Как насчет использования Linq и вступления в отношения.
1 .- Сначала необходимо добавить пространство имен:

using System.Linq;

2 .- Измените свойство в классе ProfileItems на IEnumerable

 [OneToMany(CascadeOperations = CascadeOperation.All)]
 public virtual IEnumerable<LoggItems> Loggs { get; set; }

3 .- Это метод объединения журналов с элементами профиля.

        var profiles = await GetProfileAsync();
        var loggs = await GetLoggAsync();
        var query = from p in profiles
                    join l in loggs on p.Id equals l.ProfileId into list
                    select new ProfileItems
                    {
                        Id = p.Id,
                        ProfileIcon = p.ProfileIcon,
                        ProfileName = p.ProfileName,
                        ProfileRace = p.ProfileRace,
                        BDay = p.BDay,
                        Loggs = list
                    };
0 голосов
/ 11 июня 2018

Я думаю, вы должны добавить ключевое слово " virtual" для включения отложенной загрузки.

[OneToMany(CascadeOperations = CascadeOperation.All)]
public virtual List<LoggItems> Loggs { get; set; }

И есть " [InverseProperty] " для указания их связанныхсвойство навигации.

public class LoggItems
{
     *
     [ForeignKey(typeof(ProfileItems))]
     [InverseProperty("Loggs")]
     public int ProfileId { get; set; }
     *
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...