Я работаю над приложением, которое имеет более 50 таблиц и может работать без подключения к Интернету, поэтому в фоновом режиме приложение может синхронизироваться с API и получать всю информацию и выполнять операцию CRUD локально.
Иногда, когда приложение синхронизируется с API, я получаю сообщение об ошибке " База данных заблокирована ", когда я выполняю другую операцию в приложении.
Так что мне нужна помощь, чтобы решить эту проблему, я знаю, что есть много сообщений об этой проблеме, но, основываясь на моей имплементации с моей базой данных, кажется, этого недостаточно для решения моей проблемы.
Nugets:
Xamarin.Forms 3.0.0 482510
sqlite-net-pcl 1.5.166-beta
Я использую класс DataService.cs, где этот класс соединяется с DataContext.cs
, и устанавливаю соединение с базой данных и методами CRUD.
Все методы в DataService имеют одинаковый способ соединения с DataContext:
//This is a resume of DataService.cs
public class DataService
{
public T Insert<T>(T model)
{
try
{
using (var da = new DataContext())
{
da.Insert(model);
return model;
}
}
catch (Exception error)
{
error.ToString();
return model;
}
}
}
В DataContext.cs
у нас есть связь с локальной базой данных и все методы с локальной базой данных.
Все методы имеют collisionLock (чтобы избежать конфликта с базой данных) и cnn.Dispose()
(чтобы закрыть соединение с базой данных и избежать ошибки Фатальный сигнал 11 (SIGSEGV));
DataContext.cs
public interface IBusinessEntity
{
int ID { get; set; }
}
//This is a resume of DataContext.cs
public class DataContext : IDisposable
{
#region Attributes
public SQLiteConnection cnn;
private static object collisionLock = new object();
#endregion
public DataContext()
{
cnn = DependencyService.Get<IConfiguracion>().GetConnection();
...
}
#endregion
#region MetodosGenericosZulu
public void Insert<T>(T model)
{
try
{
// Use locks to avoid database collisions
lock (collisionLock)
{
cnn.Insert(model);
cnn.Dispose();
}
}
catch (Exception error)
{
Application.Current.MainPage.DisplayAlert(
"Error",
"Un error a ocurrido con la DB (Insert): " + error.Message.ToString(),
"Ok");
}
}
public void Update<T>(T model)
{
try
{
lock (collisionLock)
{
cnn.Update(model);
cnn.Dispose();
}
}
catch (Exception error)
{
Application.Current.MainPage.DisplayAlert(
"Error",
"Un error a ocurrido con la DB (Actualizar): " + error.Message.ToString(),
"Ok");
}
}
...
}
}
Внедрение в проект Android.
public class Configuracion : IConfiguracion
{
public Configuracion(){ }
public SQLite.SQLiteConnection GetConnection()
{
var sqliteFileName = "FN_Desarrollo.db3";
string documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
var path = Path.Combine(documentsPath, sqliteFileName);
var conn = new SQLite.SQLiteConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache);
return conn;
}
}
Поэтому мне нужна ваша помощь, ребята, чтобы решить проблему ( база данных заблокирована ) и проверить, в порядке ли моя реализация с SQLite.
Я слышу все предложения.
Заранее спасибо.