我正在写一个音乐播放器,尽管在重新创建音乐数据库时使用了songsdb.close(),但我收到了此错误。
UpdateDB.java:reloadDB():
public void reloadDB (View v) {
status.setText(getText(R.string.updatedb_text_status_init));
loadSongsFromFile();
status.setText(getText(R.string.updatedb_text_status_recdb));
this.getDatabasePath("songs").delete();
SongsDBOpenHelper sdboh = new SongsDBOpenHelper(this.getApplicationContext());
SQLiteDatabase songsdb = sdboh.getWritableDatabase();
status.setText(getText(R.string.updatedb_text_status_fildb));
songsdb.beginTransaction();
for (String s : songs) {
AudioFile af = new AudioFile(new File(s));
songsdb.execSQL("INSERT OR IGNORE INTO artists (name) VALUES (\"" + af.getMetadata()[1] + "\")");
Cursor c = songsdb.rawQuery("SELECT * FROM artists WHERE name = \"" + af.getMetadata()[1] + "\";", null);
c.moveToFirst();
songsdb.execSQL("INSERT OR IGNORE INTO albums (name, artist) VALUES (\"" + af.getMetadata()[2] + "\", \"" + c.getInt(0) + "\")");
c = songsdb.rawQuery("SELECT * FROM albums WHERE name = \"" + af.getMetadata()[2] + "\";", null);
c.moveToFirst();
songsdb.execSQL("INSERT OR IGNORE INTO songs (name, album, file) VALUES (\"" + af.getMetadata()[0] + "\", \"" + c.getInt(0) + "\", \"" + af.getFileString() + "\")");
Log.d("Song", af.getMetadata()[0]);
}
status.setText(getText(R.string.updatedb_text_status_finishing));
songsdb.setTransactionSuccessful();
songsdb.endTransaction();
songsdb.close();
sdboh.close();
this.finish();
}
SongsDBOpenHelper:的onCreate():
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE songs (_id INTEGER PRIMARY KEY ASC, name VARCHAR(50) UNIQUE, album INTEGER, file VARCHAR(100));");
db.execSQL("CREATE TABLE albums (_id INTEGER PRIMARY KEY ASC, name VARCHAR(50) UNIQUE, artist INTEGER);");
db.execSQL("CREATE TABLE artists (_id INTEGER PRIMARY KEY ASC, name VARCHAR(50) UNIQUE);");
}
班级AudioFile
不使用任何数据库。
我知道我正在以错误的方式使用rawQuery
......
修改
添加try / catch-blocks后,这个问题就解决了。但是我为每首现有的歌曲收到了其他错误:
Failure 10 (Disk I/O error) on 0x1f5738 when executing 'INSERT OR IGNORE ...'
这是从哪里来的?
答案 0 :(得分:0)
我有一次这个错误。它不是需要明确关闭的数据库。它是从查询中获得的Cursor。