0

我很努力地使用SQLite.Net Async PCL的異步API通過ID獲取項目。這裏是我的模型類無法從SQLite.Net異步獲取項目PCL

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

} 

而且,這裏有一個一對多的關係

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

這裏的構造函數了LineItem:

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

其他CRUD方法(插入, GetALL)正在工作,除了通過ID獲取發票之外,Visual Studio和Xamarin Studio都沒有給我任何有用的堆棧跟蹤。

這裏是GET方法

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

我傳遞在Android實施的SQLite的,就像我說的數據庫中創建,但我無法獲得發票對象回來了,我甚至嘗試

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

任何幫助將不勝感激。

+0

你的問題很混亂。您聲明您嘗試了兩種不同的構造函數,但您也會說所有其他CRUD操作都可以工作。如果CRUD操作起作用,顯然DB被創建,所以構造函數不是問題。你在Get操作中遇到錯誤嗎?還是它只是返回null? – Jason 2015-03-24 23:54:03

+0

我不同意我的問題令人困惑。我分享了我採取的步驟,並指出我只有通過ID獲取項目的問題,並且Visual Studio不會給我任何有意義的錯誤。無論如何感謝您的時間。 – 2015-03-25 00:21:41

回答

2

追逐陰影三天後,事實證明,這是一個非常簡單的事情,讓我絆倒。我綁保存對象的名單,像這樣

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

我錯過了重複的事實,SQLite.Net是一個輕量級的ORM的文檔的一部分 - 這一點不能強調不夠,所以你會必須刪除您的全尺寸ORM帽子,如EF。因此之後,從SQLite的-Net的擴展文檔它說

文本blobbed性質保存和加載時反序列化時 文本blobbed屬性被序列化到一個文本屬性讀取。這允許將簡單對象存儲在同一個表中的單個列中。 文本blobbed屬性具有序列化和反序列化對象和一些限制的小開銷,但是存儲簡單對象(如List或Dictionary)的基本類型或簡單關係的最佳方法。

我改變了我的竅門,就像這樣,現在一切都按預期工作。現在處理異步和等待的細微差別

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

public string LineItemBlobbed { get; set; }