c# - 如何在 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();
解决方案
using (SQLiteConnection connection = db.GetConnection())
{
// Do whatever you want to do with your active connection
}
请注意,您不能在 using 块的范围之外重用该连接,并且必须在下次要访问数据库时以相同的方式获取新连接。
推荐阅读
- python - Python 模块 twitter 错误:“无法对您进行身份验证”
- c++ - 为什么输出中没有显示左括号和右括号?
- visual-studio-code - 如何去除 VS 代码中的下划线之类的蠕虫?
- python - Azure DataBricks - webdriver 安装最佳实践
- python - 如何获得每个人头的隐藏层?
- javascript - 由于叛徒撇号,JSON 解析引发异常
- angular - getTime() 格式为“日-月-年”(Angular)
- html - CSS动画禁用悬停过渡效果
- reactjs - “元素”类型的参数不可分配给“ConcatArray”类型的参数
' (TS2769) - syslog - 是否有用于 TLS 设置的 syslog 输入插件的 fluent-bit.conf 参考