技术库 > Java

android ContentProvider案例

技术库:tec.5lulu.com

1 PersonContentProvider内容提供者类

package com.ljq.db;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.text.TextUtils;
/**
* 内容提供者
*
* 作用:统一数据访问方式,方便外部调用
*
* @author jiqinlin
*
*/
public class PersonContentProvider extends ContentProvider {
   // 数据集的MIME类型字符串则应该以vnd.android.cursor.dir/开头
   public static final String PERSONS_TYPE = "vnd.android.cursor.dir/person";
   // 单一数据的MIME类型字符串应该以vnd.android.cursor.item/开头
   public static final String PERSONS_ITEM_TYPE = "vnd.android.cursor.item/person";
   public static final String AUTHORITY = "com.ljq.provider.personprovider";// 主机名
   /* 自定义匹配码 */
   public static final int PERSONS = 1;
   /* 自定义匹配码 */
   public static final int PERSON = 2;
   public static final Uri PERSONS_URI = Uri.parse("content://" + AUTHORITY + "/person");
   private DBOpenHelper dbOpenHelper = null;
   // UriMatcher类用来匹配Uri,使用match()方法匹配路径时返回匹配码
   private static final UriMatcher uriMatcher;
   static {
       // 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
       uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
       // 如果match()方法匹配content://com.ljq.provider.personprovider/person路径,返回匹配码为PERSONS
       uriMatcher.addURI(AUTHORITY, "person", PERSONS);
       // 如果match()方法匹配content://com.ljq.provider.personprovider/person/230路径,返回匹配码为PERSON
       uriMatcher.addURI(AUTHORITY, "person/#", PERSON);
   }    
   @Override
   public boolean onCreate() {
       dbOpenHelper = new DBOpenHelper(this.getContext());
       return true;
   }    
   @Override
   public Uri insert(Uri uri, ContentValues values){
       SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
       long id = 0;
       switch (uriMatcher.match(uri)) {
       case PERSONS:
           id = db.insert("person", "name", values);// 返回的是记录的行号,主键为int,实际上就是主键值
           return ContentUris.withAppendedId(uri, id);
       case PERSON:
           id = db.insert("person", "name", values);
           String path = uri.toString();
           return Uri.parse(path.substring(0, path.lastIndexOf("/"))+id); // 替换掉id
       default:
           throw new IllegalArgumentException("Unknown URI " + uri);
       }
   }    
   @Override
   public int delete(Uri uri, String selection, String[] selectionArgs) {
       SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
       int count = 0;
       switch (uriMatcher.match(uri)) {
       case PERSONS:
           count = db.delete("person", selection, selectionArgs);
           break;
       case PERSON:
           // 下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
           // 进行解析,返回值为10
           long personid = ContentUris.parseId(uri);
           String where = "id=" + personid;// 删除指定id的记录
           where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
           count = db.delete("person", where, selectionArgs);
           break;
       default:
           throw new IllegalArgumentException("Unknown URI " + uri);
       }
       db.close();
       return count;
   }
   @Override
   public int update(Uri uri, ContentValues values, String selection,
           String[] selectionArgs) {
       SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
       int count = 0;
       switch (uriMatcher.match(uri)) {
       case PERSONS:
           count = db.update("person", values, selection, selectionArgs);
           break;
       case PERSON:
           // 下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
           // 进行解析,返回值为10
           long personid = ContentUris.parseId(uri);
           String where = "id=" + personid;// 获取指定id的记录
           where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
           count = db.update("person", values, where, selectionArgs);
           break;
       default:
           throw new IllegalArgumentException("Unknown URI " + uri);
       }
       db.close();
       return count;
   }    
   @Override
   public String getType(Uri uri) {
       switch (uriMatcher.match(uri)) {
       case PERSONS:
           return PERSONS_TYPE;
       case PERSON:
           return PERSONS_ITEM_TYPE;
       default:
           throw new IllegalArgumentException("Unknown URI " + uri);
       }
   }
   @Override
   public Cursor query(Uri uri, String[] projection, String selection,
           String[] selectionArgs, String sortOrder) {
       SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
       switch (uriMatcher.match(uri)) {
       case PERSONS:
           return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
       case PERSON:
           // 下面的方法用于从URI中解析出id,对这样的路径content://com.ljq.provider.personprovider/person/10
           // 进行解析,返回值为10
           long personid = ContentUris.parseId(uri);
           String where = "id=" + personid;// 获取指定id的记录
           where += !TextUtils.isEmpty(selection) ? " and (" + selection + ")" : "";// 把其它条件附加上
           return db.query("person", projection, where, selectionArgs, null, null, sortOrder);
       default:
           throw new IllegalArgumentException("Unknown URI " + uri);
       }
   }
}

2 文件清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.ljq.sql" android:versionCode="1"
   android:versionName="1.0">
   <application android:icon="@drawable/icon"
       android:label="@string/app_name">
       <uses-library android:name="android.test.runner" />
       <activity android:name=".SqlActivity"
           android:label="@string/app_name">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category
                   android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>
       <provider android:name="com.ljq.db.PersonContentProvider"
             android:authorities="com.ljq.provider.personprovider" />
   </application>
   <uses-sdk android:minSdkVersion="7" />
   <instrumentation
       android:name="android.test.InstrumentationTestRunner"
       android:targetPackage="com.ljq.sql" android:label="Tests for My App" />
</manifest>

3 PersonContentProviderTest内容提供者测试类

package com.ljq.test;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.AndroidTestCase;
import android.util.Log;
/**
* 外部访问内容提供者
*
* @author jiqinlin
*
*/
public class PersonContentProviderTest extends AndroidTestCase{
   private static final String TAG = "PersonContentProviderTest";    
   public void testSave() throws Throwable{
       ContentResolver contentResolver = this.getContext().getContentResolver();
       Uri insertUri = Uri.parse("content://com.ljq.provider.personprovider/person");
       ContentValues values = new ContentValues();
       values.put("name", "ljq");
       values.put("phone", "1350000009");
       Uri uri = contentResolver.insert(insertUri, values);
       Log.i(TAG, uri.toString());
   }  
   public void testUpdate() throws Throwable{
       ContentResolver contentResolver = this.getContext().getContentResolver();
       Uri updateUri = Uri.parse("content://com.ljq.provider.personprovider/person/1");
       ContentValues values = new ContentValues();
       values.put("name", "linjiqin");
       contentResolver.update(updateUri, values, null, null);
   }
   public void testFind() throws Throwable{
       ContentResolver contentResolver = this.getContext().getContentResolver();
       //Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person");
       Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person");
       Cursor cursor = contentResolver.query(uri, null, null, null, "id asc");
       while(cursor.moveToNext()){
           int personid = cursor.getInt(cursor.getColumnIndex("id"));
           String name = cursor.getString(cursor.getColumnIndex("name"));
           String phone = cursor.getString(cursor.getColumnIndex("phone"));
           Log.i(TAG, "personid="+ personid + ",name="+ name+ ",phone="+ phone);
       }
       cursor.close();
   }    
   public void testDelete() throws Throwable{
       ContentResolver contentResolver = this.getContext().getContentResolver();
       Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person/1");
       contentResolver.delete(uri, null, null);
   }
}

android ContentProvider案例


标签: android uri本文链接 http://tec.5lulu.com/detail/110krn1h941an8yeb.html

我来评分 :8
1

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

www.5lulu.com