博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 四大组件学习之ContentProvider二
阅读量:6284 次
发布时间:2019-06-22

本文共 5308 字,大约阅读时间需要 17 分钟。

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

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

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

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

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

暴露自己须要打开
第四步:再创建一个Activity。用于插入数据。布局文件为四个button

既然一切都准备好了。

我们就插入一组数据:

Activity的OnCreate方法

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();       }
当点击insertbutton后须要插入的数据

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方法须要实现:

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中当点击deletebutton后:

public void delete(View v)    {    	Log.i("MainActivity", "---------delete");    	cResolver.delete(uri, "name = ?", new String[]{"王五"});    }
ContentProvider中的delete须要改为:

@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当点击updatebutton运行的操作:

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中改动为:

@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的代码:

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中的须要改动的代码:

@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就到这里,我们实现了所以的增删改查操作。

你可能感兴趣的文章
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>
Item 23 不要在代码中使用新的原生态类型(raw type)
查看>>
为网页添加留言功能
查看>>
JavaScript—数组(17)
查看>>
Android 密钥保护和 C/S 网络传输安全理论指南
查看>>
以太坊ERC20代币合约优化版
查看>>
Why I Began
查看>>
同一台电脑上Windows 7和Ubuntu 14.04的CPU温度和GPU温度对比
查看>>
js数组的操作
查看>>
springmvc Could not write content: No serializer
查看>>
Python系语言发展综述
查看>>
新手 开博
查看>>
借助开源工具高效完成Java应用的运行分析
查看>>
163 yum
查看>>
第三章:Shiro的配置——深入浅出学Shiro细粒度权限开发框架
查看>>