Android--简单开发和使用ContentProvider数据共享
今天学习的时候学到了ContentProvider数据共享这个东东,所以自己写了个小例子:
我们要开发ContentProvider的话,需要创建一个类去继承ContentProvider,里面会让你重写四个方法,这四个方法就是数据共享用到的方法
包括SQLite的插入、查询、删除。。
所以,如何共享我们的数据,就看你如何重写这几个方法。
下面是操作步骤,我是用Android studio写的
1、先看工程结构
2、我们建立一个继承ContentProvider的类,创建步骤(右键→new→othet→Provider)
3、ContentProvider共享的数据是SQLite里面的数据,为了方便我把创建SQLite的数据库和创建表的操作也写在了ContentProvider的onCreate()方法里面了
代码
package provider;import android.content.ContentProvider; import android.content.ContentUris; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri;import toolclass.MySQLiteOpenHelper;public class MyContentProvider extends ContentProvider {private static final String AUTHORITY = "com.example.fanlei.mycontentprovider";//地址private static final String DB_FILE = "friends.db";//数据库名称private static final String DB_TABLE = "friends"; //表名private static final int URI_ROOT = -1;private static final int DB_TABLE_FRIENDS = 1;public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + DB_TABLE);//Uri所对应的资源private static final UriMatcher uriMatcher = new UriMatcher(URI_ROOT);//检查传过来的Uristatic {uriMatcher.addURI(AUTHORITY,DB_TABLE,DB_TABLE_FRIENDS);}private MySQLiteOpenHelper helper;private SQLiteDatabase db;public MyContentProvider() {}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic String getType(Uri uri) {// TODO: Implement this to handle requests for the MIME type of the data// at the given URI.throw new UnsupportedOperationException("Not yet implemented");}@Overridepublic Uri insert(Uri uri, ContentValues values) {//检查传过来的Uri是否是正确的,若不正确,则抛出异常if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){throw new IllegalArgumentException("Unknown URI:" + uri);}Long rawId = db.insert(DB_TABLE,null,values);Uri returnUri = ContentUris.withAppendedId(CONTENT_URI,rawId);getContext().getContentResolver().notifyChange(returnUri,null);return returnUri;}@Overridepublic boolean onCreate() {helper = new MySQLiteOpenHelper(getContext(),DB_FILE,null,1);db = helper.getWritableDatabase();String sql = "CREATE TABLE IF NOT EXISTS " + DB_TABLE +"(" +"_id primary key," +"name text," +"sexId text," +"address text);";db.execSQL(sql);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {//检查传过来的Uri是否是正确的,若不正确,则抛出异常if (uriMatcher.match(uri) != DB_TABLE_FRIENDS){throw new IllegalArgumentException("Unknown URI:" + uri);}Cursor cursor = db.query(true,DB_TABLE,projection,selection,selectionArgs,null,null,sortOrder,null);cursor.setNotificationUri(getContext().getContentResolver(),uri);return cursor;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO: Implement this to handle requests to update one or more rows.throw new UnsupportedOperationException("Not yet implemented");} }
其实,ContentProvider里面重写的方法也是封装了SQLiteDataBase的方法的操作,只不过他需要一个具体的Uri去指向我们具体的资源。
ContentProvider开发完成后,我在主函数里面调用了我们写的这个ContentProvider里面的方法,布局什么的都很简单。
我只是插入了数据,查询数据
下面是主函数:
package com.example.fanlei.mycontentproviderdemo;import android.annotation.TargetApi; import android.content.ContentResolver; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import provider.MyContentProvider;public class MainActivity2 extends ActionBarActivity {private ContentResolver contentResolver;private Uri uri;private EditText et_1,et_2,et_3;private Button btn_1,btn_2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main_activity2);contentResolver = getContentResolver();uri = MyContentProvider.CONTENT_URI;et_1 = (EditText) findViewById(R.id.et_1);et_2 = (EditText) findViewById(R.id.et_2);et_3 = (EditText) findViewById(R.id.et_3);btn_1 = (Button) findViewById(R.id.btn_1);btn_2 = (Button) findViewById(R.id.btn_2);//加入btn_1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {ContentValues cv = new ContentValues();//键值 就是 列名cv.put("name",et_1.getText().toString());cv.put("sexId",et_2.getText().toString());cv.put("address",et_3.getText().toString());contentResolver.insert(uri,cv);Toast.makeText(MainActivity2.this,"加入成功",Toast.LENGTH_SHORT).show();}});//查询btn_2.setOnClickListener(new View.OnClickListener() {@TargetApi(Build.VERSION_CODES.JELLY_BEAN)@Overridepublic void onClick(View v) {Cursor cursor = contentResolver.query(uri,null,"name like ?",new String[]{"%23%"},null,null);while (cursor.moveToNext()){String name = cursor.getString(cursor.getColumnIndex("name"));String sexId = cursor.getString(cursor.getColumnIndex("sexId"));String address = cursor.getString(cursor.getColumnIndex("address"));Log.d("asdasd",name+"^^"+sexId+"^^"+address);}}});} }
====================================以上是简单的开发=======================================
下面是使用我们上面的工程创建的ContentProvider
先看工程结构:
我这里建立了一个工具类去存放上一个工程Uri。
布局什么的都很简单,就一个TextView和Button,就不放了。
下面是主函数的代码
package com.example.fanlei.textmycontentproviderdemo;import android.content.ContentResolver; import android.database.ContentObserver; import android.database.Cursor; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.ActionBarActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView;import provider.PeopleInfoProvider;public class MainActivity extends ActionBarActivity {private TextView tv_show;private Button button;private ContentResolver contentResolver;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);contentResolver = getContentResolver();tv_show = (TextView) findViewById(R.id.tv_show);button = (Button) findViewById(R.id.btn);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);StringBuilder sb = new StringBuilder();while (cursor.moveToNext()){String name = cursor.getString(cursor.getColumnIndex("name"));String sexId = cursor.getString(cursor.getColumnIndex("sexId"));String address = cursor.getString(cursor.getColumnIndex("address"));sb.append(name).append(sexId).append(address);}tv_show.setText(sb.toString());}});contentResolver.registerContentObserver(PeopleInfoProvider.CONTENT_URI,true,new MyObserver(new Handler()));}private class MyObserver extends ContentObserver{/*** Creates a content observer.* @param handler The handler to run {@link #onChange} on, or null if none.*/public MyObserver(Handler handler) {super(handler);}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);Cursor cursor = contentResolver.query(PeopleInfoProvider.CONTENT_URI,null,null,null,null);StringBuilder sb = new StringBuilder();while (cursor.moveToNext()){String name = cursor.getString(cursor.getColumnIndex("name"));String sexId = cursor.getString(cursor.getColumnIndex("sexId"));String address = cursor.getString(cursor.getColumnIndex("address"));sb.append(name).append(sexId).append(address);Log.d("-----update----",sb.toString());}tv_show.setText(sb.toString());}} }
对了,这里我写了一个内部类去继承了ContentObserver这个类,它的作用就是当共享的数据发生改变时,就会触发这个方法。
转载于:https://www.cnblogs.com/819158327fan/p/4939123.html
Android--简单开发和使用ContentProvider数据共享相关推荐
- 【ANDROID游戏开发十六】ANDROID GESTURE之【触摸屏手势识别】操作!利用触摸屏手势实现一个简单切换图片的功能!...
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/337.html - ...
- 【Android 应用开发】Google 官方 EasyPermissions 权限申请库 ( 最简单用法 | 一行代码搞定权限申请 | 推荐用法 )
文章目录 一.添加依赖 二.在 AndroidManifest.xml 中配置权限 三.权限申请最简单用法 四.推荐使用的用法 五.GitHub 地址 上一篇博客 [Android 应用开发]Goog ...
- android app启动图片 加动画效果,Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案...
Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案 大家在设计APP的末期,都会想给APP搞一些"花里胡哨"的特效来提高APP的B格.博主表示亲测有效 ...
- 简单开发的android阅读器源码,包含了读取数据库和文件流处理功能
原文:简单开发的android阅读器源码,包含了读取数据库和文件流处理功能 源代码下载地址:http://www.zuidaima.com/share/1838906559466496.htm 简单地 ...
- android简单网页浏览器的开发
android简单网页浏览器的开发 @author:郑海波 http://blog.csdn.net/nuptboyzhb/ 功能概要: 1.用WebView控件实现简单浏览器的开发 2.实现了网页浏 ...
- (超多图)基于Android studio开发的一个简单入门小应用(超级详细!!)(建议收藏)
基于Android studio开发的一个简单入门小应用 一.前言 二.前期准备 三.开发一个小应用 五.运行应用 一.前言 在暑假期间,我学习JAVA基础,为了能早日实现自己用代码写出一个app的& ...
- android蓝牙简单开发
概述 前段时间学习了一些蓝牙开发的知识,记录一下Android中蓝牙的简单开发.下面是最重要的两个类. BluetoothAdapter : 蓝牙适配器,通过getDefaultAdapter ()去 ...
- android签到功能开发,Android应用开发之Android简单实现app每月签到功能
本文将带你了解Android应用开发Android简单实现app每月签到功能,希望本文对大家学Android有所帮助. 本文实例为大家分享了Android实现app每月签到功能的具体代码,供大家参考, ...
- Android简单的模块化开发
1.为什么要模块开发 1.解耦性强:随着业务的增多,代码变的越来越复杂,每个模块之间的代码耦合变得越来越严重,解耦问题急需解决. 2. 编译时间大大减少:以为业务场景对,代码越来越大,同时编译时间也会 ...
- 安卓 Android之开发简单小应用(一)
安卓 Android之开发简单小应用(一) 一.简述 记 --没学过Android之开发简单小应用.(课程设计作业) 例子打包:链接:https://pan.baidu.com/s/1LEQ1oWkU ...
最新文章
- 福利 | 50张第四届UBDC全域大数据峰会赠票大放送!
- 戴尔t410支持哪些服务器系统,DELL服务器T410
- php中怎么定义page,css @page的使用与定义详解
- Vim 上手指南【基础、中级】
- 线上图片批量更换脚本记录
- 我要自学网python视频教程_人生苦短,请用Python!学习Python的四大理由
- 百度贴吧排名计算方式
- 射击比赛(java)
- 反编译工具Reflector使用方法
- 基于微服务架构的门户平台改造的研究
- 配置Keepalived双实例高可用Nginx
- IDEA添加项目启动配置
- crx文件怎么打开(谷歌crx文件怎么打开)
- Web端网页QQ临时会话在线咨询
- 用计算机视觉描述机器人,计算机视觉和机器人视觉概述
- 服务器连无线路由器视频教程,远程服务器路由器设置教程视频
- Java8 Stream:20+实际例子,玩转集合的筛选、归约、分组、聚合
- 【排序-简单】1528. 重新排列字符串
- CUDA学习-cdp快排实现(一次快排)
- 国债是什么?国债逆回购是什么?国债逆回购是低风险高回报的投资方式之一