Android 总结:ContentProvider 的使用

<div class="markdown_views"><h3 id="一概述"><a name="t0"></a>一、概述</h3>


<p>ContentProvider:为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。 <br>
<a href="http://lib.csdn.net/base/android" class="replace_word" title="Android知识库" target="_blank" style="color:#df3434; font-weight:bold;">Android</a>内置的许多数据都是使用ContentProvider形式,供开发者调用的 (如视频,音频,图片,通讯录等)。 <br>
1. 使用表的形式来组织数据 <br>
 - 无论数据来源是什么,ContentProvider都会认为是一种表。(把数据组织成表格) <br>
2. 提供的方法 <br>
 - query:查询 <br>
 - insert:插入 <br>
 - update:更新 <br>
 - delete:删除 <br>
 - getType:得到数据类型 <br>
 - onCreate:创建数据时调用的回调函数 <br>
3. 公共的URI <br>
 - 每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。 <br>
 - Android所提供的ContentProvider都存放在android.provider包当中。 <br>
4. 对比分析 <br>
虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同。 <br>
 - 采用文件方式对外共享数据,需要进行文件操作读写数据; <br>
 - 采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。 <br>
 - 使用ContentProvider共享数据的好处是统一了数据访问方式。</p>


<h3 id="二contentprovider-的实现步骤"><a name="t1"></a>二、ContentProvider 的实现步骤</h3>


<h4 id="1-定义一个-contenturi-常量"><a name="t2"></a>1. 定义一个 CONTENT_URI 常量</h4>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering">   <span class="hljs-comment">// CONTENT_URI 的字符串必须是唯一</span>
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Uri CONTENT_URI = Uri.parse(<span class="hljs-string">"content://com.WangWeiDa.MyContentprovider"</span>);
  <span class="hljs-comment">// 如果有子表,URI为:</span>
  <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Uri CONTENT_URI = Uri.parse(<span class="hljs-string">"content://com.WangWeiDa.MyContentProvider/users"</span>);</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul></pre>






<h4 id="2-定义一个继承自contentprovider的类"><a name="t3"></a>2. 定义一个继承自ContentProvider的类</h4>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering">    <span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyContentProvider</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ContentProvider</span> {</span> ... }</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering"><li>1</li></ul></pre>






<h4 id="3-实现contentprovider的所有方法"><a name="t4"></a>3. 实现ContentProvider的所有方法</h4>


<p>为ContentProvider提供一个常量类 MyContentProviderMetaData.<a href="http://lib.csdn.net/base/javase" class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a></p>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyContentProviderMetaData</span> {</span>
   <span class="hljs-comment">//URI的指定,此处的字符串必须和声明的authorities一致</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String AUTHORITIES = <span class="hljs-string">"com.zhuanghongji.app.MyContentProvider"</span>;
   <span class="hljs-comment">//数据库名称</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String DATABASE_NAME = <span class="hljs-string">"myContentProvider.db"</span>;
   <span class="hljs-comment">//数据库的版本</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> DATABASE_VERSION = <span class="hljs-number">1</span>;
   <span class="hljs-comment">//表名 </span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String USERS_TABLE_NAME = <span class="hljs-string">"user"</span>;
   
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">UserTableMetaData</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">BaseColumns</span>{</span>
       <span class="hljs-comment">//表名</span>
       <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TABLE_NAME = <span class="hljs-string">"user"</span>;
       <span class="hljs-comment">//访问该ContentProvider的URI</span>
       <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Uri CONTENT_URI = Uri.parse(<span class="hljs-string">"content://"</span> + AUTHORITIES + <span class="hljs-string">"/user"</span>);
       <span class="hljs-comment">//该ContentProvider所返回的数据类型的定义</span>
       <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String CONTENT_TYPE = <span class="hljs-string">"vnd.android.cursor.dir/vnd.myprovider.user"</span>;
       <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String CONTENT_TYPE_ITEM = <span class="hljs-string">"vnd.android.cursor.item/vnd.myprovider.user"</span>;
       <span class="hljs-comment">//列名</span>
       <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String USER_NAME = <span class="hljs-string">"name"</span>;
       <span class="hljs-comment">//默认的排序方法</span>
       <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String DEFAULT_SORT_ORDER = <span class="hljs-string">"_id desc"</span>;
   }
  
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li></ul></pre>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyContentProvider</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ContentProvider</span> {</span>
   <span class="hljs-comment">//访问表的所有列</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> INCOMING_USER_COLLECTION = <span class="hljs-number">1</span>;
   <span class="hljs-comment">//访问单独的列</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span> INCOMING_USER_SINGLE = <span class="hljs-number">2</span>;
   <span class="hljs-comment">//操作URI的类</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> UriMatcher uriMatcher;
   <span class="hljs-comment">//为UriMatcher添加自定义的URI</span>
   <span class="hljs-keyword">static</span>{
       uriMatcher = <span class="hljs-keyword">new</span> UriMatcher(UriMatcher.NO_MATCH);
       uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,<span class="hljs-string">"/user"</span>,
           INCOMING_USER_COLLECTION);
       uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,<span class="hljs-string">"/user/#"</span>,
           INCOMING_USER_SINGLE);
   }
   
   <span class="hljs-keyword">private</span> DatabaseHelper dh;
   <span class="hljs-comment">//为数据库表字段起别名</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> HashMap userProjectionMap;
   <span class="hljs-keyword">static</span>
   {
       userProjectionMap = <span class="hljs-keyword">new</span> HashMap();
       userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
       userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
   }
   <span class="hljs-javadoc">/**
   * 删除表数据
   */</span>
   <span class="hljs-annotation">@Override</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">delete</span>(Uri uri, String selection, String[] selectionArgs) {
       System.out.println(<span class="hljs-string">"delete"</span>);
       <span class="hljs-comment">//得到一个可写的数据库</span>
       SQLiteDatabase db = dh.getWritableDatabase();
       <span class="hljs-comment">//执行删除,得到删除的行数</span>
       <span class="hljs-keyword">int</span> count = db.delete(UserTableMetaData.TABLE_NAME, selection, selectionArgs);
       
       <span class="hljs-keyword">return</span> count;
   }
   
   <span class="hljs-javadoc">/**
   * 数据库访问类型
   */</span>
   <span class="hljs-annotation">@Override</span>
   <span class="hljs-keyword">public</span> String <span class="hljs-title">getType</span>(Uri uri) {
       System.out.println(<span class="hljs-string">"getType"</span>);
       <span class="hljs-comment">//根据用户请求,得到数据类型</span>
       <span class="hljs-keyword">switch</span> (uriMatcher.match(uri)) {
           <span class="hljs-keyword">case</span> INCOMING_USER_COLLECTION:
               <span class="hljs-keyword">return</span> MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE;
           <span class="hljs-keyword">case</span> INCOMING_USER_SINGLE:
               <span class="hljs-keyword">return</span> MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE_ITEM;
           <span class="hljs-keyword">default</span>:
               <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> IllegalArgumentException(<span class="hljs-string">"UnKnown URI"</span>+uri);
       }
   }
   
   <span class="hljs-javadoc">/**
   * 插入数据
   */</span>
   <span class="hljs-annotation">@Override</span>
   <span class="hljs-keyword">public</span> Uri <span class="hljs-title">insert</span>(Uri uri, ContentValues values) {
       <span class="hljs-comment">//得到一个可写的数据库</span>
       SQLiteDatabase db = dh.getWritableDatabase();
       <span class="hljs-comment">//向指定的表插入数据,得到返回的Id</span>
       <span class="hljs-keyword">long</span> rowId = db.insert(UserTableMetaData.TABLE_NAME, <span class="hljs-keyword">null</span>, values);
       <span class="hljs-keyword">if</span>(rowId &gt; <span class="hljs-number">0</span>){ <span class="hljs-comment">// 判断插入是否执行成功</span>
           <span class="hljs-comment">//如果添加成功,利用新添加的Id和</span>
           Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
           <span class="hljs-comment">//通知监听器,数据已经改变</span>
           getContext().getContentResolver().notifyChange(insertedUserUri, <span class="hljs-keyword">null</span>);   
           <span class="hljs-keyword">return</span> insertedUserUri;
       }   
       <span class="hljs-keyword">return</span> uri;
   }
   
   <span class="hljs-javadoc">/**
   * 创建ContentProvider时调用的回调函数
   */</span>
   <span class="hljs-annotation">@Override</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onCreate</span>() {
       System.out.println(<span class="hljs-string">"onCreate"</span>);
       <span class="hljs-comment">//得到数据库帮助类</span>
       dh = <span class="hljs-keyword">new</span> DatabaseHelper(getContext(),MyContentProviderMetaData.DATABASE_NAME);
       <span class="hljs-keyword">return</span> <span class="hljs-keyword">false</span>;
   }
   
   <span class="hljs-javadoc">/**
   * 查询数据库
   */</span>
   <span class="hljs-annotation">@Override</span>
   <span class="hljs-keyword">public</span> Cursor <span class="hljs-title">query</span>(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
       <span class="hljs-comment">//创建一个执行查询的Sqlite</span>
       SQLiteQueryBuilder qb = <span class="hljs-keyword">new</span> SQLiteQueryBuilder();
       <span class="hljs-comment">//判断用户请求,查询所有还是单个</span>
       <span class="hljs-keyword">switch</span>(uriMatcher.match(uri)){
           <span class="hljs-keyword">case</span> INCOMING_USER_COLLECTION:
               <span class="hljs-comment">//设置要查询的表名</span>
               qb.setTables(UserTableMetaData.TABLE_NAME);
               <span class="hljs-comment">//设置表字段的别名</span>
               qb.setProjectionMap(userProjectionMap);
               <span class="hljs-keyword">break</span>;
           <span class="hljs-keyword">case</span> INCOMING_USER_SINGLE:
               qb.setTables(UserTableMetaData.TABLE_NAME);
               qb.setProjectionMap(userProjectionMap);
               <span class="hljs-comment">// 追加条件,getPathSegments()得到用户请求的Uri地址截取的数组,</span>
               <span class="hljs-comment">// get(1)得到去掉地址中/以后的第二个元素</span>
               qb.appendWhere(UserTableMetaData._ID + <span class="hljs-string">"="</span> + uri.getPathSegments().get(<span class="hljs-number">1</span>));
               <span class="hljs-keyword">break</span>;
       }
       <span class="hljs-comment">//设置排序</span>
       String orderBy;
       <span class="hljs-keyword">if</span>(TextUtils.isEmpty(sortOrder)){
           orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
       } <span class="hljs-keyword">else</span> {
           orderBy = sortOrder;
       }
       <span class="hljs-comment">//得到一个可读的数据库</span>
       SQLiteDatabase db = dh.getReadableDatabase();
       <span class="hljs-comment">//执行查询,把输入传入</span>
       Cursor c = qb.query(db, projection, selection, selectionArgs, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, orderBy);
       <span class="hljs-comment">//设置监听</span>
       c.setNotificationUri(getContext().getContentResolver(), uri);
       <span class="hljs-keyword">return</span> c;
   }
   
   <span class="hljs-javadoc">/**
   * 更新数据库
   */</span>
   <span class="hljs-annotation">@Override</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">update</span>(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {
       System.out.println(<span class="hljs-string">"update"</span>);
       <span class="hljs-comment">//得到一个可写的数据库</span>
       SQLiteDatabase db = dh.getWritableDatabase();
       <span class="hljs-comment">//执行更新语句,得到更新的条数</span>
       <span class="hljs-keyword">int</span> count = db.update(UserTableMetaData.TABLE_NAME, values, selection, selectionArgs);
       <span class="hljs-keyword">return</span> count;
   }
  
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li><li>117</li><li>118</li><li>119</li><li>120</li><li>121</li><li>122</li><li>123</li><li>124</li><li>125</li><li>126</li><li>127</li><li>128</li><li>129</li><li>130</li><li>131</li><li>132</li><li>133</li><li>134</li><li>135</li><li>136</li><li>137</li><li>138</li><li>139</li><li>140</li><li>141</li></ul></pre>






<h4 id="4-在androidminifestxml中进行声明"><a name="t5"></a>4. 在AndroidMinifest.xml中进行声明</h4>






<pre class="prettyprint" name="code"><code class="hljs xml has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">provider</span> 
    <span class="hljs-attribute">android:name</span>=<span class="hljs-value">".MyContentProvider"</span>
   <span class="hljs-attribute">android:authorities</span>=<span class="hljs-value">"com.zhuanghongji.app.MyContentProvider"</span> /&gt;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul></pre>






<h3 id="三另外一个实例说明"><a name="t6"></a>三、另外一个实例说明</h3>


<h4 id="1-uri类简介"><a name="t7"></a>1. Uri类简介</h4>


<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">Uri uri = Uri<span class="hljs-preprocessor">.parse</span>(<span class="hljs-string">"content://com.changcheng.provider.contactprovider/contact"</span>)</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li></ul></pre>


<p>在Content Provider中使用的查询字符串有别于标准的SQL查询。 <br>
诸如select, add, delete, modify等操作我们都使用一种特殊的URI来进行,这种URI由3个部分组成:</p>


<ul>
<li>“content://”</li>
<li>代表数据的路径,</li>
<li>一个可选的标识数据的ID</li>
</ul>






<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">     content:<span class="hljs-comment">//media/internal/images  这个URI将返回设备上存储的所有图片</span>
     content:<span class="hljs-comment">//contacts/people/       这个URI将返回设备上的所有联系人信息</span>
     content:<span class="hljs-comment">//contacts/people/45     这个URI返回单个结果(联系人信息中ID为45的联系人记录)</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul></pre>


<p>尽管这种查询字符串格式很常见,但是它看起来还是有点令人迷惑。 <br>
为此,Android提供一系列的帮助类(在<code>android.provider包</code>下),里面包含了很多以类变量形式给出的查询字符串,这种方式更容易让我们理解一点,因此,如上面 <code>content://contacts/people/45</code> 这个URI就可以写成如下形式:</p>






<pre class="prettyprint" name="code"><code class="language-java hljs  has-numbering">    Uri person = ContentUris.withAppendedId(People.CONTENT_URI,  <span class="hljs-number">45</span>);</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li></ul></pre>


<p>然后执行数据查询:</p>






<pre class="prettyprint" name="code"><code class="hljs cs has-numbering">    Cursor cursor = managedQuery(person, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>);</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li></ul></pre>


<p>这个查询返回一个包含所有数据字段的游标,我们可以通过迭代这个游标来获取所有的数据。</p>






<h4 id="2-范例"><a name="t8"></a>2. 范例</h4>


<p>如何依次读取联系人信息表中的指定数据列name和number。</p>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ContentProviderDemo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        displayRecords();
    }


    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">displayRecords</span>() {
        <span class="hljs-comment">//该数组中包含了所有要返回的字段</span>
        String columns[] = <span class="hljs-keyword">new</span> String[] { People.NAME, People.NUMBER };
        Uri mContacts = People.CONTENT_URI;
        Cursor cur = managedQuery(
              mContacts,
              columns,    <span class="hljs-comment">// 要返回的数据字段</span>
             <span class="hljs-keyword">null</span>,      <span class="hljs-comment">// WHERE子句</span>
             <span class="hljs-keyword">null</span>,      <span class="hljs-comment">// WHERE 子句的参数</span>
             <span class="hljs-keyword">null</span>       <span class="hljs-comment">// Order-by子句</span>
        );


       <span class="hljs-keyword">if</span> (cur.moveToFirst()) {
           String name = <span class="hljs-keyword">null</span>;
           String phoneNo = <span class="hljs-keyword">null</span>;
           do {
              <span class="hljs-comment">// 获取字段的值</span>
            name = cur.getString(cur.getColumnIndex(People.NAME));
             phoneNo = cur.getString(cur.getColumnIndex(People.NUMBER));
             Toast.makeText(<span class="hljs-keyword">this</span>, name + ” ” + phoneNo, Toast.LENGTH_LONG).show();
          } <span class="hljs-keyword">while</span> (cur.moveToNext());
       }
    }
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li></ul></pre>






<h4 id="3-修改记录"><a name="t9"></a>3. 修改记录</h4>


<p>可以使用ContentResolver.update()方法来修改数据:</p>






<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">updateRecord</span>(<span class="hljs-keyword">int</span> recNo, String name) {
    Uri uri = ContentUris.withAppendedId(People.CONTENT_URI, recNo);
    ContentValues values = <span class="hljs-keyword">new</span> ContentValues();
    values.put(People.NAME, name);


    getContentResolver().update(uri, values, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>);
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></pre>


<p>现在你可以调用上面的方法来更新指定记录:</p>






<pre class="prettyprint" name="code"><code class="hljs scss has-numbering"><span class="hljs-function">updateRecord(<span class="hljs-number">10</span>, ”XYZ”)</span>;   <span class="hljs-comment">// 更改第10条记录的name字段值为“XYZ”</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li></ul></pre>






<h4 id="4-添加记录"><a name="t10"></a>4. 添加记录</h4>


<p>可以调用ContentResolver.insert()方法:</p>


<ul>
<li>该方法接受一个要增加的记录的目标URI,以及一个包含了新记录值的Map对象,</li>
<li>调用后的返回值是新记录的URI,包含记录号。</li>
</ul>


<p>上面的例子中我们都是基于联系人信息簿这个标准的Content Provider <br>
下面创建 <code>insertRecords(name, phoneNo)</code> 的方式来向联系人信息簿中添加联系人姓名和电话号码。</p>






<pre class="prettyprint" name="code"><code class="language-java hljs  has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">insertRecords</span>(String name, String phoneNo) {
    ContentValues values = <span class="hljs-keyword">new</span> ContentValues();
    values.put(People.NAME, name);


    Uri uri = getContentResolver().insert(People.CONTENT_URI, values);
    Log.d(”ANDROID”, uri.toString());


    Uri numberUri = Uri.withAppendedPath(uri, People.Phones.CONTENT_DIRECTORY);
    values.clear();
    values.put(Contacts.Phones.TYPE, People.Phones.TYPE_MOBILE);
    values.put(People.NUMBER, phoneNo);


    getContentResolver().insert(numberUri, values);
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul></pre>






<h4 id="5-删除记录"><a name="t11"></a>5. 删除记录</h4>






<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">deleteRecords</span>() {
    Uri uri = People.CONTENT_URI;
    getContentResolver().delete(uri, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>);
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul></pre>


<p>你也可以指定WHERE条件语句来删除特定的记录:</p>






<pre class="prettyprint" name="code"><code class="hljs sql has-numbering">getContentResolver().<span class="hljs-operator"><span class="hljs-keyword">delete</span>(uri, <span class="hljs-string">"NAME="</span> + <span class="hljs-string">"'XYZ XYZ'"</span>, <span class="hljs-keyword">null</span>);</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets_01.png"></a></div><ul class="pre-numbering"><li>1</li></ul></pre>


<p>这将会删除name为‘XYZ XYZ’的记录。</p>


<h4 id="6-创建contentprovider"><a name="t12"></a>6. 创建ContentProvider</h4>






<h5 id="1-创建一个继承了contentprovider父类的类"><a name="t13"></a>1. 创建一个继承了ContentProvider父类的类</h5>






<h5 id="2-定义一个名为contenturi并且是public-static-final的uri类型的类变量"><a name="t14"></a>2. 定义一个名为CONTENT_URI,并且是public static final的Uri类型的类变量</h5>


<ul>
<li>你必须为其指定一个唯一的字符串值,最好的方案是以类的全名称, 如:</li>
</ul>


<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Uri CONTENT_URI = Uri.parse( <span class="hljs-string">"content://com.google.android.MyContentProvider"</span>);</code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li></ul></pre>


<h5 id="3-定义你要返回给客户端的数据列名"><a name="t15"></a>3. 定义你要返回给客户端的数据列名</h5>


<ul>
<li>如果你正在使用Android数据库,必须为其定义一个叫_id的列,它用来表示每条记录的唯一性。</li>
</ul>






<h5 id="4-创建你的数据存储系统"><a name="t16"></a>4. 创建你的数据存储系统</h5>


<ul>
<li>大多数Content Provider使用 <code>Android文件系统</code> 或 <code>SQLite数据库</code> 来保持数据,但是你也可以以任何你想要的方式来存储。</li>
<li>如果你要存储字节型数据,比如位图文件等。 <br>
a. 数据列其实是一个表示实际保存文件的URI字符串,通过它来读取对应的文件数据。 <br>
b. 处理这种数据类型的Content Provider需要实现一个名为_data的字段,_data字段列出了该文件在<code>Android文件系统</code>上的精确路径。 <br>
c. 这个字段不仅是供客户端使用,而且也可以供 <code>ContentResolver</code> 使用。 <br>
d. 客户端可以调用 <code>ContentResolver.openOutputStream()</code> 方法来处理该URI指向的文件资源。 <br>
e. 如果是 <code>ContentResolver</code> 本身的话,由于其持有的权限比客户端要高,所以它能直接访问该数据文件。</li>
</ul>






<h5 id="5-声明public-static-string型的变量"><a name="t17"></a>5. 声明public static String型的变量</h5>


<ul>
<li>用于指定要从游标处返回的数据列。</li>
</ul>


<h5 id="6-查询返回一个cursor类型的对象"><a name="t18"></a>6. 查询返回一个Cursor类型的对象</h5>


<ul>
<li>所有执行写操作的方法如insert(), update() 以及delete()都将被监听。</li>
</ul>


<h5 id="7-在androidmenifestxml中使用-provider-标签来设置contentprovider"><a name="t19"></a>7. 在AndroidMenifest.xml中使用&lt; provider /&gt;标签来设置ContentProvider</h5>


<h5 id="8-如果要处理的数据类型是一种比较新的类型"><a name="t20"></a>8. 如果要处理的数据类型是一种比较新的类型</h5>


<ul>
<li>你就必须先定义一个新的MIME类型,以供ContentProvider.geType(url)来返回。</li>
<li>MIME类型有两种形式: <br>
<ol><li>一种是为指定的单个记录的</li>
<li>另一种是为多条记录的。</li></ol></li>
</ul>


<p>这里给出一种常用的格式:</p>






<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">vnd<span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.cursor</span><span class="hljs-preprocessor">.item</span>/vnd<span class="hljs-preprocessor">.yourcompanyname</span><span class="hljs-preprocessor">.contenttype</span> // 单个记录的MIME类型


比如, 一个请求列车信息的URI
<span class="hljs-label">content:</span>//<span class="hljs-keyword">com</span><span class="hljs-preprocessor">.example</span><span class="hljs-preprocessor">.transportationprovider</span>/trains/<span class="hljs-number">122</span> 
可能就会返回
typevnd<span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.cursor</span><span class="hljs-preprocessor">.item</span>/vnd<span class="hljs-preprocessor">.example</span><span class="hljs-preprocessor">.rail</span>
这样一个MIME类型</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li></ul></pre>


<pre class="prettyprint" name="code"><code class="hljs avrasm has-numbering">vnd<span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.cursor</span><span class="hljs-preprocessor">.dir</span>/vnd<span class="hljs-preprocessor">.yourcompanyname</span><span class="hljs-preprocessor">.contenttype</span> // 多个记录的MIME类型
比如, 一个请求所有列车信息的URI
<span class="hljs-label">content:</span>//<span class="hljs-keyword">com</span><span class="hljs-preprocessor">.example</span><span class="hljs-preprocessor">.transportationprovider</span>/trains 
可能就会返回
vnd<span class="hljs-preprocessor">.android</span><span class="hljs-preprocessor">.cursor</span><span class="hljs-preprocessor">.dir</span>/vnd<span class="hljs-preprocessor">.example</span><span class="hljs-preprocessor">.rail</span>
这样一个MIME 类型</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li></ul></pre>






<h5 id="9-创建contentprovider"><a name="t21"></a>9. 创建ContentProvider</h5>


<p>下面代码将创建一个 <code>ContentProvider</code>,它仅仅是存储用户名称并显示所有的用户名称。 <br>
(使用 SQLLite<a href="http://lib.csdn.net/base/mysql" class="replace_word" title="MySQL知识库" target="_blank" style="color:#df3434; font-weight:bold;">数据库</a>存储这些数据): <br>
(1)下面这个类中定义了<code>ContentProvider</code>的 <code>CONTENT_URI</code>,以及<code>数据列</code>:</p>


<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyUsers</span> {</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String AUTHORITY  = <span class="hljs-string">"com.zhuanghongji.MyContentProvider"</span>;


    <span class="hljs-comment">// BaseColumn类中已经包含了 _id字段</span>
   <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">User</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">BaseColumns</span> {</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> Uri CONTENT_URI  = Uri.parse(<span class="hljs-string">"content://com.zhuanghongji.MyContentProvider"</span>);
        <span class="hljs-comment">// 表数据列</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String  USER_NAME  = <span class="hljs-string">"USER_NAME"</span>;
    }
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul></pre>


<p>(2) 接着定义基于上面的类来定义实际的Content Provider类:</p>


<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyContentProvider</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">ContentProvider</span> {</span>
    <span class="hljs-keyword">private</span> SQLiteDatabase     sqlDB;
    <span class="hljs-keyword">private</span> DatabaseHelper     dbHelper;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String  DATABASE_NAME = “Users.db”;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-keyword">int</span>  DATABASE_VERSION= <span class="hljs-number">1</span>;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TABLE_NAME= “User”;
    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> String TAG = “MyContentProvider”;


    <span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">DatabaseHelper</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">SQLiteOpenHelper</span> {</span>
        DatabaseHelper(Context context) {
            <span class="hljs-keyword">super</span>(context, DATABASE_NAME, <span class="hljs-keyword">null</span>, DATABASE_VERSION);
        }


        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(SQLiteDatabase db) {
            <span class="hljs-comment">//创建用于存储数据的表</span>
            db.execSQL(<span class="hljs-string">"Create table "</span> + TABLE_NAME + <span class="hljs-string">"( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);"</span>);
        }


        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onUpgrade</span>(SQLiteDatabase db, <span class="hljs-keyword">int</span> oldVersion, <span class="hljs-keyword">int</span> newVersion) {
            db.execSQL(<span class="hljs-string">"DROP TABLE IF EXISTS "</span> + TABLE_NAME);
            onCreate(db); <span class="hljs-comment">// 调用onCreate()再进行创建</span>
        }
    }


    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">delete</span>(Uri uri, String s, String[] as) {
        <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
    }


    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> String <span class="hljs-title">getType</span>(Uri uri) {
        <span class="hljs-keyword">return</span> <span class="hljs-keyword">null</span>;
    }


    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> Uri <span class="hljs-title">insert</span>(Uri uri, ContentValues contentvalues) {
        sqlDB = dbHelper.getWritableDatabase();
        <span class="hljs-keyword">long</span> rowId = sqlDB.insert(TABLE_NAME,<span class="hljs-string">""</span>,contentvalues);
        <span class="hljs-keyword">if</span> (rowId &gt; <span class="hljs-number">0</span>) {
            Uri rowUri = ContentUris.appendId(MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();
            getContext().getContentResolver().notifyChange(rowUri, <span class="hljs-keyword">null</span>);
            <span class="hljs-keyword">return</span> rowUri;
        }
        <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> SQLException(<span class="hljs-string">"Failed to insert row into "</span> + uri);
    }


    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">boolean</span> <span class="hljs-title">onCreate</span>() {
        dbHelper = <span class="hljs-keyword">new</span> DatabaseHelper(getContext());
        <span class="hljs-keyword">return</span> (dbHelper == <span class="hljs-keyword">null</span>) ? <span class="hljs-keyword">false</span> : <span class="hljs-keyword">true</span>;
    }


    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> Cursor <span class="hljs-title">query</span>(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteQueryBuilder qb = <span class="hljs-keyword">new</span> SQLiteQueryBuilder();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        qb.setTables(TABLE_NAME);
        Cursor c = qb.query(db, projection, selection, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, sortOrder);
        c.setNotificationUri(getContext().getContentResolver(), uri);
        <span class="hljs-keyword">return</span> c;
    }


    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">update</span>(Uri uri, ContentValues contentvalues, String s, String[] as) {
        <span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
    }
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li></ul></pre>


<p>一个名为<code>MyContentProvider</code>的<code>Content Provider</code>创建完成了,它用于从Sqlite数据库中添加和读取记录。</p>






<h5 id="10-在androidmanifestxml中配置"><a name="t22"></a>10. 在AndroidManifest.xml中配置:</h5>






<pre class="prettyprint" name="code"><code class="language-xml hljs  has-numbering"><span class="hljs-tag">&lt;<span class="hljs-title">provider</span> 
    <span class="hljs-attribute">android:name</span>=<span class="hljs-value">”MyContentProvider”</span> 
    <span class="hljs-attribute">android:authorities</span>=<span class="hljs-value">”com.zhuanghongji.MyContentProvider”</span> /&gt;</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul></pre>






<h5 id="11-使用刚才定义好的contentprovider"><a name="t23"></a>11. 使用刚才定义好的ContentProvider</h5>


<ol>
<li>为应用程序添加ContentProvider的访问权限。</li>
<li>通过<code>getContentResolver()</code>方法得到ContentResolver对象。</li>
<li>调用ContentResolver类的<code>query()</code>方法查询数据,该方法会返回一个Cursor对象。</li>
<li>对得到的Cursor对象进行分析,得到需要的数据。</li>
<li>调用Cursor类的<code>close()</code>方法将Cursor对象关闭。</li>
</ol>






<pre class="prettyprint" name="code"><code class="hljs java has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyContentProviderDemo</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">Activity</span> {</span>
    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        insertRecord(”MyUser”);
        displayRecords();
    }


    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">insertRecord</span>(String userName) {
        ContentValues values = <span class="hljs-keyword">new</span> ContentValues();
        values.put(MyUsers.User.USER_NAME, userName);
        getContentResolver().insert(MyUsers.User.CONTENT_URI, values);
    }


    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">displayRecords</span>() {
        String columns[] = <span class="hljs-keyword">new</span> String[] { MyUsers.User._ID, MyUsers.User.USER_NAME };
        Uri myUri = MyUsers.User.CONTENT_URI;
        Cursor cur = managedQuery(myUri, columns,<span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span>, <span class="hljs-keyword">null</span> );
        <span class="hljs-keyword">if</span> (cur.moveToFirst()) {
            String id = <span class="hljs-keyword">null</span>;
            String userName = <span class="hljs-keyword">null</span>;
            do {
                id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));
                userName = cur.getString(cur.getColumnIndex(MyUsers.User.USER_NAME));
                Toast.makeText(<span class="hljs-keyword">this</span>, id + ” ” + userName, Toast.LENGTH_LONG).show();
           } <span class="hljs-keyword">while</span> (cur.moveToNext());
       }
    }
}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li></ul></pre>


<p>参考文章: <br>
1. <a href="http://xiechengfa.iteye.com/blog/1415829">Android ContentProvider的介绍</a> <br>
2. <a href="http://www.cnblogs.com/devinzhang/archive/2012/01/20/2327863.html">Android之ContentProvider总结</a></p></div>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值