您的位置:首页 > 移动开发 > Android开发

android_内容提供者和内容解析者_简单入门

2016-03-15 15:50 549 查看

ContentProvider 内容提供者

一般来说,应用程序创建的数据库只有自己才可以进行读写操作,其他的应用程序不具备这样的权利。但是如果真的想把数据库里面的数据暴露出去,供其他的程序进行CURD操作,那么这个时候就用到了ContentProvider

那这个ContentProvider是怎么工作的?现在我们解释一下,

这个ContentProvider是怎么工作的

现在图形化解释一下这个概念:



如果银行行长想要去拿银行里面的钱,但是钱是放在保险库里面的,行长是没有办法直接拿到里面的钱的,但是,保险库里面也有内部人员,只要银行行长和内部人员打交道,通过内部人员,拿钱。这样行长就可以拿到钱了。

在这里钱:表示数据库 内部人员:内容提供者 银行行长:就是外部的APP程序

建立内容提供者

第一步:写一个类继续ContentProvider

第二步:在清单文件里面注册,同时要记得叫上authorities(我们把叫做口令)

在这里解释一下authorities的作用,因为别人来访问我们的内容提供,我们不能让任何的APP过来,都是可以访问我的,所以我们内容提供者就设置了一个口令,只有口令输入对了,才可以访问。(注意:直接设置这么一个口令还是不够的,待会后面我会详细的介绍一下)

代码演示内容提供者:

首先我规定一下:这个应用程序的包名是com.exam.bank

第一步:

public class BankBackDoor extends ContentProvider {

/**
继承之后,发现有四个6个方法,给我们重写,
其中query,insert,update,delete就是对应数据库的
CRUD的方法,同时这个四个方法也对应这内容解析者的query,insert,update,delete,
内容解析者,通过调用自己的CRUD,就可以操作内容提供者的CRUD,
内容通过自己的CRUD又可以去操作自己数据库的CRUD,

所以说:
有一个核心: 到底修改什么数据,执行什么数据插入, 查询,删除,都不能由我们做主,因为我们只是一个跑腿。 我们不生产数据,我们只是数据的搬运工。
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
Log.v("tag", "query");
return null;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
Log.v("tag", "insert");
return null;
}

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

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

@Override
public boolean onCreate() {
return false;
}

@Override
public String getType(Uri uri) {
return null;
}

}


第二步:

<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.exam.bank.MainActivity"
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.exam.bank.BankBackDoor"
android:authorities="com.exam.bank.BankBackDoor"
><!--设置口令-->
</provider>
</application>


这样一个内容提供者我们就写好了.

现在我们设置一下内容解析者把

首先我规定一下这个应用程序的包名是:com.example.bangkBoss

public class MainActivity extends Activity {

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

public void insert(View v){
//获取内容解析者
ContentResolver   resolver=getContentResolver();
//设置Uri,Uri解析的路径就是内容提供者对外暴漏的口令.
//content://是固定好的,
//com.exam.bank.BankBackDoor内容提供者设置的口令
Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
ContentValues  values=new ContentValues();
/**调用内容解析者里面的方法,只要我们使用insert方法,
这个方法就会去操作内容提供者里面的insert方法,
而内容提供者而就会调用自己内部的方法(就会去操作数据库).
这样通过这样的调用,
外部的APP就可以访问,其他APP的数据库了
*/
resolver.insert(uri, values);
}

public void delete(View v){
ContentResolver   resolver=getContentResolver();
Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
resolver.delete(uri, null, null);
}

public void update(View v){
ContentResolver   resolver=getContentResolver();
Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
ContentValues  values=new ContentValues();
resolver.up
bc31
date(uri, values, null, null);
}

public void select(View v){
ContentResolver   resolver=getContentResolver();
Uri   uri =Uri.parse("content://com.exam.bank.BankBackDoor");
resolver.query(uri, null, null, null, null);
}

}


一些定义的解析:

Uri 在java基础我们知道是资源定位符,在这里,我们就用来匹配口令的,这个口令是内容提供者写好。我们只要和内容提供者的提供的口令一致就可以的了,content://

指的是规则,例如http://www.baidu.com一样,符合http://规则。content://

就是我们这里口令的规则,这个是定义死的。记住就行了。

Resolver,里面就有insert(),updata(),delete(),query()等方法,他们都是对应着内容提供者的方法。所以我们内容解析者操作自己里面的方法,就可以执行到内容提供者里面的方法。

ContentValues 这个参数,其实就是用来存储数据的,是键值对的形式存在的。在SQLite里面有详细的介绍

后面会演示的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android