• Android开发(7)数据库和Content Provider



    问题聚焦:
    思想:应用程序数据的共享
    对数据库的访问仅限于创建它的应用程序,但是事情不是绝对的
    Content Provider提供了一个标准的接口,可供其他应用程序访问和使用其他程序的数据

    下面我们由下向上来分析ContentProvider的处理流程:
    1 数据库——SQLite
    使用者:ContentProvider
    映射:Content Value映射为数据库中的表的一行;
    查询:Cursor,底层数据中的结果集的指针;
    使用:SQLiteOpenHelper,抽象类,用于实现创建、打开和升级数据库
    继承该类,重写其构造函数,onCreate方法(创建)和onUpgrade方法(更新)
    访问:getWritableDatabase方法(获得可写的数据库实例)和getReadableDatabase方法(获取只读的数据库实例)

    Demo

    /** 插入新行 **/
    
    // 创建要插入的一行新值
    ContentValues newValues = new ContentValues();
    
    //为每一个字段赋值
    newValues.put(NAME_COLUMN, _name);
    newValues.put(ADDRESS_COLUMN, _address);
    ......
    
    //插入到数据库中
    SQLiteDatabase db = DBOpenHelper.getWritableDatabase();
    db.insert(DBOpenHelper.DATABASE_TABLE, null, newValues);


    2 Content Provider
    使用者:自身为独立的APP
    作用:将使用数据的应用程序组件和底层的数据源分离
    使用:ContentProvider,抽象类,继承该类,并重写方法:
    • onCreate(): 初始化底层的数据源
    • query()
    • update()
    • delete()
    • insert()
    • getType()
    注册:通过标记实现,name属性+authorities标记
    demo: 
        <provider android:name="ArticlesProvider"
                  android:authorities="shy.luo.providers.articles">
       </provider>
    发布:URI
            demo:
                public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/item");
                public static final Uri CONTENT_POS_URI = Uri.parse("content://" + AUTHORITY + "/pos");
    使用:应用程序通过ContentResolver与ContentProvider交互

    3 ContentResolver——使用ContentProvider
    使用者:应用程序
    作用:应用程序通过它来查询和操作Content Provdier
    特点:ContentProvider提供了底层数据的抽象
    ContentResolver提供了查询和处理ContentProvider的抽象
    使用:通过URI交互
    Demo

    /** 查询操作 **/ 
    public Article getArticleById(int id) {
     Uri uri = ContentUris.withAppendedId(Articles.CONTENT_URI, id);
    
     String[] projection = new String[] {
     Articles.ID,
     Articles.TITLE,
     Articles.ABSTRACT,
     Articles.URL
     };
    
     Cursor cursor = resolver.query(uri, projection, null, null, Articles.DEFAULT_SORT_ORDER);   // 获取一个数据库的游标
    
     Log.i(LOG_TAG, "cursor.moveToFirst");
    
     if (!cursor.moveToFirst()) {
     return null;
     }
    
     String title = cursor.getString(1);
     String abs = cursor.getString(2);
     String url = cursor.getString(3);
    
     return new Article(id, title, abs, url);
     }


    4 URI
    Uri代表了要操作的数据
    格式:content:// 主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
    路径(path)可以用来表示我们要操作的数据

    5 小结:
    一张图概括一下这章的内容:

    ContentProvider作为一个独立的APP
    • 与下层的数据源进行交互,使用SQLiteOpenHelper类
    • 与上层的应用程序进行教书,使用ContentResolver类+URI

    参考文档:
    《Android系统源代码情景分析》
    《Android高级编程3rd》
     ContentProvider和Uri详解: http://www.cnblogs.com/linjiqin/archive/2011/05/28/2061396.html

  • 相关阅读:
    Asp.Net开发小技巧汇总
    .net缓存
    C# .Net 2.0实例学习:WebBrowser页面与WinForm交互技巧(二)
    字符和数组
    jvm调优原则
    ASP.NET页面刷新的实现方法
    js禁止右键和复制功能
    动态定义SL DataGrid Columns [转]
    DataGrid 内嵌ComboBox动态数据联动
    C#对象序列化(2)
  • 原文地址:https://www.cnblogs.com/suzhou/p/3638964.html
Copyright © 2020-2023  润新知