我有一个使用SQLite数据库的应用程序。
当应用程序启动时,我调用RSSDatabase的构造函数创建数据库,这个过程运行良好。点击按钮后,我使用AsyncTask
从RSS源获取数据,并将数据插入到数据库中,但是在调用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.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)
我在谷歌上搜索了这个错误,并发现它可能是由于不同的线程同时访问数据库所致,但我查看了我的代码,并没有发现多个线程存在竞争条件的情况。
以下是我的数据库帮助类:
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);
}
}
我的数据库类:
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);
}
}
有谁能解释一下这个问题吗?
提前感谢!
SQLITE_IOERR_FSTAT
。你的数据库有多大?有并发的读/写/删除操作吗? - laalto