SQLite-Net 扩展 - GetAllWithChildrenAsync 不拉动一切

问题描述

我正在尝试使用 sqlite-Net 扩展来创建关系数据库。尝试从数据库提取 Term 对象时遇到问题。它成功地关闭了其关联的课程,但不是与课程相关的评估和笔记。我不确定问题是否出在我如何将对象插入数据库、如何从数据库提取对象或我如何列出对象属性

我觉得 sqlite-Net 扩展文档非常有限,所以我什至不确定发生了什么。我尝试了很多不同的方法包括添加 CascadeOperations,但这些方法似乎都没有帮助。

这是我的对象的(简化)代码

[Table("Terms")]
public class Term
{
    [PrimaryKey,AutoIncrement]
    public int ID { get; set; }
    public string Name { get; set; }
    [OnetoMany]
    public List<Course> Courses { get; set; }

    public Term() { }
    public Term(string name,List<Course> courses)
    {
        Name = name;
        Courses = courses;
    }

课程

[Table("Courses")]
public class Course
{
    [PrimaryKey,AutoIncrement]
    public int ID { get; set; }
    [ForeignKey(typeof(Term))]
    public int TermID { get; set; }
    public string Name { get; set; }
    [OnetoMany]
    public List<Assessment> Assessments { get; set; }
    [OnetoMany]
    public List<Note> Notes { get; set; }

    public Course() { }

    public Course(string name,List<Assessment> assessments,List<Note> notes)
    {
        Name = name;
        Assessments = assessments;
        Notes = notes;
    }
}

评估

[Table("Assessments")]
public class Assessment
{
    [PrimaryKey,AutoIncrement]
    public int ID { get; set; }
    [ForeignKey(typeof(Course))]
    public int CourseID { get; set; }
    public string Name { get; set; }

    public Assessment() { }
    public Assessment(string name)
    {
        Name = name;
    }
}

注意事项

[Table("Notes")]
public class Note
{
    [PrimaryKey,AutoIncrement]
    public int ID { get; set; }
    [ForeignKey(typeof(Course))]
    public int CourseID { get; set; }
    public string Name { get; set; }
    public string Text { get; set; }

    public Note() { }
    public Note(string name,string note)
    {
        Name = name;
        Text = note;
    }
}

这里是插入和获取对象的代码: 插入

public bool SaveTermAsync(Term term)
    {
        if (term.ID != 0)
        {
            _database.UpdateWithChildrenAsync(term);
            return true;
        }
        else
        {
            foreach (var course in term.Courses)
            {
                foreach (var assessment in course.Assessments)
                {
                    _database.InsertAsync(assessment);
                }
                foreach (var note in course.Notes)
                {
                    _database.InsertAsync(note);
                }
                _database.InsertAsync(course);
            }
            _database.InsertAsync(term);
            _database.UpdateWithChildrenAsync(term);
            return false;
        }
    }

获取

public Task<List<Term>> GetTermsAsync()
    {
        return _database.GetAllWithChildrenAsync<Term>();
    }

我知道这有点像代码转储,但我不知道哪里或出了什么问题。如果有人可以提供有关可能出现问题的任何信息,那就太棒了。也许我只是期待一些事情发生,但实际上并非如此。我不知道。

另外,如果有人有任何比 https://bitbucket.org/twincoders/sqlite-net-extensions/src/master/ 更好的文档的链接,那就太棒了

编辑

我也尝试使用级联选项、CascadeRead、CascadeInsert 和 CascadeAll。将 CascadeInsert 或 CascadeAll 与 _database.InsertWithChildrenAsync(term,true) 一起使用会导致崩溃。崩溃没有提供任何错误消息,甚至用 try catch 块包装 InsertWithChildren 也不起作用。删除递归 bool 导致程序不会崩溃,并且实际上最接近我正在寻找的内容。评估和注释不再为空,但仍为空。这是我更新的代码

保存和获取

public async Task<List<Term>> GetTermsAsync()
    {
        return await _database.GetAllWithChildrenAsync<Term>(recursive: true);
    }

public async void SaveTermAsync(Term term)
    {
        if (term.ID != 0)
        {
            await _database.UpdateWithChildrenAsync(term);
        }
        else
        {
            //Trying this with recursion results in crash
            await _database.InsertWithChildrenAsync(term);
        }
    }

一对多关系:

//In Term
[OnetoMany(CascadeOperations = CascadeOperation.All)]
public List<Course> Courses { get; set; }

//In Courses
[OnetoMany(CascadeOperations = CascadeOperation.All)]
public List<Assessment> Assessments { get; set; }
[OnetoMany(CascadeOperations = CascadeOperation.All)]
public List<Note> Notes { get; set; }

另外,上次我忘了包括我是如何填充表格的。

public bool CreateTables()
    {
        _database.CreateTableAsync<Term>().Wait();
        _database.CreateTableAsync<Course>().Wait();
        _database.CreateTableAsync<Assessment>().Wait();
        _database.CreateTableAsync<Note>().Wait();
        return true;
    }

    public Task<int> ClearTablestest()
    {
        _database.DropTableAsync<Term>();
        _database.DropTableAsync<Course>();
        _database.DropTableAsync<Assessment>();
        return _database.DropTableAsync<Note>();
    }

async public Task<int> PopulateTestData()
    {
        await ClearTablestest();
        CreateTables();

        Term term = new Term("Test Term",true,DateTime.Now,DateTime.Now.AddDays(10),new List<Course>
            {
                new Course("Test Course",CourseStatus.Completed,"Guys Name","(999)-999-9999","email@gmail.com",6,new List<Assessment>
                {
                    new Assessment("Test Assessment",AssessmentType.Objective,false,DateTime.Now.AddDays(10))
                },new List<Note>
                {
                    new Note("Test Note","This is a test note.")
                })
            });
        App.Database.SaveTermAsync(term);
        return 0;
    }

解决方法

我终于弄清楚是什么导致了崩溃以及在 SQLite-Net 扩展中引起了普遍的混乱。

在我的评估课上,财产

public string BackgroundColor
    {
        get { return IsComplete ? "#558f45" : "Gray"; }
        set { BackgroundColor = value; }
    }

使用递归时导致崩溃。我已经在网上搜索了两个多星期以寻找解决此问题的方法,但没有找到与此类似的任何内容。我提交了关于 SQLite-Net Extensions bitbucket 的错误报告。

如果有人知道为什么这条特定线路会导致问题,我很想听听您的意见。在此之前,我会将这个问题标记为已回答并继续处理我的应用。

感谢 @redent84 迄今为止在此问题上的帮助。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...