无法从 SQLite.Net 异步 PCL 获取项目
Unable to get Item from SQLite.Net Async PCL
我正在努力使用 SQLite.Net 异步 PCL 的异步 API 通过 ID 获取项目。这是我的模型 class
public class Invoice : IEntityBase
{
public Invoice()
{
LineItems = new List<LineItem>();
DateCreated = DateTime.Now;
}
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
public DateTime DateCreated { get; set; }
public int Term { get; set; }
public bool Paid { get; set; }
public decimal Total { get; set; }
public string Notes { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<LineItem> LineItems { get; set; }
}
以及此处具有一对多关系的 LineItem
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
public int Qty { get; set; }
[ForeignKey(typeof(Invoice))]
public int InvoiceId { get; set; }
[ManyToOne]
public Invoice Invoice { get; set; }
这是构造函数:
public SQLiteAsyncConnection DbConnection;
public InvoiceDatabase(ISQLitePlatform platform, string databasePath)
{
if (DbConnection == null)
{
var connectionAsync = new Func<SQLiteConnectionWithLock>(() =>
new SQLiteConnectionWithLock
(
platform,
new SQLiteConnectionString(databasePath, false)
)
);
DbConnection = new SQLiteAsyncConnection(connectionAsync);
DbConnection.CreateTableAsync<Invoice>();
DbConnection.CreateTableAsync<LineItem>();
}
}
除了按 ID 获取发票外,其他 CRUD 方法(Insert、GetALL)都在工作,Visual Studio 和 Xamarin Studio 都没有给我任何有用的堆栈跟踪信息。
这是获取方法
private readonly InvoiceDatabase _database;
public InvoiceRepository(ISQLitePlatform platform, string databasePath)
{
if (_database == null)
{
_database = new InvoiceDatabase(platform, databasePath);
}
}
public async Task<Invoice> GetInvoice(int id)
{
var result = await _database.DbConnection.Table<Invoice>()
.Where(t => t.Id == id)
.FirstOrDefaultAsync();
return result;
}
我正在传递 SQLite 的 Android 实现,就像我说的,数据库已创建但我无法取回发票对象,我什至尝试过
public Task<Invoice> GetInvoiceWithChildren(int id)
{
return _database.DbConnection.GetWithChildrenAsync<Invoice>(id);
}
任何帮助将不胜感激。
追了三天的影子,原来是一个很简单的事情把我给绊倒了。我想像这样保存一个对象列表
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<LineItem> LineItems { get; set; }
我错过了文档中重复 SQLite.Net 是轻量级 ORM 这一事实的部分——这一点再怎么强调也不为过,因此您将不得不移除全尺寸 ORM 帽子,例如 EF。因此,在阅读了 SQLite-Net 扩展文档后,它说
文本斑点属性
文本斑点属性在保存时序列化为文本 属性,在加载时反序列化。这允许将简单对象存储在单个列中的相同 table 中。
Text-blobbed 属性在序列化和反序列化对象方面有一些小的开销和一些限制,但它是存储简单对象(如基本类型的 List 或 Dictionary 或简单关系)的最佳方式。
我像这样更改了我的属性,现在一切都按预期工作。现在开始处理 Async 和 Await
的细微差别
[TextBlob("LineItemBlobbed")]
public List<LineItem> LineItems { get; set; }
public string LineItemBlobbed { get; set; }
我正在努力使用 SQLite.Net 异步 PCL 的异步 API 通过 ID 获取项目。这是我的模型 class
public class Invoice : IEntityBase
{
public Invoice()
{
LineItems = new List<LineItem>();
DateCreated = DateTime.Now;
}
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
public DateTime DateCreated { get; set; }
public int Term { get; set; }
public bool Paid { get; set; }
public decimal Total { get; set; }
public string Notes { get; set; }
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<LineItem> LineItems { get; set; }
}
以及此处具有一对多关系的 LineItem
[PrimaryKey, AutoIncrement, Column("_id")]
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public string Category { get; set; }
public int Qty { get; set; }
[ForeignKey(typeof(Invoice))]
public int InvoiceId { get; set; }
[ManyToOne]
public Invoice Invoice { get; set; }
这是构造函数:
public SQLiteAsyncConnection DbConnection;
public InvoiceDatabase(ISQLitePlatform platform, string databasePath)
{
if (DbConnection == null)
{
var connectionAsync = new Func<SQLiteConnectionWithLock>(() =>
new SQLiteConnectionWithLock
(
platform,
new SQLiteConnectionString(databasePath, false)
)
);
DbConnection = new SQLiteAsyncConnection(connectionAsync);
DbConnection.CreateTableAsync<Invoice>();
DbConnection.CreateTableAsync<LineItem>();
}
}
除了按 ID 获取发票外,其他 CRUD 方法(Insert、GetALL)都在工作,Visual Studio 和 Xamarin Studio 都没有给我任何有用的堆栈跟踪信息。
这是获取方法
private readonly InvoiceDatabase _database;
public InvoiceRepository(ISQLitePlatform platform, string databasePath)
{
if (_database == null)
{
_database = new InvoiceDatabase(platform, databasePath);
}
}
public async Task<Invoice> GetInvoice(int id)
{
var result = await _database.DbConnection.Table<Invoice>()
.Where(t => t.Id == id)
.FirstOrDefaultAsync();
return result;
}
我正在传递 SQLite 的 Android 实现,就像我说的,数据库已创建但我无法取回发票对象,我什至尝试过
public Task<Invoice> GetInvoiceWithChildren(int id)
{
return _database.DbConnection.GetWithChildrenAsync<Invoice>(id);
}
任何帮助将不胜感激。
追了三天的影子,原来是一个很简单的事情把我给绊倒了。我想像这样保存一个对象列表
[OneToMany(CascadeOperations = CascadeOperation.All)]
public List<LineItem> LineItems { get; set; }
我错过了文档中重复 SQLite.Net 是轻量级 ORM 这一事实的部分——这一点再怎么强调也不为过,因此您将不得不移除全尺寸 ORM 帽子,例如 EF。因此,在阅读了 SQLite-Net 扩展文档后,它说
文本斑点属性 文本斑点属性在保存时序列化为文本 属性,在加载时反序列化。这允许将简单对象存储在单个列中的相同 table 中。 Text-blobbed 属性在序列化和反序列化对象方面有一些小的开销和一些限制,但它是存储简单对象(如基本类型的 List 或 Dictionary 或简单关系)的最佳方式。
我像这样更改了我的属性,现在一切都按预期工作。现在开始处理 Async 和 Await
的细微差别[TextBlob("LineItemBlobbed")]
public List<LineItem> LineItems { get; set; }
public string LineItemBlobbed { get; set; }