内容提供者
来源:互联网 发布:网络口碑维护 编辑:程序博客网 时间: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;}
当内容解析者在调用者四个方法的时候需要提供 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);} }}}
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- 内容提供者
- VC----MFC的消息映射机制
- PAT 1034. Head of a Gang (30)(孤岛以及一个奇怪的cost的计算问题)
- 阿里开源Mysql分布式中间件:Cobar
- ffmpeg处理RTMP流媒体的命令 发送流媒体的命令(UDP,RTP,RTMP)
- 苹果真机调试证书获取
- 内容提供者
- UML类图类的关系
- 数字图像处理基本知识
- 欢迎使用CSDN-markdown编辑器
- 声卡接口 LINE_IN、MIC_IN、LINE_OUT
- Java compiler level does not match 问题解决
- 学无止境,接着学吧
- /dev/null 2>&1
- HBase 在HDFS 上的目录树