Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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中的SQLiteDiskIOException_Android - Fatal编程技术网

Android中的SQLiteDiskIOException

Android中的SQLiteDiskIOException,android,Android,我们的Android应用程序中出现了大量SQLiteDiskIOException错误,堆栈跟踪与以下类似: E/AndroidRuntime( 2252): Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteQuery.native_fill_window(Native Method)

我们的Android应用程序中出现了大量
SQLiteDiskIOException
错误,堆栈跟踪与以下类似:

E/AndroidRuntime( 2252): Caused by: android.database.sqlite.SQLiteDiskIOException: disk I/O error
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteQuery.native_fill_window(Native Method)
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:75)
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:288)
E/AndroidRuntime( 2252): at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:269)
E/AndroidRuntime( 2252): at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171)
E/AndroidRuntime( 2252): at android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248)
E/AndroidRuntime( 2252): at com.company.android.CActivity$QueryTask.doInBackground(CActivity.java:1660)
这是几周前开始的,但在开始报告此问题的确切版本中,没有发生重大的数据库更改。尽管有(我相信)适当的索引,但在查询完成后调用
cursor.moveToFirst()
时,这个异常的报告比我们所熟悉的要多,从堆栈跟踪中可以看出。到目前为止,我们完全无法复制

查询有点复杂,有三个左连接。下面是一个具有代表性的查询,其中一些标识列被更改以保护无辜者

select distinct c._id as _id,c.type as type,c.name as name,c.slug as slug,c.description as description,c.extra1 as extra1,c.extra2 as extra2,c.extra3 as extra3,c.extra4 as extra4,c.extra5,c.extra6 as extra6,c.extra7 as extra7,c.extra8 as extra8, c.extra9 as extra9,c.sslug as sslug,
  c2.name as sname,
  p.type as prel,
  em.dS as dS,em.eS as eS 
from cse as c 
left join cse as c2 on c.sslug=c2.slug 
left join emed as em on c.slug=em.slug 
left join pre as p on c.sslug=p.slug 
where c.pslug='slug' AND c.user='user' AND c.csource='csource' 
order by c.type asc, c.extra6 desc, c.sortorder asc
其他消息来源表明,我们试图提取太多数据,但事实并非如此。我们能够获得完整数据库行数的三个用户案例显示: 具有<2000个条目的cse,
emed with似乎存在多线程问题,一个线程试图获取数据,而另一个或多个线程试图将一些数据插入表中,因为异常是从方法(getCount)引发的


也不要忘记;SQLite游标不是内部同步的,所以如果从多个线程使用此游标,则应该执行自己的同步机制

我们也有类似的问题。当我们的应用程序启动时,会发生souch错误。 在onCreate方法中,我们检查应用程序路径中是否有任何数据库。如果出现任何数据库,我们将调用此类代码

public boolean createDataBase() throws IOException
    { 
        boolean dbExist = checkDataBase();

        if(dbExist)
        {
            //do nothing - database already exist
        }
        else
        { 
            //By calling this method and empty database will be created into the default system path
            //of your application so we are gonna be able to overwrite that database with our database.
            this.getReadableDatabase();
        }

        return dbExist;
    }



    private boolean checkDataBase()
    {
        SQLiteDatabase checkDB = null;

        try
        {
            String myPath = DATABASE_PATH + DATABASE_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

        }
        catch(SQLiteException e)
        {

        }

        if(checkDB != null)
        { 
            checkDB.close(); 
        }

        return checkDB != null ? true : false;
    }
如果没有数据库(应用程序的第一次运行),我们将从资源中复制它。
但有时会发生SQLiteDiskIOException和来自资源的数据库调用。

一个原因是Bassel Kh指出的多线程问题,另一个原因是数据库不可用,即数据库被删除或SD卡不可用

你能制作一个小应用程序再现这个问题吗?如果是这样的话,我会把它上传到我一直试图通过我们的应用程序重现这个问题一段时间了。我还没有尝试过一个小程序,特别是在2.1上。如果最新的更改不能解决问题,那么这可能是下一条路径。谢谢。我想人们会买一些劣质的SD卡,这些卡都有腐败问题。有人能证实这个答案吗?因为我有一些严重的问题相信这是事实?有没有人能够创建一个测试用例来证明游标确实是错误的?