一、什么是内容提供者?
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();
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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
配置信息:`
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);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
小结: ① ContentProvider将应用中的数据对其它应用进行共享, 提供增删改查的方法
② ContentProvider将数据封装,只暴露出我们希望提供给其它程序的数据
③ ContentProvider统一了数据的访问方式,不必针对不同数据类型采取不同的访问策略
④ ContentProvider中可以注册观察者, 监听数据的变化
注意:1、配置信息中name 是完整的类名
2、authorities是访问Provider时的路径,一定要唯一