zoukankan      html  css  js  c++  java
  • 【转】Pro Android学习笔记(九):了解Content Provider(下下)

    Content provider作为信息的读出,比较常见的还有文件的读写,最基础的就是二进制文件的的读写,例如img文件,音频文件的读写。在数据库中存放了该文件的路径,我们可以通过ContentProvider获得InputSream和OutputStream,实现对文件的操作。Pro Android 4.0提及有关内容,但语焉不详,可同时参考http://www.grokkingandroid.com/handling-binary-data-with-contentproviders/,也可同时参考阅读的源代码,通过eclipse下载源代码,具体是sdksourcesandroid-17androidcontentContentProvider.java。

    本笔记仍以BookProvider为例。

    在数据库中存放文件路径

    从ContentProvider的源代码注释中可知:Android会自动从uri的一个名为_data的列中获取文件路径。也就是Android在数据库表格中预留了列名_data,专门用于存放文件路径。和_id不同,_data不属于处理SQLite数据库表格BaseColumns类,也就是系统不会预留_data列,需要我们进行人工处理。

    处理包括在provider描述中,为该表格增加_data的列:

    [java] view plaincopy
     
    1. public class BookProviderMetaData {  
    2.     ......  
    3.     //由于我们要更新数据库,所以数据库的版本需要提升     
    4.     public static final int DATABASE_VERSION = 3;     
    5.       
    6.     public static final class BookTableMetaData implements BaseColumns{  
    7.         ......  
    8.         public static final String FILE_NAME = "_data";  
    9.     }  
    10. }  

    处理还包括在BookProvider中projectMap的映射关系:

    [java] view plaincopy
     
    1. sBooksProjectionMap.put(BookTableMetaData.FILE_NAME, BookTableMetaData.FILE_NAME);  

    还有所涉及的增改查等内容。如果文件位于外接SD卡,还需要在AndriodManifest.xml中声明对SD卡具备读写权限。

    重写openFile()方法

    在源代码中,openFile()如下:

    [java] view plaincopy
     
    1. public ParcelFileDescriptor openFile(Uri uri, String mode)  
    2.         throws FileNotFoundException {  
    3.     throw new FileNotFoundException("No files supported by provider at "  
    4.             + uri);  
    5. }  

    即永远会抛出一个异常:FileNotFoundException,必须对之重写。

    [java] view plaincopy
     
    1. @Override  
    2. public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {  
    3.     if(sUriMatch.match(uri) != BOOK_ITEM_URI_INDICATION)  
    4.         throw new IllegalArgumentException ("URI invalid. Use an id-based URI only.");  
    5.        /* 在代码或者reference,清晰写明:Convenience for subclasses that wish to implement openFile(Uri, String) by looking up  
    6.          * a column named "_data" at the given URI. 
    7.          * 简单地,在进行了uri的合法判断后,只需返回openFileHelper就可以。*/  
    8.     return openFileHelper(uri, mode);  
    9. }  

    如何通过Content Provider进行文件读写

    对于某个已的item的uri,获取二进制文件读写非常方便,如下所示

    [java] view plaincopy
     
    1. try{  
    2.     OutputStream file = getContentResolver().openOutputStream(uri);  
    3.     ... ... //写处理  
    4.     file.close();  
    5. }catch (Exception e){  
    6.     Log.e(“pro”,e.toString());  
    7. }  
    8.   
    9. try{  
    10.     InputStream in = getContentResolver().openInputStream(uri);  
    11.     ... ... //读处理  
    12.     in.close();  
    13. }catch (Exception e){  
    14.     Log.e(“pro”,e.toString());  
    15. }  

    相关链接: 我的Android开发相关文章

    转自http://blog.csdn.net/flowingflying/article/details/9244521

  • 相关阅读:
    Educational Codeforces Round 14
    2016 Multi-University Training Contest 4
    2016 Multi-University Training Contest 2
    Codeforces
    BZOJ1776
    Codeforces Round #261 (Div. 2)
    String Painter, Chengdu 2008, LA4394
    Codeforces Round #239 (Div. 1)C, 407C
    python语句和语法
    Python快速入门——容易忽略的技巧
  • 原文地址:https://www.cnblogs.com/blongfree/p/5047569.html
Copyright © 2011-2022 走看看