`

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

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics