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

时间:2018-01-27 21:24:30

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

1 个答案:

答案 0 :(得分:0)

您的问题是关于不使用等待关键字。每当你调用没有等待关键字的异步方法时,你做错了:)我强烈建议你阅读关于它的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();

让我知道它是否有帮助!