標籤:
今天在操作android的時候,用到了資料庫的訪問,就在網上學習了一下關於資料庫的知識。其中訪問資料庫就是通過uri進行的,所以這裡總結下android uri的應用。
以下內容參考http://www.cnblogs.com/lingyun1120/archive/2012/04/18/2455212.html
通用資源標誌符(Universal Resource Identifier, 簡稱"URI")。
Uri代表要操作的資料,Android上可用的每種資源 - 映像、視頻片段等都可以用Uri來表示。
URI一般由三部分組成:
訪問資源的命名機制。
存放資源的主機名稱。
資源自身的名稱,由路徑表示。
Android的Uri由以下三部分組成: "content://"、資料的路徑、標示ID(可選)
舉些例子,如:
所有連絡人的Uri: content://contacts/people
某個連絡人的Uri: content://contacts/people/5
所有圖片Uri: content://media/external
某個圖片的Uri:content://media/external/images/media/4
我們來看一下android是如何管理多媒體檔案(音頻、視頻、圖片)的資訊。通過DDMS,我們在/data/data/com.android.providers.media下找到資料庫檔案
external.db 開啟 images 列表
具體操作如下
[email protected]_Y100:/data/data # cd com.android.providers.media[email protected]_Y100:/data/data/com.android.providers.media # lscachedatabaseslibshared_prefsdatabases/ <[email protected]_Y100:/data/data/com.android.providers.media/databases # lsexternal.dbexternal.db-shmexternal.db-walinternal.dbinternal.db-shminternal.db-wale3 external.db <SQLite version 3.7.11 2012-03-20 11:35:50Enter ".help" for instructionsEnter SQL statements terminated with a ";"sqlite> .tablesalbum_art audio_genres log album_info audio_genres_map search albums audio_genres_map_noid searchhelpertitle android_metadata audio_meta thumbnails artist_info audio_playlists video artists audio_playlists_map videothumbnails artists_albums_map files audio images sqlite> select * from images;84|/storage/sdcard0/DCIM/Camera/IMG_20150101_021647.jpg|1207033|IMG_20150101_021647.jpg|image/jpeg|IMG_20150101_021647|1420078609|1420078609||||||1420078607883|0|2289287690547999733|1509922574|Camera|1872|3328|||||||||||0|0|-1|0|0|0|0|0|0|0sqlite> .schema imagesCREATE VIEW images AS SELECT _id,_data,_size,_display_name,mime_type,title,date_added,date_modified,description,picasa_id,isprivate,latitude,longitude,datetaken,orientation,mini_thumb_magic,bucket_id,bucket_display_name,width,height,is_drm,drm_content_uri,drm_offset,drm_dataLen,drm_rights_issuer,drm_content_name,drm_content_description,drm_content_vendor,drm_icon_uri,drm_method,stereo_type,mpo_type,convergence,group_id,group_index,focus_value_high,focus_value_low,is_best_shot,group_count,is_mtk_3d FROM files WHERE media_type=1;sqlite>
我們把表格提取出來,如下
_id,_data,_size,_display_name,mime_type,title,date_added,date_modified,description,picasa_id,isprivate,latitude,longitude,datetaken,orientation,mini_thumb_magic,bucket_id,bucket_display_name,width,height,is_drm,drm_content_uri,drm_offset,drm_dataLen,drm_rights_issuer,drm_content_name,drm_content_description,drm_content_vendor,drm_icon_uri,drm_method,stereo_type,mpo_type,convergence,group_id,group_index,focus_value_high,focus_value_low,is_best_shot,group_count,is_mtk_3d FROM files WHERE media_type=1;84|/storage/sdcard0/DCIM/Camera/IMG_20150101_021647.jpg|1207033|IMG_20150101_021647.jpg|image/jpeg|IMG_20150101_021647|1420078609|1420078609||||||1420078607883|0|2289287690547999733|1509922574|Camera|1872|3328|||||||||||0|0|-1|0|0|0|0|0|0|0
可以看到檔案路徑(_data)和Uri的標示ID(_id)的對應關係。
代碼中使用
1.從URI獲得檔案路徑
string myImageUrl = "content://media/external/images/media/***";//字串轉化為uri Uri uri = Uri.parse(myImageUrl);//這個好像是訪問資料庫必須的,至於proj有什麼用,暫時不知道 String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor = this.ctx.managedQuery(uri,proj,null,null,null); //獲得所在列的id int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actualimagecursor.moveToFirst();//得到id對應的路徑 String img_path = actualimagecursor.getString(actual_image_column_index); File file = new File(img_path); Uri fileUri = Uri.fromFile(file);
2.由檔案路徑得到URI
Uri mUri = Uri.parse("content://media/external/images/media"); Uri mImageUri = null; Cursor cursor = managedQuery( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Images.Media.DEFAULT_SORT_ORDER); cursor.moveToFirst(); while (!cursor.isAfterLast()) { String data = cursor.getString(cursor .getColumnIndex(MediaStore.MediaColumns.DATA)); if (picPath.equals(data)) { int ringtoneID = cursor.getInt(cursor .getColumnIndex(MediaStore.MediaColumns._ID)); mImageUri = Uri.withAppendedPath(mUri, "" + ringtoneID); break; } cursor.moveToNext(); }
下面附上自己用到的一個執行個體,它多少反映了資料庫的操作吧
代碼如下
} else if ("downloads".equals(mFileUri.getAuthority())) { String[] proj={ "_data", "mimetype"}; Cursor cursor = managedQuery( mFileUri, proj, null, null, null); if ( null == cursor ) { return 2; } int pathColumnId = cursor.getColumnIndexOrThrow("_data"); int mimeColumnId = cursor.getColumnIndexOrThrow("mimetype"); if(!cursor.moveToFirst()){ return 2; } mFilePath = cursor.getString(pathColumnId); mMimeType = cursor.getString(mimeColumnId); android.util.Log.e("zhangshuli", "mFilePath==更改3"+mFilePath+mMimeType); } }
列印結果
mFilePath==更改3/storage/sdcard0/Download/IMG_20150402_124553.jpgimage/jpeg
SQL-android uri的使用(轉載)