内容提供者

来源:互联网 发布:网络口碑维护 编辑:程序博客网 时间:2024/04/27 01:34

------------------------------------------------------------------自定义内容提供者---------------------------------------------------------------------内容提供者的格式,sURImatcher。。。


什么是内容提供者及其作用:内容提供者其实就是一个中间着,它可以理解为数据库和应用程序之间的桥梁,当我们在应用程序中要或者一些数据,比如短信或者联系人数据的时候,我们不可能直接从数据库中获取,这就需要内容提供者来提供了,我们不用管数据库,而是直接通过内容解析者getContentResolver( )来调用内容提供者提供的增删改查函数即可。。。


一、---框架---


(1)自定义数据库的一个操作类MyOpenHelper,其继承自SQLiteOpenHelper,使用其新建数据库并插入数据

(2)自定义内容提供者AccountProvider,其继承自ContentProvider,封装uri,定义四个方法--《增删改查

(3)书写布局文件,在布局中添加--增删改查--四个按键

(4)在ManiActivity中添加对应按键的点击事件,当我点击时实现增删改查


二、---布局创建---


布局就是四个按键的,可以一带而过。。。

    <Button        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="click1"        android:text="add" />    <Button        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="click2"        android:text="del" />    <Button        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="click3"        android:text="update" />    <Button        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:onClick="click4"        android:text="query" />



三、---数据库创建---



数据库的创建也是很简单的,通过继承SQLiteOpenHelper就可以创建一个名字为Account.db的数据库,然后通过onCreate()函数来为其添加数据,也就是通过执行SQL语句。

public class MyOpenHelper extends SQLiteOpenHelper {public MyOpenHelper(Context context) {/** * name 数据库的名字  * factory 游标工厂  * version  版本 */super(context, "Account.db", null, 1);/** * Called when the database is created for the first time * 当数据库第一次 创建的时候调用 那么这个方法特别适合做 表结构的初始化  */public void onCreate(SQLiteDatabase db) {db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),money varchar(20))");db.execSQL("insert into info(name,money) values(?,?)", new String[]{"张三","5000"});db.execSQL("insert into info(name,money) values(?,?)", new String[]{"李四","3000"});}public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}


四、---ContentProvider---



下面才是我们自己定义的--内容提供者--了,其实内容提供者一般是不需要我们自己来进行定义的,但是为了了解其内部的原理,这里我们自己来定义一下,加深印象。

public class AccountProvider extends ContentProvider

(1)自定内容提供者关键的就是 URI 的构造,我们使用 UriMatcher 来进行 URI 路劲匹配器的创建,然后在静态代码块中进行 uri 路径匹配的创建,这样就可以了

//[1]定一个一个uri路径匹配器 private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);private static final int QUERYSUCESS  = 0;  //ctrl+shift+X  变大写   小写加yprivate static final int INSERTSUCESS = 1;private static final int UPDATESUCESS = 2;private static final int DELETESUCESS = 3;private MyOpenHelper myOpenHelper;//[2]创建一个静态代码块 在这个里面添加 uri static{/**http://www.baidu.com  * authority 注意: 和清单文件里面定义的一样  com.itheima.provider/query   */sURIMatcher.addURI("com.itheima.provider", "query", QUERYSUCESS);sURIMatcher.addURI("com.itheima.provider", "insert", INSERTSUCESS);sURIMatcher.addURI("com.itheima.provider", "update", UPDATESUCESS);sURIMatcher.addURI("com.itheima.provider", "delete", DELETESUCESS);}//当内容提供者初始化  会执行此方法 public boolean onCreate() {//[3]初始化 myopenHelpler 对象    就可以获取到sqlitedatabases对象 我们就可以操作数据库 myOpenHelper = new MyOpenHelper(getContext());return false;}


(2)进行--增删改查--四个方法的构造,我们的内容提供者提供的就是这四个方法,在这四个方法中定义了对数据库的各种操作。

当内容解析者在调用者四个方法的时候需要提供 URI,在这四个方法中首先要判断解析者提供的 URI 是否想我们自己定义URI是相匹配的,如果相匹配才可以继续执行。。

//查询的方法,这个方法对外暴露的 public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {int code = sURIMatcher.match(uri);if (code ==QUERYSUCESS) {//说明路径匹配成功SQLiteDatabase db = myOpenHelper.getReadableDatabase();//调用query方法Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);//发送一条消息 说明数据库被操作了 getContext().getContentResolver().notifyChange(uri, null);//小细节 ☆ 这个cursor不能关 return cursor;}else{//说明路径不匹配throw new IllegalArgumentException("哥们 :uri路径不匹配 请检测路径");}}public String getType(Uri uri) {return null;}//插入的方法,其中value是一个键值对public Uri insert(Uri uri, ContentValues values) {int code = sURIMatcher.match(uri);if (code == INSERTSUCESS) {//说明路径匹配成功 SQLiteDatabase db = myOpenHelper.getReadableDatabase();long insert = db.insert("info", null, values);Uri uri2 = Uri.parse("com.hahaheheheihei/"+insert); if (insert>0) {//发送一条消息 说明说明数据库被操作了 getContext().getContentResolver().notifyChange(uri, null);}db.close();//关闭数据库return uri2;}else {throw new IllegalArgumentException("姐们 :uri路径不匹配 请检测路径");}}// 删除的操作public int delete(Uri uri, String selection, String[] selectionArgs) {int code = sURIMatcher.match(uri);if (code == DELETESUCESS) {//匹配成功 SQLiteDatabase db = myOpenHelper.getReadableDatabase();//代表影响的行数int delete = db.delete("info", selection, selectionArgs);if (delete>0) {//发送一条消息 说明说明数据库被操作了 getContext().getContentResolver().notifyChange(uri, null);}return delete;}return 0;}// 更改的操作public int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {int code = sURIMatcher.match(uri);if (code == UPDATESUCESS) {//路径匹配成功SQLiteDatabase db = myOpenHelper.getWritableDatabase();//代表影响的行数 int update = db.update("info", values, selection, selectionArgs);if(update>0){//发送一条消息 说明说明数据库被操作了 getContext().getContentResolver().notifyChange(uri, null);}return update;}else{throw new IllegalArgumentException("大爷:uri路径不匹配 请检测路径");}}


五、---点击事件---


要实现增删改查,下面就只有一步了,就是定义点击事件,分别定义Click1234四个方法即可

public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}//点击按钮 往数据库里面插入一条数据public void click1(View v){//因为第一个应用里面的私有的数据库 已经通过内容提供者暴露出来了 所以通过内容解析者去获取数据Uri uri = Uri.parse("content://com.itheima.provider/insert");ContentValues values = new ContentValues(); //实际是map  //key:  代表列名  value 对应的值 values.put("name", "zhaoliu");values.put("money", 1000);//插入一条数据Uri uri2 = getContentResolver().insert(uri, values);System.out.println("uri2:"+uri2);}//点击按钮删除 赵六删掉public void click2(View v){//[1]获取内容的解析者 Uri uri = Uri.parse("content://com.itheima.provider/delete");//[2]代表影响的函数int delete = getContentResolver().delete(uri, "name=?", new String[]{"zhaoliu"});Toast.makeText(getApplicationContext(), "删除了"+delete+"行", 1).show();}//给赵六多点钱  1000元public void click3(View v){//[1] 创建uri    Uri uri = Uri.parse("content://com.itheima.provider/update");//[2]获取内容的解析者    ContentValues values = new ContentValues();    values.put("money", "10000000");    int update = getContentResolver().update(uri, values, "name=?",new String[]{"zhaoliu"});    Toast.makeText(getApplicationContext(), "更新了"+update+"行", 1).show();}//点击按钮 查询第一个应用里面数据库的信息 public void click4(View v){// 第二种 查询方式  因为第一个应用里面的私有的数据库 已经通过内容提供者暴露出来了 所以通过内容解析者去获取数据Uri uri = Uri.parse("content://com.itheima.provider/query");//获取内容解析者获取数据Cursor cursor = getContentResolver().query(uri, new String[]{"name","money"}, null, null, null);         if (cursor!=null) {while(cursor.moveToNext()){String name = cursor.getString(0);String money = cursor.getString(1);System.out.println("第二个应用:"+name+"---"+money);}         }}}



当我们在点击--增删改查--四个按钮的时候就可以看到LogCat中数据的变化。




1 0
原创粉丝点击