Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Sqlite数据库实例是线程安全的吗_Android_Sqlite_Locking_Thread Safety - Fatal编程技术网

Android Sqlite数据库实例是线程安全的吗

Android Sqlite数据库实例是线程安全的吗,android,sqlite,locking,thread-safety,Android,Sqlite,Locking,Thread Safety,我有一个数据库和一些表。 我想使用多个线程更新表。 我将在所有线程中使用相同的SQLiteDatabase实例 请说明此方法是否正确。 Sqlite数据库是线程安全的吗? 两个不同的线程可以同时为不同的值集更新同一个表。[错误:]否,默认情况下它不是线程安全的。您应该使用与锁定相关的SQLiteHelper方法来提供线程安全性 [Ed]:SQLDeDATABASE类提供了一个锁定机制默认为(请参阅注释),如果您在多线程上运行,则不必考虑更改任何线程安全性。p> 在此文档中搜索“线程”: 请阅读

我有一个数据库和一些表。 我想使用多个线程更新表。 我将在所有线程中使用相同的SQLiteDatabase实例

请说明此方法是否正确。 Sqlite数据库是线程安全的吗?
两个不同的线程可以同时为不同的值集更新同一个表。

[错误:]否,默认情况下它不是线程安全的。您应该使用与锁定相关的SQLiteHelper方法来提供线程安全性

<强> [Ed]:SQLDeDATABASE类提供了一个锁定机制<强>默认为(请参阅注释),如果您在多线程上运行,则不必考虑更改任何线程安全性。p> 在此文档中搜索“线程”:

请阅读以下内容:

    • 如果你成功了

      setLockingEnabled(布尔值lockingEnabled)
      通过在关键部分周围使用锁来控制SQLiteDatabase是否具有线程安全性。

      您可以通过以下方式控制数据库是否具有线程安全性

      通过在关键部分周围使用锁来控制SQLiteDatabase是否是线程安全的。这是相当昂贵的,所以如果您知道您的数据库将只由一个线程使用,那么您应该将其设置为false。默认值为true

      所以我认为这回答了你的问题


      setLockingEnabled方法在API级别16中被降级,Android使用java锁定机制保持SQLite数据库访问序列化。所以,如果多个线程有一个db实例,它总是以序列化的方式调用数据库,当然数据库是线程安全的

      如果我们确认使用的是来自单线程的数据库,我们可以通过调用
      setLockingEnable(false)
      来设置数据库内部锁定禁用,但此方法来自API级别16,不再使用。如果您在
      SQLiteDatabase
      类中看到此方法的实现,您将发现其中没有写入任何内容,即空方法

      public void setLockingEnabled (boolean lockingEnabled)
      
      此方法现在不起任何作用。请勿使用。

      我们应该注意的一件事是,我们应该为您的helper类创建一个实例(即使其成为单实例),并将同一实例共享给多个线程,并且在操作之间不要调用数据库上的
      close()
      ,否则您可能会遇到以下异常:

      java.lang.IllegalStateException:尝试重新打开已关闭的对象:SQLiteDatabase


      因此,不要调用
      database.close()
      在访问数据库之间,当所有操作完成时,数据库将在内部自行执行close操作。

      通过在关键部分周围使用锁来控制SQLiteDatabase是否具有线程安全性。这是相当昂贵的,所以如果您知道您的数据库将只由一个线程使用,那么您应该将其设置为false。默认值为true
      。。。这不意味着默认情况下它是线程安全的吗?嗯,应该是的,现在我错了。Hmm.“此方法在API级别16中被弃用。此方法现在不起任何作用。请勿使用。”因此,现在当该方法被弃用时,SQLiteDatabase实例在任何情况下都不是线程安全的?@Ivan请参阅:
      …如果无法获取数据库连接以执行特定操作,线程可能会阻塞。
      可能的重复项您应该使用“是”中所述的锁定。调用时,我有一些错误
      sqLiteHelper。在
      ondestory
      中关闭
      。那么我应该怎么做呢?根本不叫它?当所有操作完成时,数据库将在内部自行执行关闭操作。但是
      public SQLiteDatabase getwriteabledatabase()
      说,当您不再需要数据库时,请确保调用close。