首页 > 解决方案 > 如何在 Xamarin 表单中关闭 SQLite 连接?

问题描述

我有一个从我的服务器获取数据的代码。每一条数据都会被一一插入到我的本地数据库(SQLite 数据库)中。每次我都会遇到这两个错误。我下面的代码是异常总是出现的地方。

SQLite.SQLiteException: 忙
SQLite.SQLiteException: 数据库被锁定

我总是得到这些异常的原因是什么?

更新:
我添加了await conn.CloseAsync(); 在代码的每一端都是正确的吗?

这是我的第一个代码,它会询问服务器是否有更新,如果有更新,它将插入或替换(更新)我本地数据库中的数据:

var db = DependencyService.Get<ISQLiteDB>();
var conn = db.GetConnection();

string apifile = "sync-retailer-outlet-server-update-api.php";
var lastchecked = Preferences.Get("retaileroutletchangelastcheck", String.Empty, "private_prefs");
int count = 0;

var uri = new Uri(string.Format("http://" + domain + "/TBSApp/app_api/" + apifile + "?Host=" + host + "&Database=" + database + "&ContactID=" + contact + "&LastChecked=" + lastchecked, string.Empty));

try
{
    SyncStatus("Getting retailer outlet data from server");

    var response = await client.GetAsync(uri);

    if (response.IsSuccessStatusCode)
    {
        var content = await response.Content.ReadAsStringAsync();

        if (!string.IsNullOrEmpty(content))
        {
            var dataresult = JsonConvert.DeserializeObject<List<RetailerGroupData>>(content, settings);
            var datacount = dataresult.Count;

            for (int i = 0; i < datacount; i++)
            {
                SyncStatus("Saving retailer outlet server update to local database (" + (count + 1) + " out of " + dataresult.Count + ")");

                var item = dataresult[i];
                var retailerCode = item.RetailerCode;

                var insertdata = new RetailerGroupTable
                {
                    RetailerCode = retailerCode
                };

                await conn.InsertOrReplaceAsync(insertdata);

                count++;
            }
        }
    }
}
catch (Exception ex)
{
    Crashes.TrackError(ex);
}

await conn.CloseAsync();

这是每次加载 StartPage 时创建本地数据库表的其他代码。

public async void CreateTableAsync()
    {
        try
        {
            var db = DependencyService.Get<ISQLiteDB>();
            var conn = db.GetConnection();

            if (conn != null)
            {
                try
                {
                    await conn.CreateTableAsync<UserTable>();
                    await conn.CreateTableAsync<ContactsTable>();
                    await conn.CreateTableAsync<ActivityTable>();
                    await conn.CreateTableAsync<CAFTable>();
                    await conn.CreateTableAsync<RetailerGroupTable>();
                    await conn.CreateTableAsync<UserEmailTable>();
                    await conn.CreateTableAsync<UserLogsTable>();
                    await conn.CreateTableAsync<SubscriptionTable>();
                    await conn.CreateTableAsync<ProvinceTable>();
                    await conn.CreateTableAsync<TownTable>();
                }
                catch (Exception ex)
                {
                    Console.Write("Creating table error " + ex.Message);
                }
            }
        }
        catch (Exception ex)
        {
            Crashes.TrackError(ex);
            await DisplayAlert("Application Error", "Error:\n\n" + ex.Message.ToString() + "\n\n Please contact your administrator", "Ok");
        }
    }

await conn.CloseAsync();

标签: c#sqlitexamarinxamarin.formsxamarin.android

解决方案


using (SQLiteConnection connection = db.GetConnection())
{
    // Do whatever you want to do with your active connection
}

请注意,您不能在 using 块的范围之外重用该连接,并且必须在下次要访问数据库时以相同的方式获取新连接。


推荐阅读