0

我正在使用 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 响应取消)或修改它。

4

1 回答 1

0

您的问题完全在于不使用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();

让我知道它是否有帮助!

于 2018-01-27T23:06:01.037 回答