安卓学习笔记之自定义ContentProvider

来源:互联网 发布:云计算的三种类型 编辑:程序博客网 时间:2024/04/28 23:09

步骤

  • 自定义provider类继承ContentProvider
  • 实现ContentProvider的抽象方法
  • 在清单文件中配置provider
<provider     android:name="com.yu.peoplecontentprovider.PeopleContentProvider"   android:authorities="com.yu.peoplecontentprovider"<!- 设置exported为true 使外部可访问-->android:exported="true" />
  • 使用UriMatcher对象添加匹配
//  authorities:用于匹配的域名;    static String authorities = "com.yu.peoplecontentprovider";    // 创建uri匹配器    static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);    static    {   //添加匹配规则        //参数1:用于匹配的域名        //参数2:路径 , *表示text的占位符,#表示使用数字的占位符        //参数3:匹配码        sMatcher.addURI(authorities, "info", 1);// com.yu.peoplecontentprovider/info        sMatcher.addURI(authorities, "relation", 2);//com.yu.peoplecontentprovider/relation        sMatcher.addURI(authorities, "info/#", 3);// com.yu.peoplecontentprovider/info/#    }
  • 通过uri匹配执行对应的增删改查等操作
  • 创建数据库以供操作
  • 创建测试应用

具体代码

provider的创建

package com.yu.peoplecontentprovider;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;public class PeopleContentProvider extends ContentProvider {    SQLiteDatabase db;    //  authorities:用于匹配的域名;    static String authorities = "com.yu.peoplecontentprovider";    // 创建uri匹配器    static final UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);    static    {   //添加匹配规则        //参数1:用于匹配的域名        //参数2:路径 , *表示text的占位符,#表示使用数字的占位符        //参数3:匹配码        sMatcher.addURI(authorities, "info", 1);// com.yu.peoplecontentprovider/info        sMatcher.addURI(authorities, "relation", 2);//com.yu.peoplecontentprovider/relation        sMatcher.addURI(authorities, "info/#", 3);// com.yu.peoplecontentprovider/info/#    }    @Override    public boolean onCreate() {        DBhelper dbHelper = new DBhelper(getContext());        db = dbHelper.getWritableDatabase();        return true;    }    /**     * 通过匹配查询     */    @Override    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder) {        Cursor cursor = null;        int match = sMatcher.match(uri);        switch (match) {        case 1:            cursor = db.query("info", null, selection, selectionArgs, null, null, sortOrder);            break;        case 2:            cursor = db.query("relation", null, selection, selectionArgs, null, null, sortOrder);            break;        case 3:            // 匹配com.yu.peoplecontentprovider/info/#             // 取出uri末尾携带的数字】            long id = ContentUris.parseId(uri);             System.out.println("id:"+id);            cursor = db.query("info", null, "_id=?", new String[]{id+""}, null, null, null);            break;        }        return cursor;    }    /**     * 通过uri返回数据的 MIME type      */    @Override    public String getType(Uri uri) {        int match = sMatcher.match(uri);        switch (match) {        case 1:            return "vnd.android.cursor.dir/info";        case 2:            return "vnd.android.cursor.dir/relation";        case 3:            return "vnd.android.cursor.item/info/#";        }        return null;    }    /**     * 通过匹配插入数据库     */    @Override    public Uri insert(Uri uri, ContentValues values) {        if (sMatcher.match(uri)== 1) {            db.insert("info", null, values);        }        if (sMatcher.match(uri) == 2) {            db.insert("relation", null, values);        }        return uri;    }    /**     * 通过匹配删除内容     */    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        int rowsAffected=0;        if (sMatcher.match(uri) ==1) {            rowsAffected = db.delete("info", selection, selectionArgs);        }        if (sMatcher.match(uri) == 2) {            rowsAffected = db.delete("relation", selection, selectionArgs);        }        return rowsAffected;    }    /**     * 通过匹配更新数据库     */    @Override    public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs) {        int rowsAffected=0;        if (sMatcher.match(uri) == 1) {            rowsAffected = db.update("info", values, selection, selectionArgs);        }        if (sMatcher.match(uri) == 2) {            rowsAffected = db.update("relation", values, selection, selectionArgs);        }        return rowsAffected;    }}

数据库创建帮助类

package com.yu.peoplecontentprovider;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DBhelper extends SQLiteOpenHelper {    public DBhelper(Context context) {        super(context, "people.db", null, 2);    }    @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL("create table info(_id integer primary key autoincrement,name text,age integer)");    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL("create table relation(_id integer primary key autoincrement,name text,age integer)");    }}

测试代码

package com.yu.testcontentprovider;import android.app.Activity;import android.content.ContentResolver;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.net.Uri;import android.os.Bundle;import android.os.Looper;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity {    ContentResolver resolver;    String baseUri = "content://com.yu.peoplecontentprovider";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        resolver = getContentResolver();    }    public void insert(View view) {        ContentValues values = new ContentValues();        values.put("name", "eee");        values.put("age", 564);        resolver.insert(Uri.parse(baseUri+"/relation"), values );    }    public void update(View view) {        ContentValues values = new ContentValues();        values.put("age", 4567);        resolver.update(Uri.parse(baseUri+"/relation"), values , "name=?", new String[]{"eee"});    }    public void delete(View view) {        resolver.delete(Uri.parse(baseUri+"/relation"), "name=?", new String[]{"qqq"});    }    public void query(View view) {        final Cursor cursor = resolver.query(Uri.parse(baseUri+"/relation"), null, null, null, null);        if (cursor != null) {            Toast.makeText(getApplicationContext(), "查询", 0).show();            while (cursor.moveToNext()) {                String name = cursor.getString(1);                int age = cursor.getInt(2);                System.out.println("------------------------------");                System.out.println("name:"+name+",age:"+age);            }        }    }    public void queryId(View view) {        Cursor cursor = resolver.query(Uri.parse(baseUri+"/info/20"), null, null, null, null);        if (cursor != null) {            if (cursor.moveToNext()) {                Toast.makeText(getApplicationContext(), "id查询", 0).show();                String name = cursor.getString(1);                int age = cursor.getInt(2);                System.out.println("------------------------------");                System.out.println("name"+name+",age:"+age);            }        }    }    public void getType(View view) {        System.out.println(resolver.getType(Uri.parse(baseUri+"/info/20")));;    }}
0 0
原创粉丝点击