安卓学习笔记之自定义ContentProvider

步骤

  • 自定义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")));;

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值