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



>我正在使用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 响应提供的数据更新其中一些值,该响应本身并不总是为数据表提供所有数据,例如,如果它在第一个响应中成功,则仅提供 ID 和代码。然后它需要来自对象的其他数据,并再次为对象的不同元素提供值,这就是为什么我想知道是否有某种方法可以将一行数据返回临时对象以在数据库中更新它,如果需要将其删除(通过 HTTP 响应取消(或修改它。

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

这是您问题的解决方案。

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

让我知道它是否有帮助!

最新更新