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