在之前提供了小例子BookProvider,我们回过头看看如何将通过该Content Provider进行数据的读取。

(1)增加

private void addBook(String name ,String isbn,String author){ 
   /* 从ContentProvider的insert()方法的参数可以看到,通过ContentValues来进行数据的传递。ContentValues是key/values对,可以存储多个组,非常适合传递信息 */ 
   ContentValues cv = new ContentValues(); 
    cv.put(BookTableMetaData.BOOK_NAME, name); 
    cv.put(BookTableMetaData.BOOK_ISBN, isbn); 
    cv.put(BookTableMetaData.BOOK_AUTHOR, author); 
    /* ContentResolver负责将URI reference解析到正确的provider上,并对该provider的公开的读写接口进行操作。它的方法和provider提供的方法一一对应,并增加了uri参数。*/ 
   ContentResolver cr = getContentResolver(); 
    Uri insertUri = cr.insert(BookProviderMetaData.BookTableMetaData.CONTENT_URI, cv); //对应BookProvider的insert() 
}

(2)删除

private void delBook(String name){ 
   ContentResolver cr = getContentResolver(); 
    int count = cr.delete(BookProviderMetaData.BookTableMetaData.CONTENT_URI,    /* Uri          uri */ 
                     BookTableMetaData.BOOK_NAME + "=?",                    /* String         WhereClause */ 
                     new String[]{name});                                                        /* String[]        selectionArgs */ 
}

(3)修改: update和insert非常相似,也是通过ContentValues传递修改内容。

private void updateBookIsbn(String name ,String newIsbn,String newAuthor){ 
    ContentValues cv = new ContentValues(); 
    cv.put(BookTableMetaData.BOOK_NAME, name); 
    cv.put(BookTableMetaData.BOOK_ISBN, newIsbn); 
    cv.put(BookTableMetaData.BOOK_AUTHOR, newAuthor); 
    
    ContentResolver cr = getContentResolver(); 
    int count = cr.update(BookProviderMetaData.BookTableMetaData.CONTENT_URI,
     /* Uri        uri */ 
                      cv,                                                                               /* ContentValues  values */ 
                      BookTableMetaData.BOOK_NAME + "=?",            /* String           WhereClause */ 
                      new String[]{name});                                                /* String[]         selectionArgs */ 
}

(4)查询

private void showBooks(){ 
    Uri uri = BookProviderMetaData.BookTableMetaData.CONTENT_URI; 
     /*方式一,通过managedQuery( )*/ 
    @SuppressWarnings("deprecation") 
    Cursor c = managedQuery(uri, null, null, null, null); 
    /* 方式二:利用ContentResolver的query来获取*/ 
    // ContentResolver cr = getContentResolver(); 
    // Cursor c = cr.query(uri, null, null, null, null); 
    int iIndex = c.getColumnIndex(BookTableMetaData._ID); 
    int iName = c.getColumnIndex(BookTableMetaData.BOOK_NAME); 
    int iIsbn = c.getColumnIndex(BookTableMetaData.BOOK_ISBN); 
    int iAuthor = c.getColumnIndex(BookTableMetaData.BOOK_AUTHOR);

/* 需要注意,通过下面showInfo显示,各列的Id并非按我们的创建table的列的顺序,所以一定要先获取列的ID。至于row的_id,是按顺序提供,为当前最大的_id+1。但除非我们能很明确清楚,一般不使用这些系统内部安排的Id */ 
    showInfo("ColumnIndex _id=" + iIndex + ",name=" + iName + ",isdn=" + iIsbn + ", author=" + iAuthor); 
    showInfo("Totle books : " + c.getCount()); 
    for(c.moveToFirst(); !c.isAfterLast();c.moveToNext()){ 
        String id = c.getString(iIndex); 
        String name = c.getString(iName); 
        String isbn = c.getString(iIsbn); 
        String author = c.getString(iAuthor); 
        showInfo("[" +id + "]" + "\t" + name + "\t" + isbn  + "\t" + author); 
    } 
    c.close(); 
}

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

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

【转】Pro Android学习笔记(八):了解Content Provider(下中)的更多相关文章

  1. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

  2. 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib

    目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...

  3. 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享

    目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...

  4. 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目

    目录(?)[-] 什么是lib项目 小例子 Lib的实现 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...

  5. 【转】 Pro Android学习笔记(十九):用户界面和控制(7):ListView

    目录(?)[-] 点击List的item触发 添加其他控件以及获取item数据 ListView控件以垂直布局方式显示子view.系统的android.app.ListActivity已经实现了一个只 ...

  6. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  7. 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode

    目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...

  8. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  9. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  10. 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

    目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...

随机推荐

  1. require.js vs browserify

    require.js vs browserify require.js是模块加载器:browserify是预编译工具 require.js遵循的是AMD规范:browserify遵循的是CommonJ ...

  2. Apache Shiro 使用手册(三)Shiro 授权(转发:http://kdboy.iteye.com/blog/1155450)

    授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等. 一.授权的三要素 授权有着三 ...

  3. vim vimdiff diff 使用及命令

    vim: vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口. 之前的版本虽然也有多文件编辑功能, 但是总之不如这个方便啦.用法::tabnew [++opt选项] [+cmd] 文件  ...

  4. ubuntu下android studio生成的unaligned apk的zipalign处理

    在ubuntu系统中使用android studio生成的apk文件始终都是unaligned apk, 在bulid.gradle中设置如下设置后,还是同样生成的是unaligned apk. mi ...

  5. 使用Nginx后如何在web应用中获取用户ip及原理解释

    当nginx作为反向代理功能时,转发请求到后端服务器 通常需要使用如下命令为转发的请求增加请求头 X-Forwarded-For proxy_set_header X-Forwarded-For &q ...

  6. electron—Chromium有酒,Node有肉

    谷歌V8引擎的出现,Node.js的诞生注定要把开发模式“搅乱”. 基于云应用,服务化,定制化的应用需求不断增加后使得传统的winform开发空间越来越小,而原来做前端的空间越来越大,Node.js ...

  7. 英语发音规则---oo

    英语发音规则---oo 一.总结 一句话总结: 1.重读音节词尾的字母组合oo发音素[u:]的音? too [tu:] adv.太;也 zoo [zu:] n.动物园 room [ru:m] n.房间 ...

  8. 自定义响应结构 AjaxResult()

    package com.dsj.gdbd.utils.ajax; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxm ...

  9. winform 中的Anchor 和 Dock 属性设置

    在设计窗体时,这两个属性特别有用,如果用户认为改变窗口的大小并不容易,应确保窗口看起来不显得很乱,并编写许多代码行来达到这个目的,许多程序解决这个问题是地,都是禁止给窗口重新设置大小,这显然是解决问题 ...

  10. C++(二)— STL容器的基本用法

    1.vector基本操作 关于vector简单的讲就是一个动态增长的数组,里面有一个指针指向一片连续的内存空间,当空间装不下的时候会自动申请一片更大的空间(空间配置器)将原来的数据拷贝到新的空间,然后 ...