假设我们有2个APP程序(GG和MM),我们想让GG去操作MM中的数据。
第一步、在程序MM上自定义一个提供器MyProvider.java
package com.t20.provider; import com.t20.sqlite.dao.BaseDao; import android.content.ContentProvider; import android.content.ContentValues; import android.content.UriMatcher; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.net.Uri; public class MyProvider extends ContentProvider { private static final int UM_ALL = 0; private static final int UM_ID = 1; private BaseDao baseDao; //特殊的交流方式 private static UriMatcher uriMatcher; //暗语 (static静态代码块在类加载时,就会首先执行) static{ //初始化(NO_MATCH表示无暗号) uriMatcher=new UriMatcher(UriMatcher.NO_MATCH); //添加暗号 uriMatcher.addURI("com.xxx.provider", "student", UM_ALL); uriMatcher.addURI("com.xxx.provider", "studentById/#", UM_ID); //----------------------动作-------------表名-------常量 } @Override public boolean onCreate() { // TODO Auto-generated method stub //内容提供器(ContentProvider)里自带上下文 baseDao=new BaseDao(getContext()); return false; } /** * 查询数据 */ @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // TODO Auto-generated method stub //获取数据库 SQLiteDatabase db= baseDao.getReadableDatabase(); Cursor cursor=null; switch (uriMatcher.match(uri)) { case UM_ALL: //查询student表 cursor= db.query("student", projection, selection, selectionArgs, null, null, sortOrder); break; case UM_ID: //查询grade表 String id=uri.getPathSegments().get(1); cursor= db.query("student", projection, "id=?", new String[]{id}, null, null, sortOrder); break; } return cursor; } /** * 用于获取Uri对象所对应的MIME类型 */ @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } /** * 新增数据 */ @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } /** * 删除数据 */ @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub int num=0; switch (uriMatcher.match(uri)) { case UM_ID: //获取数据库 SQLiteDatabase db= baseDao.getReadableDatabase(); //获取Id String id=uri.getPathSegments().get(1); num=db.delete("student", "id=?", new String[]{id}); break; } return num; } /** * 更新数据 */ @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }
第二步、在程序MM的AndroidManifest.xml清单文件上注册内容提供器
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.t20.sqlite" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.t20.sqlite.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 注册内容提供器 --> <provider android:name="com.t20.provider.MyProvider" android:authorities="com.xxx.provider"> <!-- name为内容提供器类的全路径;authorities为主机名,是我们自定义的暗号动作. --> </provider> </application> </manifest>
第三步、在程序GG上,通过内容解析器(ContentResolver)操作程序MM中的数据
package com.t20.datareceiver; import java.util.ArrayList; import java.util.List; import com.t20.entity.Student; import android.net.Uri; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.ContentResolver; import android.database.Cursor; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class MainActivity extends Activity { private EditText et_query_id; private EditText et_del_id; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); et_query_id=(EditText) findViewById(R.id.et_query_id); et_del_id=(EditText) findViewById(R.id.et_del_id); } /** * 获取其他APP上的数据信息 * @param v */ public void getAllInfo(View v){ //获取内容解析器(ContentResolver) ContentResolver resolver= getContentResolver(); //定义一个URI(Uniform Resource Identifier 统一资源标示符) //查全部的学生 Uri uri=Uri.parse("content://com.xxx.provider/student"); //查询 Cursor cursor= resolver.query(uri, null, null, null, null); //定义一个学生集合 List<Student> stuList=new ArrayList<Student>(); if(cursor!=null){ while (cursor.moveToNext()) { int id= cursor.getInt(cursor.getColumnIndex("id")); String name=cursor.getString(cursor.getColumnIndex("name")); String sex=cursor.getString(cursor.getColumnIndex("sex")); Student stu=new Student(id, name, sex); stuList.add(stu); } if(stuList.size()==0){ Toast.makeText(this, "无数据", Toast.LENGTH_SHORT).show(); return; } //输出集合内容 AlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this); dialog.setTitle("学生列表:"); StringBuilder sb=new StringBuilder(); int i=0; for (Student student : stuList) { if(i!=0){ sb.append("\n"); } sb.append("序号:"+student.getId()+" 姓名:"+student.getName()+" 性别:"+student.getSex()); i++; } dialog.setMessage(sb); dialog.show(); }else{ Toast.makeText(this, "路径不存在", Toast.LENGTH_SHORT).show(); } if(cursor!=null){ cursor.close(); } } /** * 通过Id查询 * @param v */ public void queryById(View v){ //获取内容解析器(ContentResolver) ContentResolver resolver= getContentResolver(); //定义一个URI(Uniform Resource Identifier 统一资源标示符) //获取输入的id String qid=et_query_id.getText().toString(); //按学生ID查询 Uri uri=Uri.parse("content://com.xxx.provider/studentById/"+qid); //查询 Cursor cursor= resolver.query(uri, null, null, null, null); //定义一个学生集合 List<Student> stuList=new ArrayList<Student>(); if(cursor!=null){ while (cursor.moveToNext()) { int id= cursor.getInt(cursor.getColumnIndex("id")); String name=cursor.getString(cursor.getColumnIndex("name")); String sex=cursor.getString(cursor.getColumnIndex("sex")); Student stu=new Student(id, name, sex); stuList.add(stu); } if(stuList.size()==0){ Toast.makeText(this, "无数据", Toast.LENGTH_SHORT).show(); return; } //输出集合内容 AlertDialog.Builder dialog=new AlertDialog.Builder(MainActivity.this); dialog.setTitle("学生列表:"); StringBuilder sb=new StringBuilder(); int i=0; for (Student student : stuList) { if(i!=0){ sb.append("\n"); } sb.append("序号:"+student.getId()+" 姓名:"+student.getName()+" 性别:"+student.getSex()); i++; } dialog.setMessage(sb); dialog.show(); }else{ Toast.makeText(this, "路径不存在", Toast.LENGTH_SHORT).show(); } if(cursor!=null){ cursor.close(); } } /** * 通过Id删除 * @param v */ public void delById(View v){ //获取内容解析器(ContentResolver) ContentResolver resolver= getContentResolver(); //定义一个URI(Uniform Resource Identifier 统一资源标示符) //获取输入的id String did=et_del_id.getText().toString(); //按学生ID查询 Uri uri=Uri.parse("content://com.xxx.provider/studentById/"+did); //删除 int rowNum=resolver.delete(uri, null, null); if(rowNum>0){ Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "删除失败", Toast.LENGTH_SHORT).show(); } } }