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

Xamarin sqlite-net-pcl accessing values of database internal

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

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 响应取消)或修改它。

你的问题是没有使用 await 关键字。每当您调用不带 await 关键字的异步方法时,您就做错了 :) 我强烈建议您阅读 James Montemagno 的博客 post 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();

如果有帮助请告诉我!