前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android 四大组件学习之ContentProvider二

Android 四大组件学习之ContentProvider二

作者头像
DragonKingZhu
发布2022-05-08 16:07:17
1460
发布2022-05-08 16:07:17
举报

上节学习了什么是ContentProvider,以及ContentProvider的作用。以及什么是URL。本节就对上节学习的知识做一个实践,也就是定义自己的ContentProvider

好,实践是检验真理的唯一标准。 那我们就开始行动吧

第一步: 创建一个自己的ContentProvider,我取名为MyContentProvider

代码语言:javascript
复制
public class MyContentProvider extends ContentProvider {

	@Override
	public int delete(Uri arg0, String arg1, String[] arg2) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public String getType(Uri arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Uri insert(Uri arg0, ContentValues arg1) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
			String arg4) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
		// TODO Auto-generated method stub
		return 0;
	}
}

这些方法很熟悉吧。 这不是数据库常见的增删改查吗? 原来ContentProvider为我们提供了所以的数据库的操作。我们只需调用实现即可。

第二步: 创建一个SQLiteOpenHelper类,我取名为MyDbOpenHelper

代码语言:javascript
复制
public class MyDbOpenHelper extends SQLiteOpenHelper {

	public String TABLE_NAME="user";
	public MyDbOpenHelper(Context context) {
		super(context, "user.db", null, 1);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL("create table user(_id integer primary key autoincrement, name char(10), age integer(2), salary integer(10))");
	}

	@Override
	public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
		// TODO Auto-generated method stub

	}
}

在create方法中创建table为user的数据表

第三步: 在配置文件中注册ContentProvider

代码语言:javascript
复制
        <provider android:name="com.ui.contentprovider.MyContentProvider"
                  android:authorities="com.ui.contentprovider"                   url路径
                  android:exported="true">                                       暴露自己需要打开
        </provider>

第四步:再创建一个Activity,用于插入数据。布局文件为四个按钮

既然一切都准备好了。 我们就插入一组数据:

Activity的OnCreate方法

代码语言:javascript
复制
public class MainActivity extends Activity {

    ContentResolver cResolver;
    //得到自己定义的ContentProvider的url
    Uri uri=Uri.parse("content://com.ui.contentprovider/");
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*得到ContentResolver*/
        cResolver = getContentResolver();   
    }

当点击insert按钮后需要插入的数据

代码语言:javascript
复制
    public void insert(View v)
    {
    	Log.i("MainActivity", "---------insert");
    	ContentValues values = new ContentValues();
    	
    	values.put("name", "张三");
    	values.put("age", 20);
    	values.put("salary", 13000);
    	cResolver.insert(uri, values);
    	
    	values.put("name", "李四");
    	values.put("age", 19);
    	values.put("salary", 10000);
    	cResolver.insert(uri, values);
    	
    	values.put("name", "王五");
    	values.put("age", 40);
    	values.put("salary", 200000);
    	cResolver.insert(uri, values);
    	
    	values.put("name", "朱八");
    	values.put("age", 10);
    	values.put("salary", 2000);
    	cResolver.insert(uri, values);
    }

此时ContentProvider中给第三方提供的insert方法需要实现:

代码语言:javascript
复制
public class MyContentProvider extends ContentProvider {

	private MyDbOpenHelper dhHelper;
	private SQLiteDatabase db;
	
	@Override
	public boolean onCreate() {
		Log.i("MyContentProvider", "onCreate");
		
		//调用MyDbOpenHelper的onCreate方法创建数据库
		dhHelper = new MyDbOpenHelper(getContext());
		db = dhHelper.getWritableDatabase();
		return false;
	}
	
	//插入第三方应用的数据
	@Override
	public Uri insert(Uri uri, ContentValues values) {
		Log.i("MyContentProvider", "insert");
		db.insert(dhHelper.TABLE_NAME, null, values);
		return uri;
	}

测试如下: 先运行ContentProvider所在的Activity, 在运行第三方应用,得到结果为:

接下来,看一下删除的操作, 我们删除名字为王五的同学:

Activity中当点击delete按钮后:

代码语言:javascript
复制
    public void delete(View v)
    {
    	Log.i("MainActivity", "---------delete");
    	cResolver.delete(uri, "name = ?", new String[]{"王五"});
    }

ContentProvider中的delete需要改为:

代码语言:javascript
复制
	@Override	
	public int delete(Uri arg0, String whereClause, String[] whereArgs) {
		Log.i("MyContentProvider", "delete");
		db.delete(dhHelper.TABLE_NAME, whereClause, whereArgs);
		return 0;
	}

运行结果为:

接下来学习修改操作, 由于朱八同学最近表现比较好,老板给加薪了。 加了500

activity当点击update按钮执行的操作:

代码语言:javascript
复制
    public void update(View v)
    {
    	Log.i("MainActivity", "---------update");
    	ContentValues values = new ContentValues();
    	values.put("salary", 2500);
    	cResolver.update(uri, values, "name = ?", new String[]{"朱八"});
    }

ContentProvider中修改为:

代码语言:javascript
复制
	@Override
	public int update(Uri arg0, ContentValues values, String whereClause, String[] whereArgs) {
		Log.i("MyContentProvider", "update");
		int id = db.update(dhHelper.TABLE_NAME, values, whereClause, whereArgs);
		return id;
	}

运行效果为:

接下来最后一个操作,查询操作,查询工资大于等于10000的:

Activity的代码:

代码语言:javascript
复制
    public void query(View v)
    {
    	Cursor cursor = cResolver.query(uri, null, "salary >= ?", new String[]{"10000"}, null);
    	Log.i("MainActivity", "---------query");
    	while(cursor.moveToNext())
    	{
    		String name = cursor.getString(cursor.getColumnIndex("name"));
    		int age = cursor.getInt(cursor.getColumnIndex("age"));
    		int salary = cursor.getInt(cursor.getColumnIndex("salary"));
    		System.out.println(name + ";" + age + ";" + salary);
    	}
    }

ContentProvider中的需要修改的代码:

代码语言:javascript
复制
	@Override
	public Cursor query(Uri arg0, String[] projection, String selection, String[] selectionArgs,
			String sortOrder) {
		Log.i("MyContentProvider", "query");
		Cursor cursor = db.query(dhHelper.TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
		return cursor;
	}

串口的打印:

好, 关于自己定义自己的ContentProvider就到这里,我们实现了所以的增删改查操作。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档