3

いくつかの曲をプレイリスト (アプリケーション データベース) に保存しています。プレイリストに既に存在する SD カードから特定の曲を削除した場合、変更をデータベースに反映するにはどうすればよいですか?

4

1 に答える 1

4

FileObserverの使用を検討する

単一のファイルまたはディレクトリのいずれかを監視できます。したがって、曲を保存しているディレクトリを特定し、それぞれを監視する必要があります。それ以外の場合は、外部ストレージ ディレクトリを監視し、何かが変更されるたびに、データベース内のファイルの 1 つであるかどうかを確認できます。

それは本当に簡単に機能します。次のようなものが機能するはずです:

import android.os.FileObserver;
public class SongDeletedFileObserver extends FileObserver {
    public String absolutePath;
    public MyFileObserver(String path) {
        //not sure if you need ALL_EVENTS but it was the only one in the doc listed as a MASK
        super(path, FileObserver.ALL_EVENTS);
        absolutePath = path;
    }
    @Override
    public void onEvent(int event, String path) {
        if (path == null) {
            return;
        }
        //a new file or subdirectory was created under the monitored directory
        if ((FileObserver.DELETE & event)!=0) {
            //handle deleted file
        }

        //data was written to a file
        if ((FileObserver.MODIFY & event)!=0) {
            //handle modified file (maybe id3 info changed?)
        }

        //the monitored file or directory was deleted, monitoring effectively stops
        if ((FileObserver.DELETE_SELF & event)!=0) {
           //handle when the whole directory being monitored is deleted
        }

        //a file or directory was opened
        if ((FileObserver.MOVED_TO & event)!=0) {
           //handle moved file
        }

        //a file or subdirectory was moved from the monitored directory
        if ((FileObserver.MOVED_FROM & event)!=0) {
            //?
        }

        //the monitored file or directory was moved; monitoring continues
        if ((FileObserver.MOVE_SELF & event)!=0) {
            //?
        }

    }
}

もちろん、この FileObserver を有効にするには、この FileObserver を常に実行しておく必要があるため、サービスに入れる必要があります。あなたがするであろうサービスから

SongDeletedFileObserver fileOb = new SongDeletedFileObserver(Environment.getExternalStorageDirectory());

これには、覚えておく必要があるいくつかのトリッキーなことがあります。

  1. これは、常に実行している場合、バッテリーの消耗が悪化します..
  2. SDカードがマウントされたとき(および再起動時)に同期する必要があります。これは遅いかもしれません
于 2012-07-19T07:19:12.857 に答える