I have an application that uses a SQLite database.
I created a database at application startup by calling the RSSDatabase constructor, which works fine. After clicking the button, I take the data from the RSS feeds and paste the data into AsyncTask , but this causes an error when I called db.insert("posts", "", values) , here is the error message for 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 UK 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.access$000(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$2.call(AsyncTask.java:288) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.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 looked for this error and found that it was probably caused by different threads accessing the database at the same time, but I looked in my code and did not find the conditions when several threads have race conditions.
Here is my helper database class:
class 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); } }
And my database 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); } }
Can anyone shed some light on this issue?
Thanks in advance!