Xamarin sqlite-net-pcl 访问数据库内部的值

Posted

技术标签:

【中文标题】Xamarin sqlite-net-pcl 访问数据库内部的值【英文标题】:Xamarin sqlite-net-pcl accessing values of database internal 【发布时间】:2018-07-06 22:27:55 【问题描述】:

我正在使用 Visual Studio 2017,它是 SQLite 的新手,我无法理解如何访问保存在数据库中的值并将其返回到类的元素中。

public class MyObject

    [PrimaryKey, AutoIncrement]
    public int IndexNumber
    get;set;
    [MaxLength(20)]
    public int SomeID
    get;set;
    [MaxLength(70)]
    public string SomeName
    get; set;
    [MaxLength(25)]
    public string Telephone
    get; set;
    public DateTime someTime
    get; set;
    //...some more data



public class MyDB

    readonly SQLiteAsyncConnection database;

    public MyDB (string dbPath);

    database.CreateTableAsync<MyObject>().Wait();

    public Task<List<MyObject>> GetMyObjectAsync()
    
        return database.Table<MyObject>().ToListAsync();
    

    public Task<MyObject> GetSingleObjectAsync(int ind)
    
        return database.Table<MyObject>().Where(i => i.IndexNumber == ind).FirstOrDefaultAsync();
    
    public Task<int> SaveMyObjectAsync(MyObject object)
    
        if (object.IndexNumber == 0)
        
            return database.InsertAsync(object)
        
        else
        
            return database.UpdateAsync(object);
        
    
    public Task<int> DeleteMyObjectAsync(MyObject object)
    
        return database.DeleteAsync(object);
    

到目前为止,通过 .xaml 页面输入数据没有任何问题,在 ListView 中选择对象也可以。

现在的问题是,我似乎找不到合适的方法将返回的 Task 转换回一个对象,以使用仅通过 HTTP 响应提供的数据更新其中一些值,而 HTTP 响应本身并不总是提供所有数据表的数据,例如如果在第一个响应中成功,则只有 ID 和代码。 然后它需要来自对象的其他数据并再次为对象的不同元素传递值,这就是为什么我想知道是否有某种方法可以将一行数据返回到临时对象以在数据库中更新它,如果需要,将其删除(通过 HTTP 响应取消)或修改它。

【问题讨论】:

如果你使用 async/await 它将大大简化你的异步方法,而不必处理任务 谢谢,正是我遇到的问题,现在可以正常工作了! 【参考方案1】:

您的问题完全在于没有使用 await 关键字。每当您调用没有 await 关键字的异步方法时,您就做错了:) 我强烈建议您阅读有关它的 James Montemagno 博客文章here。

这里是您的问题的解决方案。

public class MyDB
    
        readonly SQLiteAsyncConnection database;

        public MyDB(string dbPath)
        
            database = new SQLiteAsyncConnection(dbPath);
        

        public async Task CreteMyDb()
        
            await database.CreateTableAsync<MyObject>();
        

        public async Task<List<MyObject>> GetMyObjectsAsync()
        
            return await database.Table<MyObject>().ToListAsync();
        

        public async Task<MyObject> GetSingleObjectAsync(int ind)
        
            return await database.Table<MyObject>().Where(i => i.IndexNumber == ind).FirstOrDefaultAsync();
        

        public async Task<int> SaveMyObjectAsync(MyObject myObject)
        
            if (myObject.IndexNumber == 0)
            
                return await database.InsertAsync(myObject);
            
            else
            
                return await database.UpdateAsync(myObject);
            
        

        public async Task<int> DeleteMyObjectAsync(MyObject myObject)
        
            return await database.DeleteAsync(myObject);
        
    

以及方法的使用示例。

            await this.myDb.CreteMyDb();
            await this.myDb.SaveMyObjectAsync(new MyObject()
            
                SomeID = 1,
                SomeName = "Adam",
                someTime = DateTime.Now,
                Telephone = "53535353"
            );

            var list = await this.myDb.GetMyObjectAsync();

如果有帮助请告诉我!

【讨论】:

Tyvm,确实有帮助!

以上是关于Xamarin sqlite-net-pcl 访问数据库内部的值的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin sqlite 不能使用 struct 作为表数据类型

使用Xamarin开发移动应用示例——数独游戏使用数据库

查询表只返回 null 到 sqlite-net-pcl 中的列表

使用 SQLite 的 sqlite-net-pcl 库更新单行表中单个列的值的简单方法是啥?

访问路径被拒绝(Xamarin/Android)

Xamarin.Forms 相机控制访问 DependencyService