如何在 Xamarin Forms 中连接两个表?
How to connect two tables in Xamarin Forms?
这可能是一个愚蠢的问题,但我在 sqlite 中保存时遇到了问题。我已成功使用 XF 的 facebook 登录,但也想将信息保存在 sqlite-net-pcl 中。两个模型是:
public class FacebookProfile
{
public string Name { get; set; }
public string Locale { get; set; }
public string Link { get; set; }
[OneToOne]
[JsonProperty("age_range")]
public AgeRange AgeRange { get; set; }
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
public string Gender { get; set; }
public bool IsVerified { get; set; }
[PrimaryKey]
public int Id { get; set; }
}
public class AgeRange
{
public int Min { get; set; }
}
我已成功将信息下载到我的 FacebookProfile 模型并可以显示它。但是,当我试图将它保存在我的 sqlite 数据库中时,FacebookProfile 的 AgeRange 属性 在数据库中保存为 null 并且它应该具有一定的值。使用sqlite连接保存的代码是:
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<FacebookProfile>();
conn.Insert(fp); //fp is the FacebookProfile model info gotten from Facebook API and until this point, fp has agerange min value
}
此时插入数据库的agerange被保存为null,我不知道为什么或者我可能做错了什么。因此,当我尝试在视图模型中使用以下代码检索它时:
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<FacebookProfile>();
FacebookProfile = conn.Table<FacebookProfile>().FirstOrDefault();
}
从数据库中检索到的 FacebookProfile 的 agerange 值为空,但其他我可以获得正确的信息。可能是什么问题?请帮忙!
Sqlite-Net-pcl 不会识别自定义 poco object,例如:
public AgeRange AgeRange { get; set; }
请记住,Sqlite-net-pcl 基本上只是一个包装器,可以让您省去直接与 Sqlite 库交互的麻烦。所以,不必做这样的事情:
SQLiteCommand insertSQL = new SQLiteCommand("INSERT INTO FacebookProfile (Locale, Link, AgeRange, FirstName, LastNameGender, IsVerified, Id) VALUES (?,?,?,?,?,?,?)", conn);
insertSQL.Parameters.Add(facebookProfile.Locale);
insertSQL.Parameters.Add(facebookProfile.Link);
insertSQL.Parameters.Add(facebookProfile.AgeRange); //Assuming this is an int and not a custom type
insertSQL.Parameters.Add(facebookProfile.FirstName);
insertSQL.Parameters.Add(facebookProfile.LastNameGender);
insertSQL.Parameters.Add(facebookProfile.IsVerified);
insertSQL.Parameters.Add(facebookProfile.Id);
insertSQL.ExecuteNonQuery();
你可以简单地说:
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<FacebookProfile>();
conn.Insert(fp); //fp is the FacebookProfile model info gotten from Facebook API and until this point, fp has agerange min value
}
但是,它不知道如何处理您的 AgeRange
class。那是一个字符串吗?那是一个整数吗?就 Sqlite 而言,它是什么?正如其他人在评论中所说,包装器不知道如何将 class 解释为数据库类型,例如 STRING、NUMERIC 等
一般来说,我在创建 table 结构的精确副本作为中介 class object 和 inserting/updating 那些通过您的 parent class 的 Facebook 个人资料。这在编程模式中称为 Anemic domain model,其中:"Anemic domain model is the use of a software domain model where the domain objects contain little or no business logic (validations, calculations, business rules etc.)."
在你的情况下,它可能看起来像这样:
public class dbFacebookProfile
{
dbFacebookProfile(){}
dbFacebookProfile(FacebookProfile fbProfile)
{
this.Name = fbProfile.Name;
this.Locale = fbProfile.Locale;
this.AgeRange fbProfile.AgeRange.Min; //or, however you want to modify this object to get the age range (Min?) from the object.
}
public SaveToDB()
{
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<this>();
conn.Insert(this);
}
}
}
我认为,既然 Facebook 个人资料和年龄范围在逻辑上可以说是相关的,那么您可以将这两者合二为一 table:
public class FacebookProfile
{
public string Name { get; set; }
public string Locale { get; set; }
public string Link { get; set; }
[OneToOne]
[Ignore]
[JsonProperty("age_range")]
public AgeRange AgeRange
{
get => _ageRange;
set
{
_ageRange = value;
AgeMin = value?.Min ?? 0;
}
}
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
public string Gender { get; set; }
public bool IsVerified { get; set; }
[PrimaryKey]
public int Id { get; set; }
[JsonIgnore]
public int AgeMin{ get; set; }
}
这可能是一个愚蠢的问题,但我在 sqlite 中保存时遇到了问题。我已成功使用 XF 的 facebook 登录,但也想将信息保存在 sqlite-net-pcl 中。两个模型是:
public class FacebookProfile
{
public string Name { get; set; }
public string Locale { get; set; }
public string Link { get; set; }
[OneToOne]
[JsonProperty("age_range")]
public AgeRange AgeRange { get; set; }
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
public string Gender { get; set; }
public bool IsVerified { get; set; }
[PrimaryKey]
public int Id { get; set; }
}
public class AgeRange
{
public int Min { get; set; }
}
我已成功将信息下载到我的 FacebookProfile 模型并可以显示它。但是,当我试图将它保存在我的 sqlite 数据库中时,FacebookProfile 的 AgeRange 属性 在数据库中保存为 null 并且它应该具有一定的值。使用sqlite连接保存的代码是:
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<FacebookProfile>();
conn.Insert(fp); //fp is the FacebookProfile model info gotten from Facebook API and until this point, fp has agerange min value
}
此时插入数据库的agerange被保存为null,我不知道为什么或者我可能做错了什么。因此,当我尝试在视图模型中使用以下代码检索它时:
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<FacebookProfile>();
FacebookProfile = conn.Table<FacebookProfile>().FirstOrDefault();
}
从数据库中检索到的 FacebookProfile 的 agerange 值为空,但其他我可以获得正确的信息。可能是什么问题?请帮忙!
Sqlite-Net-pcl 不会识别自定义 poco object,例如:
public AgeRange AgeRange { get; set; }
请记住,Sqlite-net-pcl 基本上只是一个包装器,可以让您省去直接与 Sqlite 库交互的麻烦。所以,不必做这样的事情:
SQLiteCommand insertSQL = new SQLiteCommand("INSERT INTO FacebookProfile (Locale, Link, AgeRange, FirstName, LastNameGender, IsVerified, Id) VALUES (?,?,?,?,?,?,?)", conn);
insertSQL.Parameters.Add(facebookProfile.Locale);
insertSQL.Parameters.Add(facebookProfile.Link);
insertSQL.Parameters.Add(facebookProfile.AgeRange); //Assuming this is an int and not a custom type
insertSQL.Parameters.Add(facebookProfile.FirstName);
insertSQL.Parameters.Add(facebookProfile.LastNameGender);
insertSQL.Parameters.Add(facebookProfile.IsVerified);
insertSQL.Parameters.Add(facebookProfile.Id);
insertSQL.ExecuteNonQuery();
你可以简单地说:
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<FacebookProfile>();
conn.Insert(fp); //fp is the FacebookProfile model info gotten from Facebook API and until this point, fp has agerange min value
}
但是,它不知道如何处理您的 AgeRange
class。那是一个字符串吗?那是一个整数吗?就 Sqlite 而言,它是什么?正如其他人在评论中所说,包装器不知道如何将 class 解释为数据库类型,例如 STRING、NUMERIC 等
一般来说,我在创建 table 结构的精确副本作为中介 class object 和 inserting/updating 那些通过您的 parent class 的 Facebook 个人资料。这在编程模式中称为 Anemic domain model,其中:"Anemic domain model is the use of a software domain model where the domain objects contain little or no business logic (validations, calculations, business rules etc.)."
在你的情况下,它可能看起来像这样:
public class dbFacebookProfile
{
dbFacebookProfile(){}
dbFacebookProfile(FacebookProfile fbProfile)
{
this.Name = fbProfile.Name;
this.Locale = fbProfile.Locale;
this.AgeRange fbProfile.AgeRange.Min; //or, however you want to modify this object to get the age range (Min?) from the object.
}
public SaveToDB()
{
using (SQLite.SQLiteConnection conn = new SQLite.SQLiteConnection(App.DB_PATH))
{
conn.CreateTable<this>();
conn.Insert(this);
}
}
}
我认为,既然 Facebook 个人资料和年龄范围在逻辑上可以说是相关的,那么您可以将这两者合二为一 table:
public class FacebookProfile
{
public string Name { get; set; }
public string Locale { get; set; }
public string Link { get; set; }
[OneToOne]
[Ignore]
[JsonProperty("age_range")]
public AgeRange AgeRange
{
get => _ageRange;
set
{
_ageRange = value;
AgeMin = value?.Min ?? 0;
}
}
[JsonProperty("first_name")]
public string FirstName { get; set; }
[JsonProperty("last_name")]
public string LastName { get; set; }
public string Gender { get; set; }
public bool IsVerified { get; set; }
[PrimaryKey]
public int Id { get; set; }
[JsonIgnore]
public int AgeMin{ get; set; }
}