`

自定义ContentProvider

 
阅读更多

自定义ContentProvider,根据不同的条件查询不同的数据:

activity:

public class MainActivity extends Activity implements OnClickListener {
	private ListView lv_list;
	private Button btn_city_code, btn_all_city, btn_city_name, btn_provinces;
	private ContentResolver contentResolver;
	private Uri uri;
	private Cursor cursor;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		lv_list = (ListView) findViewById(R.id.lv_lsit);
		btn_all_city = (Button) findViewById(R.id.btn_all_city);
		btn_city_code = (Button) findViewById(R.id.btn_city_code);
		btn_city_name = (Button) findViewById(R.id.btn_city_name);
		btn_provinces = (Button) findViewById(R.id.btn_provinces);
		contentResolver = getContentResolver();
		btn_all_city.setOnClickListener(this);
		btn_city_code.setOnClickListener(this);
		btn_city_name.setOnClickListener(this);
		btn_provinces.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btn_all_city:
			uri = Uri.parse("content://com.example.contetnprovider/cities");
			break;
		case R.id.btn_city_code:
			uri = Uri.parse("content://com.example.contetnprovider/code/024");
			break;
		case R.id.btn_city_name:
			uri = Uri.parse("content://com.example.contetnprovider/name/沈阳");
			break;
		case R.id.btn_provinces:
			uri = Uri.parse("content://com.example.contetnprovider/cities_in_province/辽宁");
			break;
		default:
			break;
		}
		cursor = contentResolver.query(uri, new String[] {"city_code as _id","city_name","province_code"}, null, null, null);
		SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.list_item, cursor, new String[]{"city_name"}, new int[] {R.id.tv_name});
		lv_list.setAdapter(simpleCursorAdapter);
	}
}

    继承contentprovider:

public class RegionContentProvider extends ContentProvider {
    private static UriMatcher uriMatcher;
    private static final String AUTOHORITH = "com.example.contetnprovider";
    // 下面是4个常量是返回码
    private static final int CITIES = 1;
    private static final int CITY_CODE = 2;
    private static final int CITY_NAME = 3;
    private static final int CITITE_IN_PROVINCE = 4;
    private SQLiteDatabase database;
    static {
    	uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    	// 用于查询所有城市的url
    	uriMatcher.addURI(AUTOHORITH, "cities", CITIES);
    	// 用于根据城市代码查询城市信息的url
    	uriMatcher.addURI(AUTOHORITH, "code/#", CITY_CODE);
    	// 用于根据城市名称查询城市信息
    	uriMatcher.addURI(AUTOHORITH, "name/*", CITY_NAME);
    	// 用于根据省名查询省内所有城市信息
    	uriMatcher.addURI(AUTOHORITH, "cities_in_province/*", CITITE_IN_PROVINCE);
    }
    private SQLiteDatabase openDatabase() {
    	try {
    		String dataseFileName = "sdcard/region.db"; // assets目录下有一个region。db数据库,里面有一个省表,城市表,和一个视图,表中的结构就是code,name
    		if (!(new File(dataseFileName)).exists()) {
    			InputStream is = getContext().getResources().getAssets().open("region.db");
    			FileOutputStream fos = new FileOutputStream(dataseFileName);
    			byte[] buff = new byte[8192];
    			int count = 0;
    			while ((count = is.read(buff)) > 0){
    				fos.write(buff,0,count);
    			}
    			fos.close();
    			is.close();
    		}
			SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(dataseFileName, null);
			return database;
		} catch (Exception e) {
			Log.d("error", e.getStackTrace().toString());
		}
    	return null;
    }
    
	@Override
	public boolean onCreate() {
		database = openDatabase();
		Log.d("good", "ok");
		return true;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Cursor cursor = null;
		// 根据url获得返回码
		switch (uriMatcher.match(uri)) {
		case CITIES: //查询所有城市信息
			cursor = database.query("v_cities_province", projection, selection, selectionArgs, null, null, sortOrder);
			break;
		case CITY_CODE: // 根据城市代码查询城市信息
			String citycode = uri.getPathSegments().get(1);
			if (selection == null) {
				selection = "city_code='"+citycode+"' ";  
			} else {
				selection += " and (city_code='"+ citycode +"' )";
			}
			cursor = database.query("t_cities", projection, selection, selectionArgs, null, null, sortOrder);
			break;
		case CITY_NAME: // 根据城市名查询所有城市信息
			String cityname = uri.getPathSegments().get(1);
			if (selection == null) {
				selection = "city_name='" + cityname +"'";
			} else {
				selection += "and (city_name='" + cityname + "')";
			}
			cursor = database.query("t_cities", projection, selection, selectionArgs, null, null, sortOrder);
			break;
		case CITITE_IN_PROVINCE: // 根据省名,查询省内的所有城市信息
			String provinceName = uri.getPathSegments().get(1);
			if (selection == null) {
				selection = "province_name='" + provinceName +"'";
			} else {
				selection += "and (province_name='" + provinceName + "')";
			}
			cursor = database.query("v_cities_province", projection, selection, selectionArgs, null, null, sortOrder);
			break;
		default:
			throw new IllegalArgumentException(uri+"的格式不正确");
		}
		return cursor;
	}

	@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
		return 0;
	}

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

}

 配置xml:

在appcation标签中加入:

        <provider android:name="RegionContentProvider" android:authorities="com.example.contetnprovider"></provider>

 

然后加一个权限:

   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

 

 

 

分享到:
评论

相关推荐

    Android实现使用自定义ContentProvider共享生词本数据库

    Android高级编程雪梨作业之自定义ContentProvider 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...

    Android 之 自定义ContentProvider的使用

    自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在Android项目中实现一个自定义的ContentProvider。 1. **理解ContentProvider** ContentProvider...

    自定义contentprovider

    自定义ContentProvider是开发者根据需求创建的,用于暴露自己应用中的数据,让其他应用可以安全地读取或写入这些数据。本篇文章将深入讲解如何创建并使用自定义ContentProvider。 一、ContentProvider概述 ...

    自定义ContentProvider的简单例子

    在这个简单的例子中,我们将探讨如何自定义ContentProvider来实现数据共享。 首先,创建一个ContentProvider需要继承`android.content.ContentProvider`类,并重写其中的关键方法: 1. `onCreate()`: 当...

    Android学习之自定义ContentProvider类

    这是学习ContentProvider的第二个练习。 里面自定义ContentProvider类来与SQLite交互。 大致类容就是:通过ContentProvider,创建自己的.db,操作自己的.db. 代码里有详细的解释

    android 数据库 以及自定义ContentProvider demo

    本示例“android 数据库 以及自定义ContentProvider demo”将带你深入理解这两个概念,并通过实践操作演示如何在Android项目中实现它们。 首先,我们来了解Android数据库。Android系统使用SQLite作为默认的轻量级...

    关于自定义ContentProvider的Demo

    首先,我们来看“自定义ContentProvider”。ContentProvider是Android四大组件之一,它的主要职责是为其他应用提供数据访问接口。自定义ContentProvider通常涉及以下步骤: 1. **创建ContentProvider类**:你需要...

    android 自定义 ContentProvider 以及 ContentResolver

    本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作。 首先,ContentProvider是Android系统中的一种特殊组件,它允许应用程序公开自己的数据,使得其他应用可以通过标准接口进行...

    自定义ContentProvider完成数据交互

    本篇文章将深入探讨如何自定义ContentProvider来实现数据交互。 首先,我们需要了解ContentProvider的基本结构。一个自定义的ContentProvider需要继承自`android.content.ContentProvider`类,并重写其中的关键方法...

    ContentProvider自定义以及使用系统ContentProvider

    本篇文章将深入探讨如何自定义ContentProvider以及如何使用系统提供的ContentProvider。 首先,理解ContentProvider的基本概念至关重要。ContentProvider是Android系统中的一种机制,它封装了对数据的操作,如读取...

    android自定义contentprovider

    本篇将详细讲解如何自定义ContentProvider,以及如何实现对联系人、彩信和通话记录的读取。 一、ContentProvider基础 1. **ContentProvider的结构**:一个ContentProvider类需要继承自`android.content....

    通过SQLiteDatabase实现自定义ContentProvider增删改查

    ********************************************** 通过SQLiteDatabase实现自定义ContentProvider增删改查 *********************************************

    自定义ContentProvider实例

    自定义ContentProvider是开发者根据自身需求创建的数据管理工具,可以实现对私有数据或者特定数据源的访问控制。下面将详细介绍如何创建和使用自定义ContentProvider,以及其在提供数据和读取数据中的作用。 一、...

    Android 自定义ContentProvider简单实例

    Android 自定义ContentProvider简单实例 Android允许我们定义自己的的ContentProvider对象来共享数据,练练手,简单来实现一下。 要使用ContentProvider来操作数据,必须要有保存数据的场所。可以使用文件或SQLite...

Global site tag (gtag.js) - Google Analytics