前期問題
起初是爲了實現一個簡易的音樂播放,但是在網上看到帖子後普遍使用getContentResolver().query()的方法來獲取數據庫中的音頻數據。
數據庫的地址是 com.android.providers.media
這裏作爲萌新,看到有幾點不是很清楚:
1、com.android.providers.media數據庫存放的是什麼?
2、我想調用的音樂文件應該放在哪?
3、音頻文件和數據庫是怎麼關聯的?
關於Content Providers的解釋(根據網上解釋以及自己的理解)
Android通過Content Providers將公共數據類型(音頻、視頻、圖像、聯繫人信息等)整合到數據庫中,儲存地址和基本信息。
文件存放位置
我試着在文件目錄中存放/storage/sdcard0中存放數據,我隨便選取了幾首MP3
當我打開模擬器的文件管理器,然後看見mp3在文件主目錄中,沒有存到任何一個子文件夾,我重啓模擬器,然後導出com.android.providers.media下的external.db,並沒有看到自己想看到的數據,於是我將模擬器的mp3轉存到子文件夾中,然後重啓模擬器,並重新導出目標external.db,可以看到自己存放的資源已經被搜索並更新到數據庫中截圖如下:
小結
- 可能是模擬器的緣故,需要重啓才能更新external.db,同時沒能更新在首目錄中的資源,但是放在子文件中的資源都能夠搜索到並添加到external.db中。也就是當我們往手機上放圖片或者音樂的時候,會在該database中存放圖片或者音樂的信息,而我們的應用程序是能夠通過ContentResolver去讀取到這些數據的。
利用ContentResolver.query()讀取數據
根據Android文檔,該方法的參數如下
1. 從數據庫中獲取數據(以下代碼以從sd卡中讀取mp3數據爲例)
public final Cursor query (Uri uri, //Url,即查詢路徑
String[] projection, //查詢時希望獲得的列,如果填null,則返回所有列
String selection, //查詢時的條件,select語句中where用到,可填null
String[] selectionArgs, //查詢條件屬性值
String sortOrder, //查詢到的數據的默認排序,null則不進行排序
)
示例:
Cursor mCursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, //路徑
new String[]{MediaStore.Audio.Media._ID, //寫入我想要獲得的信息(列)
MediaStore.Audio.Media.TITLE,
MediaStore.Audio.Media.ALBUM,
MediaStore.Audio.Media.DISPLAY_NAME,
MediaStore.Audio.Media.ARTIST,
MediaStore.Audio.Media.DURATION,
MediaStore.Audio.Media.SIZE,
MediaStore.Audio.Media.DATA}, null, null, null);
2. 將cursor中的數據轉存到事先定義好的List中
List<MusicInfo> mMusicInfos = new ArrayList<>();
for (int i = 0; i < mCursor.getCount(); ++i) {
MusicInfo musicInfo = new MusicInfo(); //MusicInfo類是數據儲存單元
mCursor.moveToNext(); //讀取下一行,moveToNext()有boolean返回值,執行成功返回ture,反之false,可用於判斷是否讀取完畢。
long id = mCursor.getLong(0);
String title = mCursor.getString(1);
String album = mCursor.getString(2);
String displayName = mCursor.getString(3);
String artist = mCursor.getString(4);
long duration = mCursor.getLong(5);
long size = mCursor.getLong(6);
String url = mCursor.getString(7); //轉存數據
musicInfo.setTitle(title);
musicInfo.setId(id);
musicInfo.setAlbum(album);
musicInfo.setArtist(artist);
musicInfo.setSize(size);
musicInfo.setDisplayName(displayName);
musicInfo.setDuration(duration);
musicInfo.setUrl(url); //存到數據單元
mMusicInfos.add(musicInfo); //添加到List
}
這就成功實現了將數據讀取並存到List中
注意
別忘了在AndroidManifest.xml中添加讀取sd卡的權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>