一.命令行方式查找多媒体数据库:
1.启动模拟器或在Eclipse中Run一个应用到手机上。
2.cmd 启动命令提示符窗体,进入SDK目录中存放adb的路径:“cd D:\adt-bundle-windows-x86-20130219\sdk\platform-tools”
3.进入模拟器的linux系统:“adb shell”
4.列出Android所有的系统数据库所在的包:“ls /data/data/”
得到结果:
...
com.android.providers.media
...
5.查看多媒体数据库文件是否存在:“ls -l /data/data/com.android.providers.media/databases/”
得到结果:
external-c0070e03.db 是SD卡里的多媒体数据库文件
internal.db 是内存里的多媒体数据库文件
6.以external-c0070e03.db为当前scheme启动SQLITE3:“sqlite3 /data/data/com.android.providers.media/databases/external-c0070e03.db”
7.列出所有多媒体数据库的表:“.table”
得到结果:
album_art audio otherfile
album_info audio_genres search
albums audio_genres_map searchhelpertitle
android_metadata audio_meta thumbnails
artist_info audio_playlists video
artists audio_playlists_map videothumbnails
artists_albums_map images
8.显示images表的创建语句,查询表中的所有列名:“.schema images”
得到结果:
CREATE TABLE images (_id INTEGER PRIMARY KEY,_data TEXT,_size INTEGER,_display_n
ame TEXT,mime_type TEXT,title TEXT,date_added INTEGER,date_modified INTEGER,desc
ription TEXT,picasa_id TEXT,isprivate INTEGER,latitude DOUBLE,longitude DOUBLE,d
atetaken INTEGER,orientation INTEGER,mini_thumb_magic INTEGER,bucket_id TEXT,buc
ket_display_name TEXT);
9.列出images表中所有图片的路径:“SELECT _data FROM images;”
注:SQLite的命令行工具介绍:http://www.cnblogs.com/stephen-liu74/archive/2012/01/18/2325981.html
二. 代码方式对多媒体数据库的操作:
1.获得一个ContentResolver的实例,可通过Activity的成员方法getContentResovler()方法:
ContentResolver cr = this.getContentResolver();
2.使用query (Uri uri, String[] projection,String selection,String[] selectionArgs, String sortOrder)操作数据库:
uri是“content://”形式的URI,
projection是封装数据表中所需的列名数组,
selection是设置条件,相当于SQL语句中的where,
selectionArgs是要配合selection使用的,如果你在selection里面有?,那么你在selectionArgs写的数据就会替换掉?,
sortOrder是排序规则。
// 获取SD卡中的全部图片的路径列表 public List<String> queryGallery() { List<String> galleryList = new ArrayList<String>(); // 图片路径列表 List<String> imageFolderIds = new ArrayList<String>(); // 包含图片的文件夹ID列表 ContentResolver cr = getActivity().getContentResolver(); String[] columns = {Images.Media.DATA, // 图片绝对路径 Images.Media.BUCKET_ID, // 直接包含该图片文件的文件夹ID,防止在不同下的文件夹重名 Images.Media.BUCKET_DISPLAY_NAME, // 直接包含该图片文件的文件夹名 "COUNT(1) AS count" // 统计当前文件夹下共有多少张图片 }; String sortOrder = Images.Media.DATE_MODIFIED; //默认升序排列 Cursor cur = cr.query( Images.Media.EXTERNAL_CONTENT_URI, //MediaStore多媒体数据库中SD卡上的image数据表的uri columns, null, null, sortOrder); while (cur.moveToNext()) { int image_id_column = cur.getColumnIndex(Images.Media.DATA); int bucket_id_column = cur.getColumnIndex(Images.Media.BUCKET_ID); int bucket_name_column = cur.getColumnIndex(Images.Media.BUCKET_DISPLAY_NAME); int count_column = cur.getColumnIndex("count"); String image_path = cur.getString(image_id_column); //文件路径 int bucket_id = cur.getInt(bucket_id_column); //所在文件夹ID String bucket_name = cur.getString(bucket_name_column); //所在文件夹Name int count = cur.getInt(count_column); //当前文件夹下共有多少张图片 if(count > 1) { imageFolderIds.add(String.valueOf(bucket_id)); } else { galleryList.add(image_path); } } int folderCounts = imageFolderIds.size(); if( folderCounts > 0 ) { for ( int i = 0; i < folderCounts; ++i ) { String[] projection = {MediaStore.Images.Thumbnails.DATA}; cur = cr.query( Images.Media.EXTERNAL_CONTENT_URI, projection, Images.Media.BUCKET_ID + " = ?", //查询条件 new String[] {imageFolderIds.get(i)}, //查询条件中问号对应的值 sortOrder); while (cur.moveToNext()) { int image_id_column = cur.getColumnIndex(Images.Media.DATA); String image_path = cur.getString(image_id_column); //文件路径 galleryList.add(image_path); } } } if( null != cur && !cur.isClosed() ){ cur.close(); } return galleryList; }