Ошибка БД заблокирована в Android SQLite Xamarin Forms - PullRequest
0 голосов
/ 10 июня 2019

Я работаю над приложением, которое имеет более 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.

Я слышу все предложения.

Заранее спасибо.

...