zl程序教程

您现在的位置是:首页 >  其它

当前栏目

contentProvider 内容提供者

内容 contentprovider
2023-09-11 14:18:04 时间

http://blog.csdn.net/woshixuye/article/details/8280879

实例代码
当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定义一个URI。之后其他应用程序对数据进行查询或者修改时,只需要从当前上下文对象获得一个ContentResolver(内容解析器)传入相应的URI就可以了。
contentProvider和Activity一样是Android的组件,故使用前需要在AndroidManifest.xml中注册,必须放在主应用所在包或其子包下。

 1  <application android:icon="@drawable/icon" android:label="@string/app_name">  
 2      <activity android:name=".MainActivity"  
 3                android:label="@string/app_name">  
 4          <intent-filter>  
 5              <action android:name="android.intent.action.MAIN" />  
 6              <category android:name="android.intent.category.LAUNCHER" />  
 7          </intent-filter>  
 8          <intent-filter>  
 9              <data android:mimeType="vnd.android.cursor.dir/person" />  
10          </intent-filter>  
11          <intent-filter>  
12              <data android:mimeType="vnd.android.cursor.item/person" />  
13          </intent-filter>  
14      </activity>  
15      <!-- 配置内容提供者,android:authorities为该内容提供者取名作为在本应用中的唯一标识 -->  
16      <provider android:name=".providers.PersonProvider"   
17 android:authorities="cn.xyCompany.providers.personProvider"/>  
18  </application>  
19  
20 内容提供者和测试代码
21  

 

 

  1 package cn.xy.cotentProvider.app.providers;  
  2 import android.content.ContentProvider;  
  3 import android.content.ContentUris;  
  4 import android.content.ContentValues;  
  5 import android.content.UriMatcher;  
  6 import android.database.Cursor;  
  7 import android.database.sqlite.SQLiteDatabase;  
  8 import android.net.Uri;  
  9 import android.util.Log;  
 10 import cn.xy.cotentProvider.service.DBOpeningHelper;  
 11   
 12 /** 
 13  * contentProvider作为一种组件必须放在应用所在包或其子包下,主要作用是对外共享数据 
 14  * 测试步骤1:将本项目先部署 
 15  * 测试步骤2:调用测试方法 
 16  * @author xy 
 17  *  
 18  */  
 19 public class PersonProvider extends ContentProvider  
 20 {  
 21     private DBOpeningHelper dbHelper;  
 22   
 23     // 若不匹配采用UriMatcher.NO_MATCH(-1)返回  
 24     private static final UriMatcher MATCHER = new UriMatcher(UriMatcher.NO_MATCH);  
 25   
 26     // 匹配码  
 27     private static final int CODE_NOPARAM = 1;  
 28     private static final int CODE_PARAM = 2;  
 29   
 30     static  
 31     {  
 32         // 对等待匹配的URI进行匹配操作,必须符合cn.xyCompany.providers.personProvider/person格式  
 33         // 匹配返回CODE_NOPARAM,不匹配返回-1  
 34         MATCHER.addURI("cn.xyCompany.providers.personProvider", "person", CODE_NOPARAM);  
 35   
 36         // #表示数字 cn.xyCompany.providers.personProvider/person/10  
 37         // 匹配返回CODE_PARAM,不匹配返回-1  
 38         MATCHER.addURI("cn.xyCompany.providers.personProvider", "person/#", CODE_PARAM);  
 39     }  
 40   
 41     @Override  
 42     public boolean onCreate()  
 43     {  
 44         dbHelper = new DBOpeningHelper(this.getContext());  
 45         return true;  
 46     }  
 47   
 48     /** 
 49      * 外部应用向本应用插入数据 
 50      */  
 51     @Override  
 52     public Uri insert(Uri uri, ContentValues values)  
 53     {  
 54         SQLiteDatabase db = dbHelper.getWritableDatabase();  
 55         switch (MATCHER.match(uri))  
 56         {  
 57             case CODE_NOPARAM:  
 58                 // 若主键值是自增长的id值则返回值为主键值,否则为行号,但行号并不是RecNo列  
 59                 long id = db.insert("person", "name", values);   
 60                 Uri insertUri = ContentUris.withAppendedId(uri, id);   
 61                 return insertUri;  
 62             default:  
 63                 throw new IllegalArgumentException("this is unkown uri:" + uri);  
 64         }  
 65     }  
 66   
 67     /** 
 68      * 外部应用向本应用删除数据 
 69      */  
 70     @Override  
 71     public int delete(Uri uri, String selection, String[] selectionArgs)  
 72     {  
 73         SQLiteDatabase db = dbHelper.getWritableDatabase();  
 74         switch (MATCHER.match(uri))  
 75         {  
 76             case CODE_NOPARAM:  
 77                 return db.delete("person", selection, selectionArgs); // 删除所有记录  
 78             case CODE_PARAM:  
 79                 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字  
 80                 Log.i("provider", String.valueOf(id));  
 81                 String where = "id = " + id;  
 82                 if (null != selection && !"".equals(selection.trim()))  
 83                 {  
 84                     where += " and " + selection;  
 85                 }  
 86                 return db.delete("person", where, selectionArgs);  
 87             default:  
 88                 throw new IllegalArgumentException("this is unkown uri:" + uri);  
 89         }  
 90     }  
 91   
 92     /** 
 93      * 外部应用向本应用更新数据 
 94      */  
 95     @Override  
 96     public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)  
 97     {  
 98         SQLiteDatabase db = dbHelper.getWritableDatabase();  
 99         switch (MATCHER.match(uri))  
100         {  
101             case CODE_NOPARAM:  
102                 return db.update("person",values,selection, selectionArgs); // 更新所有记录  
103             case CODE_PARAM:  
104                 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字  
105                 String where = "id = " + id;  
106                 if (null != selection && !"".equals(selection.trim()))  
107                 {  
108                     where += " and " + selection;  
109                 }  
110                 return db.update("person",values,where,selectionArgs);  
111             default:  
112                 throw new IllegalArgumentException("this is unkown uri:" + uri);  
113         }  
114     }  
115       
116     /** 
117      * 返回对应的内容类型 
118      * 如果返回集合的内容类型,必须以vnd.android.cursor.dir开头 
119      * 如果是单个元素,必须以vnd.android.cursor.item开头 
120      */  
121     @Override  
122     public String getType(Uri uri)  
123     {  
124         switch(MATCHER.match(uri))  
125         {  
126             case CODE_NOPARAM:  
127                 return "vnd.android.cursor.dir/person";  
128             case CODE_PARAM:  
129                 return "vnd.android.cursor.item/person";  
130             default:  
131                 throw new IllegalArgumentException("this is unkown uri:" + uri);  
132         }  
133     }  
134   
135     @Override  
136     public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)  
137     {  
138         SQLiteDatabase db = dbHelper.getReadableDatabase();  
139         switch (MATCHER.match(uri))  
140         {  
141             case CODE_NOPARAM:  
142                 return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);  
143             case CODE_PARAM:  
144                 long id = ContentUris.parseId(uri); // 取得跟在URI后面的数字  
145                 String where = "id = " + id;  
146                 if (null != selection && !"".equals(selection.trim()))  
147                 {  
148                     where += " and " + selection;  
149                 }  
150                 return db.query("person", projection, where, selectionArgs, null, null, sortOrder);  
151             default:  
152                 throw new IllegalArgumentException("this is unkown uri:" + uri);  
153         }  
154     }  
155   
156 }  
157   
158   
159   
160 测试代码  
161 package cn.xy.test.test;  
162 import android.content.ContentResolver;  
163 import android.content.ContentValues;  
164 import android.database.Cursor;  
165 import android.net.Uri;  
166 import android.test.AndroidTestCase;  
167 import android.util.Log;  
168   
169 /** 
170  * 测试代码 
171  * @author xy 
172  * 
173  */  
174 public class TestProviders extends AndroidTestCase  
175 {  
176     // 在执行该测试方法时需要先将还有内容提供者的项目部署到Android中,否则无法找到内容提供者  
177     public void testInsert()  
178     {  
179         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
180         ContentResolver resolver = this.getContext().getContentResolver();  
181         ContentValues values = new ContentValues();  
182         values.put("name", "xy");  
183         values.put("phone", "111");  
184         resolver.insert(uri, values); // 内部调用内容提供者的insert方法  
185     }  
186   
187     // 不带id参数的删除  
188     public void testDelete1()  
189     {  
190         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person");  
191         ContentResolver resolver = this.getContext().getContentResolver();  
192         int rowAffect = resolver.delete(uri, null, null);  
193         Log.i("rowAffect", String.valueOf(rowAffect));  
194     }  
195   
196     // 带参数的删除,通过URI传递了id至contentProvider并可追加其他条件  
197     public void testDelete2()  
198     {  
199         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/18");  
200         ContentResolver resolver = this.getContext().getContentResolver();  
201         int rowAffect = resolver.delete(uri, "name = ?", new String[] { "XY2" }); // 在provider中手动进行了拼装  
202         Log.i("rowAffect", String.valueOf(rowAffect));  
203     }  
204       
205     public void testUpdate()  
206     {  
207         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/19");  
208         ContentResolver resolver = this.getContext().getContentResolver();  
209         ContentValues values = new ContentValues();  
210         values.put("name", "newxy");  
211         values.put("phone", "new111");  
212         int rowAffect = resolver.update(uri, values, null, null);  
213         Log.i("rowAffect", String.valueOf(rowAffect));  
214     }  
215       
216     public void testQuery()  
217     {  
218         Uri uri = Uri.parse("content://cn.xyCompany.providers.personProvider/person/19");  
219         ContentResolver resolver = this.getContext().getContentResolver();  
220         Cursor cursor = resolver.query(uri, new String[]{"id","name","phone"}, null, null, "id asc");  
221         if(cursor.moveToFirst())  
222         {  
223             Log.i("query", cursor.getString(cursor.getColumnIndex("name")));  
224         }  
225         cursor.close();  
226     }  
227 }