0

音楽プレーヤーを作成していますが、音楽データベースを再作成するときに songdb.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 ブロックを追加した後、この問題は解決されました。しかし、存在するすべての曲に対して他のエラーが発生しています。

Failure 10 (Disk I/O error) on 0x1f5738 when executing 'INSERT OR IGNORE ...'

これはどこから来たのですか?

4

1 に答える 1