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

本文详细介绍了Android中内容提供器的实现方法,包括定义内容提供器、注册过程及其实现代码。同时,还讲解了如何使用内容解析器进行数据的查询、删除和新增操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在上篇博客的项目的基础上进行拓展,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文件中

<?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.StudentProvider"
            android:authorities="com.xxx.provider" >
        </provider>
    </application>

</manifest>

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

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文件中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <!-- 查询全部信息 -->
    <Button
        android:id="@+id/btnInfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:onClick="info"
        android:text="获取信息" />

    

    <EditText
        android:id="@+id/etId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/btnInfo"
        android:layout_marginTop="37dp"
        android:layout_toLeftOf="@+id/btnInfo"
        android:ems="10" />
    
	<!-- 按id查询信息 -->
    <Button
        android:id="@+id/btnInfoById"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/etId"
        android:layout_toRightOf="@+id/etId"
        android:text="按id查询信息" 
        android:onClick="infoById"/>
	
    <!-- 根据id删除信息 -->
    <Button
        android:id="@+id/btnDeleteById"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/btnInfo"
        android:layout_below="@+id/btnInfoById"
        android:layout_marginTop="17dp"
        android:text="根据id删除信息" 
        android:onClick="DeleteById"/>

    <!-- 新增数据 -->
    <Button
        android:id="@+id/btnInsert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/btnDeleteById"
        android:layout_below="@+id/btnDeleteById"
        android:layout_marginLeft="17dp"
        android:layout_marginTop="28dp"
        android:text="新增数据"
        android:onClick="insert" />

</RelativeLayout>

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/");

	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值