您的位置:首页 > 移动开发 > Android开发

Android 总结:ContentProvider 的使用

2017-02-22 10:52 127 查看
<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 > <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"><<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> /></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中使用< provider />标签来设置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 > <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"><<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> /></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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: