【问题标题】:Unable to get Item from SQLite.Net Async PCL无法从 SQLite.Net Async PCL 获取项目
【发布时间】:2015-03-24 23:36:58
【问题描述】:

我正在努力使用 SQLite.Net Async PCL 的异步 API 按 ID 获取项目。这是我的模型类

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; }    

}

以及此处具有一对多关系的 LineItems

[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 实现,就像我说创建了数据库但我无法取回 Invoice 对象,我什至尝试过

public Task<Invoice> GetInvoiceWithChildren(int id)
{
    return _database.DbConnection.GetWithChildrenAsync<Invoice>(id);
}

任何帮助将不胜感激。

【问题讨论】:

  • 您的问题令人困惑。您说您尝试了两种不同的构造函数,但您还说所有其他 CRUD 操作都有效。如果 CRUD 操作有效,则显然创建了数据库,因此构造函数不是问题。您是否在 Get 操作中遇到错误?还是只是返回 null?
  • 我不同意我的问题令人困惑。我分享了我已采取的步骤,并表示我只遇到了按 ID 获取项目的问题,并且 Visual Studio 没有给我任何有意义的错误。无论如何,感谢您的宝贵时间。

标签: xamarin xamarin.android sqlite.net sqlite-net-extensions


【解决方案1】:

经过三天的追影,原来这只是一件非常简单的事情让我绊倒。我想保存这样的对象列表

[OneToMany(CascadeOperations = CascadeOperation.All)] 
public List<LineItem> LineItems { get; set; }  

我错过了文档中重复 SQLite.Net 是轻量级 ORM 的事实的部分 - 这一点不能足够强调,因此您将不得不删除您的全尺寸 ORM 帽子,例如 EF。因此,在阅读了 SQLite-Net Extension 文档后说

文本块属性 Text-blobbed 属性在保存时序列化为文本属性,并在加载时反序列化。这允许将简单对象存储在同一表中的单个列中。 Text-blobbed 属性在序列化和反序列化对象方面有少量开销和一些限制,但它是存储简单对象(如基本类型或简单关系的 List 或 Dictionary)的最佳方式。

我像这样更改了我的属性,现在一切都按预期工作。现在开始处理 Async 和 Await 的细微差别

[TextBlob("LineItemBlobbed")]
public List<LineItem> LineItems { get; set; }

public string LineItemBlobbed { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 2018-11-23
    • 1970-01-01
    相关资源
    最近更新 更多