【问题标题】:Error DB Locked in Android SQLite Xamarin Forms错误数据库锁定在 Android SQLite Xamarin 表单中
【发布时间】:2019-06-10 00:12:33
【问题描述】:

我正在开发一个有 50 多个表并且可以在没有互联网连接的情况下工作的应用程序,因此该应用程序可以在后台与 API 同步并获取所有信息并在本地进行 CRUD 操作。

有时当应用与 API 同步时,当我在应用上进行其他操作时,我会收到错误“数据库已锁定”。

所以我需要帮助来解决这个问题,我知道有很多关于这个问题的帖子,但是基于我对我的数据库的实施,这似乎不足以解决我的问题。

掘金: 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()(关闭与数据库的连接,避免错误Fatal signal 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 的实施是否正常。

我听取了所有建议。

提前致谢。

【问题讨论】:

  • 数据库被锁定表示你打开你的数据库,使用后不要关闭。当你再次打开它时,你会收到这种异常。分析您的代码并确保在每次使用后关闭连接。
  • 感谢您的回答。我在所有数据库方法中都使用 cnn.Dispose () 来关闭连接,但让我再次检查一下,看看我是否丢失了其中一个。但我真的认为我会一直收到该异常,因为我的应用程序可以在后台每 5 分钟运行一次同步,并且在主 UI 上我们可以对本地数据库执行另一项操作。
  • 检查这个答案:stackoverflow.com/questions/17168839/… 可能你的代码中有一个地方,连接没有正确关闭。尝试使用带括号的using (...)
  • 谢谢Денис Чорный,我去看看。

标签: xamarin.forms android-sqlite database-locking


【解决方案1】:

我使用一个连接完成了与本地数据库的所有操作。

在 Sqlite 文档中,他们建议打开连接一次,永远不要关闭它。

public class DataContext
    {
        public static SQLiteConnection cnn;

        public DataContext()
        {
            if (cnn == null)
            {
               Create your tables.
               cnn.CreateTable<...>();
               ...
            }
        }
   }

【讨论】:

  • 是的,链接已损坏,我确实编辑了答案以便更好地解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2012-02-09
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多