Android应用组件之ContentProvider

ContentProvider:

1. MainActivity

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
}

2. PersonProvider

public class PersonProvider extends ContentProvider {

	//用来存放所有合法的Uri的容器
	private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
	//保存一些合法的uri
	// content://com.atguigu.l09_provider.personprovider/person 不根据id操作
	// content://com.atguigu.l09_provider.personprovider/person/3 根据id操作
	static {
		matcher.addURI("com.atguigu.l09_provider.personprovider", "/person", 1);
		matcher.addURI("com.atguigu.l09_provider.personprovider", "/person/#", 2);  //#匹配任意数字
	}
	private DBHelper dbHelper;
	public PersonProvider() {
		Log.e("TAG", "PersonProvider()");
	}
	@Override
	public boolean onCreate() {
		Log.e("TAG", "PersonProvider onCreate()");
		dbHelper = new DBHelper(getContext());
		
		return false;
	}

	/**
	 * content://com.atguigu.l09_provider.personprovider/person 不根据id查询 
	 * content://com.atguigu.l09_provider.personprovider/person/3 根据id查询 
	 */
	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Log.e("TAG", "PersonProvider query()");
		
		//得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		
		//1.匹配uri, 返回code
		int code = matcher.match(uri);
		//如果合法, 进行查询
		if(code==1) {//不根据id查询
			Cursor cursor = database.query("person", projection, selection, selectionArgs, null, null, null);
			return cursor;
		} else if(code==2) {//根据id查询 
			//得到id
			long id = ContentUris.parseId(uri);
			//查询
			Cursor cursor = database.query("person", projection, "_id=?", new String[]{id+""}, null, null, null);
			return cursor;
		} else {//如果不合法, 抛出异常
			throw new RuntimeException("查询的uri不合法");
		}
	}

	/**
	 * content://com.atguigu.l09_provider.personprovider/person 插入
	 * content://com.atguigu.l09_provider.personprovider/person/3 根据id插入(没有)
	 */
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		Log.e("TAG", "PersonProvider insert()");
		//得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		//匹配uri, 返回code
		int code = matcher.match(uri);
		//如果合法, 进行插入
		if(code==1) {
			long id = database.insert("person", null, values);
			//将id添加到uri中
			uri = ContentUris.withAppendedId(uri, id);
			database.close();
			return uri;
		} else {
			//如果不合法, 抛出异常
			database.close();
			throw new RuntimeException("插入的uri不合法");
		}
	}

	/**
	 * content://com.atguigu.l09_provider.personprovider/person 不根据id删除
	 * content://com.atguigu.l09_provider.personprovider/person/3 根据id删除
	 */
	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		Log.e("TAG", "PersonProvider delete()");
		//得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		//匹配uri, 返回code
		int code = matcher.match(uri);
		int deleteCount = -1;
		//如果合法, 进行删除
		if(code==1) {
			deleteCount = database.delete("person", selection, selectionArgs);
		} else if(code==2) {
			long id = ContentUris.parseId(uri);
			deleteCount = database.delete("person", "_id="+id, null);
		} else {
			//如果不合法, 抛出异常
			database.close();
			throw new RuntimeException("删除的uri不合法");
		}
		
		database.close();
		return deleteCount;
	}

	/**
	 * content://com.atguigu.l09_provider.personprovider/person 不根据id更新
	 * content://com.atguigu.l09_provider.personprovider/person/3 根据id更新
	 */
	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		Log.e("TAG", "PersonProvider update()");
		//得到连接对象
		SQLiteDatabase database = dbHelper.getReadableDatabase();
		//匹配uri, 返回code
		int code = matcher.match(uri);
		int updateCount = -1;
		//如果合法, 进行更新
		if(code==1) {
			updateCount = database.update("person", values, selection, selectionArgs);
		} else if(code==2) {
			long id = ContentUris.parseId(uri);
			updateCount = database.update("person", values, "_id="+id, null);
		} else {
			//如果不合法, 抛出异常
			database.close();
			throw new RuntimeException("更新的uri不合法");
		}
		
		database.close();
		return updateCount;
	}
	
	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		return null;
	}
}


3. DBHelper

public class DBHelper extends SQLiteOpenHelper {

	public DBHelper(Context context) {
		super(context, "atguigu.db", null, 1);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		Log.e("TAG", "onCreate()...");
		//建表
		db.execSQL("create table person(_id integer primary key autoincrement, name varchar)");
		//插入初始化数据
		db.execSQL("insert into person (name) values ('Tom')");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

	}

}


4. activity_main.xml

5. AndroidManifest.xml

<provider android:name="com.atguigu.l09_provider.PersonProvider" 
            android:authorities="com.atguigu.l09_provider.personprovider"
            android:exported="true"/>
 <!-- exported : 是否可以让其它应用访问 -->
 

ContentResolver:

1. MainActivity

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	/*
	 * 通过ContentResolver调用ContentProvider插入一条记录
	 */
	public void insert(View v) {
		//1. 得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2. 调用其insert
		Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
		//uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/3");
		ContentValues values = new ContentValues();
		values.put("name", "JACK");
		uri = resolver.insert(uri, values);
		
		Toast.makeText(this, uri.toString(), 1).show();
	}

	/*
	 * 通过ContentResolver调用ContentProvider更新一条记录
	 */
	public void update(View v) {
		//1. 得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2. 执行update
		Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
		ContentValues values = new ContentValues();
		values.put("name", "JACK2");
		int updateCount = resolver.update(uri, values, null, null);
		
		Toast.makeText(this, "updateCount="+updateCount, 1).show();
	}

	/*
	 * 通过ContentResolver调用ContentProvider删除一条记录
	 */
	public void delete(View v) {
		//1. 得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2. 执行delete
		Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/2");
		int deleteCount = resolver.delete(uri, null, null);
		Toast.makeText(this, "deleteCount="+deleteCount, 1).show();
	}

	/*
	 * 通过ContentResolver调用ContentProvider查询所有记录
	 */
	public void query(View v) {
		//1. 得到ContentResolver对象
		ContentResolver resolver = getContentResolver();
		//2. 调用其query, 得到cursor
		Uri uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person/1");
		uri = Uri.parse("content://com.atguigu.l09_provider.personprovider/person");
		Cursor cusor = resolver.query(uri, null, null, null, null);
		//3. 取出cursor中的数据, 并显示
		while(cusor.moveToNext()) {
			int id = cusor.getInt(0);
			String name = cusor.getString(1);
			Toast.makeText(this, id+" : "+name, 1).show();
		}
		cusor.close();
	}
}


2. activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="insert"
        android:text="INSERT" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="delete"
        android:text="DELETE" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="update"
        android:text="UPDATE" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="query"
        android:text="QUERY" />

</LinearLayout>


3. AndroidManifest.xml



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值