zoukankan      html  css  js  c++  java
  • SQL-android uri的使用(转载)

    今天在操作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 列表

    具体操作如下

    root@Aurora_Y100:/data/data # cd com.android.providers.media
    root@Aurora_Y100:/data/data/com.android.providers.media # ls
    cache
    databases
    lib
    shared_prefs
    databases/                                                                    <
    root@Aurora_Y100:/data/data/com.android.providers.media/databases # ls
    external.db
    external.db-shm
    external.db-wal
    internal.db
    internal.db-shm
    internal.db-wal
    e3 external.db                                                                <
    SQLite version 3.7.11 2012-03-20 11:35:50
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> .tables
    album_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|0
    sqlite> .schema images
    CREATE 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
  • 相关阅读:
    BIOS详解:什么是BIOS ?BIOS的作用?CMOS及其与BIOS的关系?
    随机数不随机
    解决hexo神烦的DTraceProviderBindings MODULE_NOT_FOUND
    保护模式特权级别DPL,RPL,CPL 之间的联系和区别
    Linux内核 hlist_head/hlist_node结构解析
    x86中的页表结构和页表项格式
    Linux下/proc目录简介
    bdev文件系统
    X86 IO端口和MMIO
    Mac OS Alfred 2 tips
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_uri_150403140.html
Copyright © 2011-2022 走看看