Android使用内容提供器(ContentProvider)访问和操作其他程序中的数据

匿名 (未验证) 提交于 2019-12-03 00:38:01

假设我们有2个APP程序(GGMM),我们想让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(); 		} 	}  } 



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!