android内容提供者

一、什么是内容提供者?
ContentProvider(内容提供者)是Android中的四大组件之一。ContentProvider为不同的软件之间数据共享,提供统一的接口。
ContentProvider是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数
据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。ContentProvider定义一
个对外开放的接口,从而使得其他的应用可以使用我们自己应用中的文件、数据库内存储的信息。实际开发过程中并不是很常用,
android系统中的信息,图片库,联系人常用到,但谷歌工程师已经帮我封装好了,我们只需要访问即可。

二、为什么会有内容提供者?
内容提供者向其它的应用程序提供了一个数据访问的方式,这种方式相对于文件存储共享和sharedpreferences共享数据而言
的话,它提供了一个统一的数据访问方式,更方便更有效。

三、如何创建一个内容提供者?

首先:写一个类继承Contentprovider,重写六个方法如下实例所示

其次:在AndroidManifest.xml的节点下配置指定name和authorities属性

实例:

package com.sun.administrator.sqlite;  

import android.content.ContentProvider;  
import android.content.ContentValues;  
import android.database.Cursor;  
import android.database.sqlite.SQLiteDatabase;  
import android.net.Uri;  
import android.support.annotation.NonNull;  
import android.support.annotation.Nullable;  
import android.util.Log;  

import com.zking.db.DBHelper;  

/** 
 * Created by Administrator on 2017/7/17 0017. 
 */  

public class MyProvider extends ContentProvider {  
    @Override  
    public boolean onCreate() {  
        Log.i("test","onCreate");  
        return false;  
    }  

    @Nullable  
    @Override  
    public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) {  
        Log.i("test","query");  
        //把数据查询出来  
        DBHelper dbHelper=new DBHelper(getContext(),"test.db",null,1);  
        SQLiteDatabase sqLiteDatabase=dbHelper.getReadableDatabase();  
        //sqLiteDatabase.rawQuery("select * from login",null);  
        return sqLiteDatabase.rawQuery("select * from login",null);  
    }  

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

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

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

    @Override  
    public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {  
        Log.i("test","update");  
        return 0;  
    }  
}  
配置信息:` 
package com.sun.administrator.contentresolver;  

import android.content.ContentResolver;  
import android.database.Cursor;  
import android.net.Uri;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.util.Log;  

public class MainActivity extends AppCompatActivity {

@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity_main);  

    //获取上面一个应用程序的数据  
    //获取内容访问者  
    ContentResolver cr=getContentResolver();  
    Uri uri=Uri.parse("content://com.sun.administrator.sqlite.LOGIN");  
    Cursor cursor=cr.query(uri,null,null,null,null);  
    while(cursor.moveToNext()){  
       int uid=cursor.getInt(cursor.getColumnIndex("uid"));  
        String uname=cursor.getString(cursor.getColumnIndex("uname")) ;  
        String upass=cursor.getString(cursor.getColumnIndex("upass")) ;  
        Log.i("test",uid+" "+uname+" "+upass);  
    }  
}  

}

小结: ① ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法
② ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据
③ ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略
④ ContentProvider中可以注册观察者, 监听数据的变化

注意:1、配置信息中name 是完整的类名
2、authorities是访问Provider时的路径,一定要唯一

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值