跨程序共享数据--内容提供器

一、内容提供器部分(第一个项目)

在上篇博客的项目的基础上进行拓展,BaseDao.java、StudentDaoImpl.java、Student.java以及MainActivity.java等文件不再重复追加

1、定义内容提供器

StudentProvider.java文件中

package com.t20.provider;

import com.t20.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;

/**
 * 内容提供器
 * 
 * @author Administrator
 * 
 */
public class StudentProvider extends ContentProvider {

	// 定义一个静态的暗语
	private static UriMatcher uriMatcher;
	private static final int QUERY_ALL = 0;// 查询全部信息
	private static final int QUERY_ID = 1;// 根据id查询信息
	private static final int DELETE_ID = 2;// 删除
	private static final int INSERT_ID = 3;// 新增
	private static final int INSERT_ALL = 0;
	private BaseDao baseDao;

	// 在定义类对象时执行
	static {
		// 在创建时没有暗语
		uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
		
		// 新增暗语,第一个参数是动作,第二个参数是表名(路径),QUERY_ALL查询全部
		uriMatcher.addURI("com.xxx.provider", "student", QUERY_ALL);

		// studentById/#中#是id的占位符
		uriMatcher.addURI("com.xxx.provider", "studentById/#", QUERY_ID);

		// 根据id删除信息
		uriMatcher.addURI("com.xxx.provider", "deleteById/#", DELETE_ID);
		
		//新增信息暗语
		uriMatcher.addURI("com.xxx.provider", "insert", INSERT_ID);
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		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 cur = null;
		switch (uriMatcher.match(uri)) {
		// 查询全部信息
		case QUERY_ALL:
			// 第一个参数是要查询的表名, 第二个参数是要查询的列,null表示查询全部
			cur = db.query("student", projection, selection, selectionArgs,
					null, null, sortOrder);
			break;
		// 按id查询信息
		case QUERY_ID:
			// get(0)是studentById,get(1)是id
			String id = uri.getPathSegments().get(1);

			// 第一个参数是要查询的表名
			cur = db.query("student", projection, "id=?", new String[] { id },
					null, null, sortOrder);
			break;

		default:
			break;
		}

		return cur;
	}

	@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
		SQLiteDatabase db = baseDao.getReadableDatabase();

		Uri uriReturn=null;
		switch (uriMatcher.match(uri)) {
		// 新增信息
		case INSERT_ID:
		case INSERT_ALL:
			long newBookId=db.insert("student", null, values);
			uriReturn=Uri.parse("content://com.xxx.provider/insert/");
			break;

		default:
			break;
		}

		return uriReturn;
	}

	/**
	 * 删除方法
	 */
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		SQLiteDatabase db = baseDao.getReadableDatabase();

		int rowCount = 0;
		switch (uriMatcher.match(uri)) {
		// 根据id删除信息
		case DELETE_ID:
			// get(0)是studentById,get(1)是id
			String id = uri.getPathSegments().get(1);
			// 方式一,在内容提供器设置参数
			// rowCount = db.delete("student", "id=?", new String[] { id });
			// 方式二,在解析器传值过来
			rowCount = db.delete("student", selection, selectionArgs);
			break;

		default:
			break;
		}

		return rowCount;
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		// TODO Auto-generated method stub
		return 0;
	}

}

2、注册内容提供器

AndroidManifest.xml文件中




    

    
        
            
                

                
            
        

        
        
        
    

二、内容解析器部分(第二个项目)

1、创建与数据库中对应的实体类

Student.java文件中

package com.t20.entity;

import java.io.Serializable;

public class Student implements Serializable {
	private Integer id;
	private String name;
	private String sex;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public Student() {
		super();
	}
	
	public Student(String name,String sex) {
		super();
		this.name = name;
		this.sex = sex;
	}
	
	public Student(Integer id,String name,String sex) {
		super();
		this.id = id;
		this.name = name;
		this.sex = sex;
	}
}

2、创建布局

activity_main.xml文件中



    
    

3.实现对应的方法

MainActivity.java文件中

package com.t20.dataReceiver;

import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;

public class MainActivity extends Activity {
	private EditText etId;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		etId = (EditText) findViewById(R.id.etId);
	}

	/**
	 * 查询全部信息
	 * 
	 * @param v
	 */
	public void info(View v) {
		// 获取内容解析器
		ContentResolver resolver = getContentResolver();
		// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
		Uri uri = Uri.parse("content://com.xxx.provider/student");
		// 调用查询方法返回游标,参数对应内容提供器的查询方法对应
		Cursor cur = resolver.query(uri, null, null, null, null);
		StringBuilder sb = new StringBuilder();
		while (cur.moveToNext()) {
			sb.append("id:" + cur.getInt(cur.getColumnIndex("id")) + "\t");
			sb.append("name:" + cur.getString(cur.getColumnIndex("name"))
					+ "\t");
			sb.append("sex:" + cur.getString(cur.getColumnIndex("sex")) + "\n");
		}
		Toast.makeText(this, sb, Toast.LENGTH_SHORT).show();
		cur.close();
	}

	/**
	 * 根据id查询信息
	 * 
	 * @param v
	 */
	public void infoById(View v) {
		// 获取内容解析器
		ContentResolver resolver = getContentResolver();

		// 获取到id
		String id = etId.getText().toString();

		// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
		Uri uri = Uri.parse("content://com.xxx.provider/studentById/" + id);

		// 调用查询方法返回游标,参数对应内容提供器的查询方法对应
		Cursor cur = resolver.query(uri, null, null, null, null);
		StringBuilder sb = new StringBuilder();
		if (cur != null) {
			while (cur.moveToNext()) {
				sb.append("id:" + cur.getInt(cur.getColumnIndex("id")) + "\t");
				sb.append("name:" + cur.getString(cur.getColumnIndex("name"))
						+ "\t");
				sb.append("sex:" + cur.getString(cur.getColumnIndex("sex"))
						+ "\n");
			}
			Toast.makeText(this, sb, Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(this, "数据不存在!", Toast.LENGTH_SHORT).show();
		}
		if (cur != null) {
			cur.close();
		}

	}

	/**
	 * 根据id删除信息
	 * 
	 * @param v
	 */
	public void DeleteById(View v) {
		// 获取内容解析器
		ContentResolver resolver = getContentResolver();

		// 获取到id
		String id = etId.getText().toString();

		// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
		Uri uri = Uri.parse("content://com.xxx.provider/deleteById/" + id);

		// //方式一,在内容提供器设置参数
		// int rowCount=resolver.delete(uri, null, null);

		// //方式二,在解析器设置参数,传递到内容提供器中
		int rowCount = resolver.delete(uri, "id=?", new String[] { id });

		if (rowCount > 0) {
			Toast.makeText(this, "删除成功!", Toast.LENGTH_SHORT).show();
		} else {
			Toast.makeText(this, "删除失败!", Toast.LENGTH_SHORT).show();
		}
	}

	/**
	 * 新增数据
	 */
	public void insert(View v) {
		// 获取内容解析器
		ContentResolver resolver = getContentResolver();
		
		// 统一资源标识符,动作必须与内容提供器定义的动作一致,student必须和内容提供器暗语的路径一致
		Uri uri = Uri.parse("content://com.xxx.provider/insert/");

	}
}

你可能感兴趣的:(安卓)