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
getReadableDatabase()中的Android SQLiteDiskIOException,本机设置语言环境,SQLiteOpenHelper_Android_Sqlite_Exception_Sqliteopenhelper_Setlocale - Fatal编程技术网

getReadableDatabase()中的Android SQLiteDiskIOException,本机设置语言环境,SQLiteOpenHelper

getReadableDatabase()中的Android SQLiteDiskIOException,本机设置语言环境,SQLiteOpenHelper,android,sqlite,exception,sqliteopenhelper,setlocale,Android,Sqlite,Exception,Sqliteopenhelper,Setlocale,最近,我遇到了一个与使用SQLiteOpenHelper有关的问题。 很少有用户报告了我无法再现的错误: android.database.sqlite.SQLiteDiskIOException: disk I/O error at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDat

最近,我遇到了一个与使用SQLiteOpenHelper有关的问题。 很少有用户报告了我无法再现的错误:

android.database.sqlite.SQLiteDiskIOException: disk I/O error
at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:197)
所以这里没什么特别的。该异常在getReadableDatabase()调用后引发,在堆栈中可见

注意,这个类被许多线程访问,但是访问是完全同步的(锁+只有一个,相同的类实例)。应用程序可以移动到SD卡(也许这就是问题所在?)

不幸的是,我不知道问题发生在哪个设备/安卓版本上(平台:Google Play console中的其他),但在谷歌搜索之后,我怀疑是安卓v2.2.1

有什么想法吗?我知道这个问题不太常见,但我还没有找到任何解决办法

  • 这种类型的错误主要发生在同时执行两个操作时
  • 当您错误地关闭或打开数据库时。例如,当关闭数据库,然后启动查询时
  • SQLiteDiskIOException同时与多个访问相关 对于您的数据库,一个线程尝试获取数据,而另一个线程则正在运行 正在尝试同时插入数据

    但有时,如果使用以下as for DB_路径获得“磁盘I/O错误”,似乎可以解决问题:

    getDataDirectory()+“/data/YOUR_APP_PACKAGE/databases/”

    请阅读以下内容:

    我再次查看了代码,事实上,并发访问的可能性很小(其中一个方法上没有同步关键字)。并发的可能性很小,用户必须输入应用程序设置,并在后台服务访问数据库时点击“清除缓存”(每3小时一次)。但这可能是个问题。谢谢第二种选择在我的情况下是不可能的。谢谢。我在Altaf的回答下发布了一条关于多重访问的评论。至于您发布的线程,我已经读过了,但是我认为更改数据库路径没有意义,因为我没有指定它。。。?
    public class SqliteDatabase extends SQLiteOpenHelper
    {
        public SqliteDatabase(Context context, String dbName, int dbVersion)
        {
            super(context, dbName, null, dbVersion);
            this.context = context;
            this.dbName = dbName;
            this.dbVersion = dbVersion;
        }
        (...)
    }