ContentProvider内容提供者与ContentResolver内容访问者

刚好接触到ContentProvider内容提供者与ContentResolver内容访问者,对它进行了一个初步的了解,它主要用于不同的应用程序之间实现数据的共享,允许一个程序访问另一个程序,还可以保证数据的安全。

以下是我写的一个简单的ContentProvider与ContentResolver的一个列子(没有用系统内容提供者):
首先创建两个项目分别为android16_sqlite和android24_contentprovider。android16_sqlite为内容提供者,android24_contentprovider为内容访问者。

在android16_sqlite创建DBHelper

public class DBHelper extends SQLiteOpenHelper {
    /**
     *
     * @param context  上下文
     * @param name    名字(数据库名),文件名
     * @param factory 游标工厂,多数情况:null
     * @param version 数据库版本
     */
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        Log.i("test","构造");
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        //操作:创建表的操作
        sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,name,age)");
        Log.i("test","创建表");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        Log.i("test","数据库版本,低--->高");
    }

}

在android16_sqlite中创建类MyProvider继承ContentProvider实现六个方法

public class MyProvider extends ContentProvider {

    private SQLiteDatabase database;

    @Override
    public boolean onCreate() {

        DBHelper dbHelper=new DBHelper(getContext(),"G150831.db",null,2);
        database = dbHelper.getReadableDatabase();

         /*保存到数据库中
        ContentValues values=new ContentValues();//Map
        values.put("name","longdan");
        values.put("age",19);
        values.putNull("_id");
        database.insert("person","name",values);
        Toast.makeText(this, " 增加成功"+values, Toast.LENGTH_SHORT).show();*/



        Log.i("test","onCreate");
        return false;
    }

    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
       //查询所有的数据
        Log.i("test","query");
        return  database.query(true,"person",projection,selection,selectionArgs,null,null,sortOrder,null);

    }

    @Nullable
    @Override
    public String getType(Uri uri) {
        Log.i("test","getType");
        return null;
    }

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Log.i("test","insert");
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        Log.i("test","delete");
        return 0;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        Log.i("test","update");
        return 0;
    }
}

在android16_sqlite清单文件AndroidManifest.xml中配置

 <!--配置内容提供者-->
        <provider
            android:authorities="com.example.android16_sqlite.person"
            android:name="com.example.myprovider.MyProvider"
            android:exported="true"
            ></provider>

在android24_contentprovider 中通过
ContentResolver contentResolver= getContentResolver();
实例化对象ContentResolver通过ContentResolver实现
以下是实现的基础的查询:

//uri中的值在需要满足content://协议后面的为你在内容提供者配置文件AndroidManifest.xml中
authorities定义的名字
Uri uri=Uri.parse("content://com.example.android16_sqlite.person");

        Cursor cursor=contentResolver.query(uri,null,null,null,null);

        while (cursor.moveToNext()){
            int id=cursor.getInt(cursor.getColumnIndex("_id"));
            String name=cursor.getString(cursor.getColumnIndex("name"));
            int age=cursor.getInt(cursor.getColumnIndex("age"));
            Log.i("test",id+" "+name+" "+age);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值