Xamarin Forms - 使用SQLite和SQLite Extensions实现外键

时间:2017-10-04 08:49:00

标签: sqlite xamarin.forms

我是Xamarin表单的新手,我现在想要将用户输入的数据保存到Sqlite数据库。值得庆幸的是,有很多例子可以让你开始,但这就是帮助...我试图在两个实体之间实现关系'Session''HandHistory'

会话可以有多个HandHistories - 我立即看到这里需要某种外键来将这些表/实体链接在一起。我阅读了多篇文章和堆栈溢出问题,标准的'sqlite-net-pcl'(由Frank A.Krueger)包提供了外键方面的任何内容,并且为了获得我需要使用SQLiteNetExtensions库所需的功能。我在这篇文章中提到了帮助:

https://bitbucket.org/twincoders/sqlite-net-extensions/overview

我的实体看起来像这样:

会话:

using SQLite;
using SQLiteNetExtensions.Attributes;

namespace PokerSession.Models
{
[Table("Session")]
[AddINotifyPropertyChangedInterface]
public class Session
{
    public Session(bool newSession)
    {
        if (newSession)
        {
            CurrentlyActive = true;
            //HandHistories = new ObservableCollection<HandHistory>();
        }
    }

    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    public SessionType SessionType { get; set; } = SessionType.Tournament;

    public string Location { get; set; }

    public DateTime Date { get; set; } = DateTime.Now;

    public string GeneralNotes { get; set; }

    public int MoneyIn { get; set; }

    public int MoneyOut { get; set; }

    public int ProfitLoss
    {
        get
        {
            var p = MoneyOut - MoneyIn;
            if (p < 0)
                return 0;
            return p;
        }
    }


    /// <summary>
    /// If the session has not been completed, set this to true
    /// </summary>
    public bool CurrentlyActive { get; set; }   


    [OneToMany(CascadeOperations = CascadeOperation.All)]
    public ObservableCollection<HandHistory> HandHistories { get; set; }    
}

}

HandHistory:

using SQLite;
using SQLiteNetExtensions.Attributes;

namespace PokerSession.HandHistories
{
[Table("HandHistory")]
[AddINotifyPropertyChangedInterface]
public class HandHistory
{
    public HandHistory()
    {

    }

    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    [ForeignKey(typeof(Session))]
    public int SessionId { get; set; }

    [ManyToOne]
    public Session Session { get; set; }
}

}

我还关注本文,了解用于获取本地db的SQLiteConnection的平台特定实现:

https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/databases/

我收到的错误:

  

'SQLiteConnection'不包含'UpdateWithChildren'的定义,最好的扩展方法重载'WriteOperations.UpdateWithChildren(SQLiteConnection,object)'需要一个类型为'SQLiteConnection'的接收者PokerSession.Android,PokerSession.iOS C:\ Poker Notes Live \ PokerSession \ PokerSession \ PokerSession \ Services \ DataService.cs 46 Active

        private SQLiteConnection _database;

    public DataService()
    {
        _database = DependencyService.Get<ISqLite>().GetConnection();

        _database.GetTableInfo("HandHistory");
        _database.CreateTable<Session>();
        _database.CreateTable<HandHistory>();


        var session = new Session(false)
        {
            Location = "Test Location",
            Date = new DateTime(2017, 08, 26),
            MoneyIn = 35,
            MoneyOut = 0,
            SessionType = SessionType.Tournament,
            GeneralNotes = "blah blah"
        };
        var hh = new HandHistory();

        _database.Insert(session);
        _database.Insert(hh);

        session.HandHistories = new ObservableCollection<HandHistory> {hh};

        _database.UpdateWithChildren(session);
    }

所以基本上它不允许我将SQLite扩展方法与我的SQLiteConnection对象(_database)一起使用,这是令人困惑的,因为这是Extension方法背后的重点?当然他们可以使用SQLiteConnection对象?我也注意到,通过我的游戏,似乎有两种不同类型的SQLiteConnection ......我目前使用的是SQLite命名空间,另一种是SQLite.Net命名空间。我检查了SQLite.Net命名空间中的那个,它看起来好像是扩展方法,但它要求我更改我的平台特定实现以获取SQLiteConnection,但它会在运行时失败(抱怨我的Session实体没有PK ??)。

我知道相当冗长的问题,但提供更多信息比提供更多信息更好,我确信其他人一定会遇到类似问题,所以请评论并提供任何可能的帮助,谢谢。

0 个答案:

没有答案