Android SQLite数据库:SQLiteDiskIOException:磁盘I / O错误(代码1802)

前端之家收集整理的这篇文章主要介绍了Android SQLite数据库:SQLiteDiskIOException:磁盘I / O错误(代码1802)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个使用sqlite@R_301_457@的应用程序.

我在应用程序启动时创建了@R_301_457@,调用RSSDatabase的构造函数,工作正常.单击一个按钮后,我从RSS提要中获取数据并在AsyncTask中插入数据,但是当我调用db.insert(“posts”,“”,values)时会导致错误,这是logcat的错误消息:

  1. 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) -
  2. 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 (?,?,?)]
  3. 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=
  4. The British government had recently ordered an urgent investigation into possible U.K. involvement in the raid.
  5. link=http://www.thehindu.com/news/international/world/uk-admits-limited-role-in-operation-blue-star/article5653316.ece
  6. android.database.sqlite.sqliteDiskIOException: disk I/O error (code 1802)
  7. at android.database.sqlite.sqliteConnection.nativeExecuteForLastInsertedRowId(Native Method)
  8. at android.database.sqlite.sqliteConnection.executeForLastInsertedRowId(sqliteConnection.java:782)
  9. at android.database.sqlite.sqliteSession.executeForLastInsertedRowId(sqliteSession.java:788)
  10. at android.database.sqlite.sqliteStatement.executeInsert(sqliteStatement.java:86)
  11. at android.database.sqlite.sqliteDatabase.insertWithOnConflict(sqliteDatabase.java:1469)
  12. at android.database.sqlite.sqliteDatabase.insert(sqliteDatabase.java:1339)
  13. at com.example.aolreader.RSSDatabase.insertPost(RSSDatabase.java:44)
  14. at com.example.aolreader.XMLRSSActivity.parseNews(XMLRSSActivity.java:386)
  15. at com.example.aolreader.XMLRSSActivity.access$000(XMLRSSActivity.java:33)
  16. at com.example.aolreader.XMLRSSActivity$ParseTask.doInBackground(XMLRSSActivity.java:171)
  17. at com.example.aolreader.XMLRSSActivity$ParseTask.doInBackground(XMLRSSActivity.java:134)
  18. at android.os.AsyncTask$2.call(AsyncTask.java:288)
  19. at java.util.concurrent.FutureTask.run(FutureTask.java:237)
  20. at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
  21. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
  22. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
  23. at java.lang.Thread.run(Thread.java:841)

搜索了这个错误,发现它可能是由同一时间访问@R_301_457@的不同线程引起的,但我查看了我的代码,发现没有多线程有竞争条件的情况.

这是我的@R_301_457@助手类:

  1. class RSSDatabaseHelper extends sqliteOpenHelper {
  2.  
  3. private static final String createPostTablesql = "create table posts (" +
  4. "_id integer primary key autoincrement," +
  5. "title varchar," +
  6. "author varchar," +
  7. "link varchar," +
  8. "description varchar," +
  9. "date varchar)";
  10.  
  11. private Context context;
  12.  
  13. public RSSDatabaseHelper(Context c,String name,sqliteDatabase.CursorFactory factory,int version) {
  14. super(c,name,factory,version);
  15. context = c;
  16. }
  17.  
  18. @Override
  19. public void onCreate(sqliteDatabase db) {
  20. db.execsql(createPostTablesql);
  21. }
  22.  
  23. @Override
  24. public void onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {
  25. db.execsql("drop table if exists posts");
  26. onCreate(db);
  27. }
  28. }

我的@R_301_457@类:

  1. public class RSSDatabase {
  2. private static RSSDatabase instance;
  3.  
  4. private sqliteDatabase db;
  5. private RSSDatabaseHelper dbHelper;
  6.  
  7. private RSSDatabase(Context c) {
  8. dbHelper = new RSSDatabaseHelper(c,"RSS_db",null,1);
  9. db = dbHelper.getWritableDatabase();
  10. }
  11.  
  12. public static synchronized RSSDatabase getDatabaseInstance(Context c) {
  13. if (instance == null) {
  14. instance = new RSSDatabase(c);
  15. }
  16. return instance;
  17. }
  18.  
  19. public void insertPost(Post post) {
  20. ContentValues values = new ContentValues();
  21. values.put("title",post.title);
  22. values.put("author",post.author);
  23. values.put("link",post.link);
  24. values.put("description",post.description);
  25. values.put("date",post.date);
  26. db.insert("posts","",values);
  27. }
  28. }

谁能解释一下这个问题呢?

提前致谢!

解决方法

当应用程序启动时,调用RSSDatabase的构造函数,UI Thread会锁定您的@R_301_457@
  1. db = dbHelper.getWritableDatabase(); // In the constructor

现在从Async任务(不同的线程),您正在尝试在由UI线程锁定的@R_301_457@中插入数据.这将引发异常,因为第一次写入对db有锁定.

猜你在找的Android相关文章