Android应用间数据传递:ContentProvider
来源:互联网 发布:网络工程和网络布线 编辑:程序博客网 时间:2024/05/16 14:27
ContentProvider在android中的作用是用于应用间数据的传递,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对你应用中的数据进行添删改查。 Android内置的许多数据就是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)。关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用XML文件对外共享数据,需要进行xml解析才能读取数据;采用SharedPreferences共享数据,需要使用SharedPreferences API读取数据。
使用ContentProvider对外共享数据的好处是统一了数据的访问方式。
要想使用ContentProvider在应用间传递数据,首先我们要创建一个类,继承ContentProvider,然后重写增删改查等方法,从而对数据进行处理。
第一步:
我们创建一个ProviderWrite工程,在该工程中定义一个类,继承ContentProvider。ContentProvider对数据的处理和数据库相似,所以我们就把要共享的数据存放在数据库中
public class MyProvider extends ContentProvider { public static final Uri URI = Uri.parse("content://com.ProviderWrite.MyProvider"); //必须添加固定的头文件content:// 而后面一连串的数据是MyProvider注册时指定的主机名/域名值 SQLiteDatabase db; @Override public boolean onCreate() { db = getContext().openOrCreateDatabase("provider", Context.MODE_PRIVATE,null); //打开或创建一个数据库 Cursor c = db.rawQuery("select count(*) as c from sqlite_master where type='table' and name='tab'" , null); //判断数据库db中是否已经有表tab c.moveToFirst(); //将c指向第一条数据 if (c.getInt(0) == 0) { //如果数据库中的这一个数据是null,就会直接返回0 db.execSQL("create table tab(_id integer primary key autoincrement,name text not null)"); //在数据库中创建表tab } return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor cursor = db.query("tab",null,null,null,null,null,null); //查询表中所有数据 return cursor; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { db.insert("tab","_id",values); //在表中插入数据 return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; }}
第二步:
然后,我们还要在ProviderWrite的AndroidManifest中对MyProvider进行注册声明
<provider android:exported="true" <!- 设置导出为true,否则其他应用无法访问-> android:authorities="com.ProviderWrite.MyProvider" <!- authorities的值用来指定主机名/域名,用于提供外部访问-> android:name=".Myprovider"/>
通过上面两步操作,我们已经可以简单的增加数据和查找数据了。
第三步:
下面,我们在ProviderWrite的MainActivity中编写插入数据代码:
ContentValues values1 = new ContentValues(); //实例化一个ContentValuesvalues1.put("name","张三");getContentResolver().insert(Myprovider.URI,values1); //使用系统提供的getContentResolver的inset方法,插入一条数据ContentValues values2 = new ContentValues();values2.put("name","李四");getContentResolver().insert(Myprovider.URI,values2);
第四步:
通过上面的步骤,我们的ProviderWrite应用的provider数据库中已经有数据了,下面我们再创建一个ProviderRead工程,在这个工程中,我们将使用ProviderWrite中的MyProvider的authorities属性值,来创建一个Uri,通过这个来获取数据:
public static final Uri URI = Uri.parse("content://com.ProviderWrite.MyProvider"); //创建一个Uri @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Cursor cursor = getContentResolver().query(URI,null,null,null,null,null); //通过Uri来查询数据 cursor.moveToFirst(); for (int i = 0;i<cursor.getCount();i++){ Toast.makeText(MainActivity.this, cursor.getString(cursor.getColumnIndex("name")), Toast.LENGTH_LONG).show(); cursor.moveToNext(); } }
通过上面的四步操作,我们就完成了使用ContentProvider来进行Android应用间数据传递的全部步骤。
- Android应用间数据传递:ContentProvider
- Android——使用ContentProvider在应用间传递数据
- android应用间数据传递(使用ContentProvider及SQLite在应用间传递数据)
- Android应用间数据共享之ContentProvider
- Android应用间数据共享之ContentProvider
- Android四大组件之ContentProvider实现多应用之间传递数据实例
- 再探Android多应用间数据共享机制,自定义ContentProvider
- android ContentProvider简单实现不同应用间的数据共享
- android通过ContentProvider实现应用间的数据共享
- ContentProvider和app间传递数据
- Android应用使用ContentProvider共享数据
- Android ContentProvider应用
- 【Android】使用ContentProvider进行应用之间的数据共享
- Android-ContentProvider之应用之间互传数据-Oak先生
- android 多媒体数据 ContentProvider
- Android -----数据共享ContentProvider
- 应用间简单数据传递
- 【笨鸟先飞】android重新学习日记7---传递数据的方法(contentProvider)
- Java集合之WeakHashMap、IdentityHashMap、EnumMap介绍
- 51NOD 1116 K进制下的大数
- 字段名与实体类属性不匹配([尚硅谷]_张晓飞_Mybatis 学习笔记二)
- setting up a new remote git repository
- 表一对一关联([尚硅谷]_张晓飞_Mybatis 学习笔记三)
- Android应用间数据传递:ContentProvider
- 表一对多关联([尚硅谷]_张晓飞_Mybatis 学习笔记四)
- 单片机==独立按键+数码管计数+扫描法(8)
- 剑指offer--面试题24: 二叉搜索树的后序遍历序列
- curl命令
- 条件筛选([尚硅谷]_张晓飞_Mybatis 学习笔记五)
- 一、二级缓存([尚硅谷]_张晓飞_Mybatis 学习笔记六)
- [尚硅谷例题]_pl_sql
- 表达式求值