android进阶:ContentProvider使用方法笔记
2017-03-03 14:58
363 查看
1、ContentProvider简介
在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。ContentProvider也是系统四大组件之一。
2、为什么要选择ContentProvider?
ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需。
3.Uri介绍:
Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
![](https://img-blog.csdn.net/20170303150246114?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMjE2ODc4NDc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse(“content://com.ljq.provider.personprovider/person”)
这里接着做一个简单的学生管理系统,里面的功能是添加信息,查看信息,删除信息和更改信息,其实和SQLite使用差不多,区别是ContentProvider是用来让其他程序来访问内部数据的,而且ContenProvider是四大组件,需要单独注册······
在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。ContentProvider也是系统四大组件之一。
2、为什么要选择ContentProvider?
ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需。
3.Uri介绍:
Uri代表了要操作的数据,Uri主要包含了两部分信息:1》需要操作的ContentProvider ,2》对ContentProvider中的什么数据进行操作,一个Uri由以下几部分组成:
ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx
当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse(“content://com.ljq.provider.personprovider/person”)
这里接着做一个简单的学生管理系统,里面的功能是添加信息,查看信息,删除信息和更改信息,其实和SQLite使用差不多,区别是ContentProvider是用来让其他程序来访问内部数据的,而且ContenProvider是四大组件,需要单独注册······
重写ContentProvider
public class MyContentProvider extends ContentProvider { private static UriMatcher uriMatcher = null; private static final int STUDENT =1; private static final int STUDENT_NUM =2; static { uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //uri的路径是: “/people” uriMatcher.addURI("com.czh.mycontentprovider.study", "student", STUDENT); //uri的路径是: “/people/10” uriMatcher.addURI("com.czh.mycontentprovider.study", "student/#", STUDENT_NUM); } @Override public boolean onCreate() { return false; } @Nullable @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { MySqliteOpenHelper mySqliteOpenHelper = new MySqliteOpenHelper(getContext()); SQLiteDatabase sql = mySqliteOpenHelper.getWritableDatabase(); int code = uriMatcher.match(uri); switch (code){ case STUDENT ://表 String sqlStr = "select * from student"; return sql.rawQuery(sqlStr,null); case STUDENT_NUM ://表中的某一条数据 long id = ContentUris.parseId(uri); String sqlNum = "select * from student where _id =" +id; return sql.rawQuery(sqlNum,null); } return null; } @Nullable @Override public String getType(Uri uri) { return null; } @Nullable @Override public Uri insert(Uri uri, ContentValues values) { MySqliteOpenHelper mySqliteOpenHelper = new MySqliteOpenHelper(getContext()); SQLiteDatabase sql = mySqliteOpenHelper.getWritableDatabase(); //String table, String nullColumnHack, ContentValues values long num = sql.insert("student",null,values); uri = ContentUris.withAppendedId(uri,num); return uri; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { //DELETE FROM COMPANY WHERE ID = 7; MySqliteOpenHelper mySqliteOpenHelper = new MySqliteOpenHelper(getContext()); SQLiteDatabase sql = mySqliteOpenHelper.getWritableDatabase(); //String table, String whereClause, String[] whereArgs int i = sql.delete("student",selection,selectionArgs); return i ; } @Override public int update(Uri uri, ContentValues values, String selection, String[] b7d3 selectionArgs) { MySqliteOpenHelper mySqliteOpenHelper = new MySqliteOpenHelper(getContext()); SQLiteDatabase sql = mySqliteOpenHelper.getWritableDatabase(); /* String table, ContentValues values, String whereClause, String[] whereArgs */ return sql.update("student",values,selection,selectionArgs); } }
2.注册ContentProvider
<provider android:name="com.czh.contentprovider.MyContentProvider" //每个ContentProvider需要具有唯一标识性 android:authorities="com.czh.mycontentprovider.study" //这个是程序的权限开关,因为每个程序都是独立运行的,权限默认为false,如果想让其他程序访问内部程序,需要改成true android:exported="true" />
3.外部应用修改程序
public class MainActivity extends BaseActivity implements View.OnClickListener{ private Button getData,delData,updateData,insertData; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); } public void findView(){ getData = (Button) findViewById(R.id.getData); getData.setOnClickListener(this); delData = (Button) findViewById(R.id.delData); delData.setOnClickListener(this); updateData = (Button) findViewById(R.id.updateData); updateData.setOnClickListener(this); insertData = (Button) findViewById(R.id.insertData); insertData.setOnClickListener(this); } @Override public void onClick(View v) { switch(v.getId()){ case R.id.getData: getData(); break; case R.id.delData: delData(); break; case R.id.updateData: updateData(); break; case R.id.insertData: insertData(); break; } } //删除信息 private void delData(){ //DELETE FROM student WHERE _id = 7; ContentResolver cr = getContentResolver(); String uriStr = "content://com.czh.mycontentprovider.study"; Uri uri = Uri.parse(uriStr); String selection = "name = '测试95'"; int i = cr.delete(uri,selection,null); Log.d("MyApp","删除了"+i+"条数据"); } //获取数据 private void getData(){ ContentResolver cr = getContentResolver(); String uriStr = "content://com.czh.mycontentprovider.study/student/"; Uri uri = Uri.parse(uriStr); Cursor cursor = cr.query(uri,null,null,null,null); if(cursor!=null&&cursor.getCount()>0){ cursor.moveToFirst(); boolean islast = false; while (!islast){ Log.d("MyApp","_id:"+cursor.getString(0)+" name:"+cursor.getString(1)+" age:"+cursor.getString(2)); cursor.moveToNext(); islast = cursor.isLast(); } }else Log.d("MyApp","cursor = null"); } //更改数据 private void updateData(){ ContentResolver crv = getContentResolver(); String uriStr = "content://com.czh.mycontentprovider.study"; Uri uri = Uri.parse(uriStr); String selection = "name = '小明'"; ContentValues values = new ContentValues(); values.put("name","小小明"); values.put("age",19); int i = crv.update(uri,values,selection,null); Log.d("MyApp","num:"+i); } 添加数据 private void insertData(){ ContentResolver cr = getContentResolver(); String uriStr = "content://com.czh.mycontentprovider.study"; Uri uri = Uri.parse(uriStr); ContentValues values = new ContentValues(); values.put("age",18); values.put("name","小亮"); Uri i = cr.insert(uri,values); Log.d("Myapp","num:"+i); } }
相关文章推荐
- Android笔记】Notification和NotificationManager的基本使用方法(转)
- 【Android】学习笔记(12)——Animation使用方法(下)
- 【Android进阶】关于PagerAdapter的使用方法的总结
- android基础笔记:数据库SQLite应用2(使用java方法)
- Android精简小笔记(5):Sqlite数据库的使用方法
- android中数据存储的contentprovider的使用方法
- Android开源:网络框架volley使用(一)---使用方法笔记
- 【Android】学习笔记(11)——Animation使用方法(上)
- APIDemo学习笔记——Android上几种简单的Animation使用方法(一)
- 【Android】学习笔记(10)——adb使用方法
- Android 开发笔记七 BaseAdpater 的使用及优化方法
- Android深入探究笔记之十 -- 使用 ContentProvider 共享数据(二),访问与添加通讯录
- .Net 转战 Android 4.4 日常笔记(9)--常用组件的使用方法[附源码]
- APIDemo学习笔记——Android上几种简单的Animation使用方法(三)——3D Transition
- 【Android】学习笔记(11)——Animation使用方法(上)
- Android深入探究笔记之十 -- 使用 ContentProvider 共享数据(二),访问与添加通讯录
- 【Android笔记】Notification和NotificationManager的基本使用方法
- [笔记] Android WebView使用方法
- Android开发记录八之ContentProvider的使用方法
- 【Android进阶】关于PagerAdapter的使用方法的总结