自定义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 将任务01生词本作业中生成的生词本数据库通过自定义ContentProvider的方式,共享给其他应用。 要求如下: (1) 使用自定义SQLiteOpenHelper来管理数据库; (2) 提交...
自定义ContentProvider允许开发者创建自己的数据存储解决方案,并与其他应用程序无缝交互。这篇博客将深入探讨如何在Android项目中实现一个自定义的ContentProvider。 1. **理解ContentProvider** ContentProvider...
自定义ContentProvider是开发者根据需求创建的,用于暴露自己应用中的数据,让其他应用可以安全地读取或写入这些数据。本篇文章将深入讲解如何创建并使用自定义ContentProvider。 一、ContentProvider概述 ...
在这个简单的例子中,我们将探讨如何自定义ContentProvider来实现数据共享。 首先,创建一个ContentProvider需要继承`android.content.ContentProvider`类,并重写其中的关键方法: 1. `onCreate()`: 当...
这是学习ContentProvider的第二个练习。 里面自定义ContentProvider类来与SQLite交互。 大致类容就是:通过ContentProvider,创建自己的.db,操作自己的.db. 代码里有详细的解释
本示例“android 数据库 以及自定义ContentProvider demo”将带你深入理解这两个概念,并通过实践操作演示如何在Android项目中实现它们。 首先,我们来了解Android数据库。Android系统使用SQLite作为默认的轻量级...
首先,我们来看“自定义ContentProvider”。ContentProvider是Android四大组件之一,它的主要职责是为其他应用提供数据访问接口。自定义ContentProvider通常涉及以下步骤: 1. **创建ContentProvider类**:你需要...
本文将深入探讨如何自定义ContentProvider和如何有效地使用ContentResolver进行数据操作。 首先,ContentProvider是Android系统中的一种特殊组件,它允许应用程序公开自己的数据,使得其他应用可以通过标准接口进行...
本篇文章将深入探讨如何自定义ContentProvider来实现数据交互。 首先,我们需要了解ContentProvider的基本结构。一个自定义的ContentProvider需要继承自`android.content.ContentProvider`类,并重写其中的关键方法...
本篇文章将深入探讨如何自定义ContentProvider以及如何使用系统提供的ContentProvider。 首先,理解ContentProvider的基本概念至关重要。ContentProvider是Android系统中的一种机制,它封装了对数据的操作,如读取...
本篇将详细讲解如何自定义ContentProvider,以及如何实现对联系人、彩信和通话记录的读取。 一、ContentProvider基础 1. **ContentProvider的结构**:一个ContentProvider类需要继承自`android.content....
********************************************** 通过SQLiteDatabase实现自定义ContentProvider增删改查 *********************************************
自定义ContentProvider是开发者根据自身需求创建的数据管理工具,可以实现对私有数据或者特定数据源的访问控制。下面将详细介绍如何创建和使用自定义ContentProvider,以及其在提供数据和读取数据中的作用。 一、...
Android 自定义ContentProvider简单实例 Android允许我们定义自己的的ContentProvider对象来共享数据,练练手,简单来实现一下。 要使用ContentProvider来操作数据,必须要有保存数据的场所。可以使用文件或SQLite...