自定义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" />