Android SQLite 数据库:SQLiteDiskIOException:磁盘 I/O 错误(代码 1802)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21554277/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Android SQLite Database: SQLiteDiskIOException: disk I/O error (code 1802)
提问by Guanlun
I have an app that makes use of the SQLite database.
我有一个使用 SQLite 数据库的应用程序。
I created the database when the application starts, calling the constructor of RSSDatabase, which works fine. After a button is clicked, I fetch data from RSS feeds and insert data in an AsyncTask
, but that causes an error when I called db.insert("posts", "", values)
, here is the error message for logcat:
我在应用程序启动时创建了数据库,调用了 RSSDatabase 的构造函数,工作正常。单击按钮后,我从 RSS 提要中获取数据并将数据插入到 中AsyncTask
,但是当我调用时会导致错误db.insert("posts", "", values)
,这是 logcat 的错误消息:
02-04 21:43:22.050 19154-19357/com.example.aolreader E/SQLiteLog﹕ (1802) os_unix.c:30026: (2) stat(/data/data/com.example.aolreader/databases/rss_db) -
02-04 21:43:22.050 19154-19357/com.example.aolreader E/SQLiteLog﹕ (1802) statement aborts at 13: [INSERT INTO posts(author,title,date,description,link) VALUES (?,?,?,?,?)]
02-04 21:43:22.050 19154-19357/com.example.aolreader E/SQLiteDatabase﹕ Error inserting author=AP title=UK admits ‘limited' role in Operation Blue Star date=Tue, 4 Feb 2014 19:03:27 +0530 description=
The British government had recently ordered an urgent investigation into possible U.K. involvement in the raid.
link=http://www.thehindu.com/news/international/world/uk-admits-limited-role-in-operation-blue-star/article5653316.ece
android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 1802)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
at com.example.aolreader.RSSDatabase.insertPost(RSSDatabase.java:44)
at com.example.aolreader.XMLRSSActivity.parseNews(XMLRSSActivity.java:386)
at com.example.aolreader.XMLRSSActivity.accessclass RSSDatabaseHelper extends SQLiteOpenHelper {
private static final String createPostTableSql = "create table posts (" +
"_id integer primary key autoincrement," +
"title varchar," +
"author varchar," +
"link varchar," +
"description varchar," +
"date varchar)";
private Context context;
public RSSDatabaseHelper(Context c, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(c, name, factory, version);
context = c;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(createPostTableSql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists posts");
onCreate(db);
}
}
0(XMLRSSActivity.java:33)
at com.example.aolreader.XMLRSSActivity$ParseTask.doInBackground(XMLRSSActivity.java:171)
at com.example.aolreader.XMLRSSActivity$ParseTask.doInBackground(XMLRSSActivity.java:134)
at android.os.AsyncTask.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
I googled this error and found that it is probably caused by different thread accessing the database at the same time, but I looked into my code and found no condition where multiple threads have race conditions.
我用谷歌搜索了这个错误,发现它可能是由不同的线程同时访问数据库引起的,但我查看了我的代码并没有发现多个线程存在竞争条件的情况。
Here is my database helper class:
这是我的数据库助手类:
public class RSSDatabase {
private static RSSDatabase instance;
private SQLiteDatabase db;
private RSSDatabaseHelper dbHelper;
private RSSDatabase(Context c) {
dbHelper = new RSSDatabaseHelper(c, "rss_db", null, 1);
db = dbHelper.getWritableDatabase();
}
public static synchronized RSSDatabase getDatabaseInstance(Context c) {
if (instance == null) {
instance = new RSSDatabase(c);
}
return instance;
}
public void insertPost(Post post) {
ContentValues values = new ContentValues();
values.put("title", post.title);
values.put("author", post.author);
values.put("link", post.link);
values.put("description", post.description);
values.put("date", post.date);
db.insert("posts", "", values);
}
}
And my database class:
我的数据库类:
db = dbHelper.getWritableDatabase(); // In the constructor
Could anyone shed some light on this issue?
任何人都可以对这个问题有所了解吗?
Thanks in advance!
提前致谢!
回答by Zohra Khan
When the application starts, calling the constructor of RSSDatabase, UI Thread is locking your database
当应用程序启动时,调用 RSSDatabase 的构造函数,UI Thread 正在锁定你的数据库
##代码##Now from Async task( different thread), You are trying to insert data in the database which is locked by UI thread. This will throw an exception because the first write has a lock on the db.
现在从异步任务(不同的线程),您正在尝试在被 UI 线程锁定的数据库中插入数据。这将引发异常,因为第一次写入对 db 有锁定。