从未在数据库上显式调用close()

时间:2013-11-07 18:43:07

标签: android database android-sqlite

我正在写一个音乐播放器,尽管在重新创建音乐数据库时使用了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 ...'

这是从哪里来的?

1 个答案:

答案 0 :(得分:0)

我有一次这个错误。它不是需要明确关闭的数据库。它是从查询中获得的Cursor。