Android 四大组件学习之ContentProvider二

上节学习了什么是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

        <provider android:name="com.ui.contentprovider.MyContentProvider"
                  android:authorities="com.ui.contentprovider"                   url路径
                  android:exported="true">                                       暴露自己须要打开
        </provider>

第四步:再创建一个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就到这里,我们实现了所以的增删改查操作。

时间: 2024-09-30 11:26:20

Android 四大组件学习之ContentProvider二的相关文章

Android 四大组件学习之ContentProvider一

ContentProvider作为四大组件之一,那它存在一定是有原因的? 那为什么引用ContentProvider呢?  我们先看一个例子. 大家在生活中用手机,比如你按了360手机管家, 其中360手机管家就有一个短信,通话记录,联系人备份的功能.那手机里的短信,联系人都是存放在数据库中的 比如联系人的信息是存放在contacts2.db中.既然数据是存放在数据库中的,那360手机管家就必须拿到这个数据.但是contac2.db对别的用户是没有权限的.那360是如何拿到手机联系人这些信息呢?

Android 四大组件学习之ContentProvider五

上几节学习了ContentProvider的实际用途,读取短信,插入短信,读取联系人,插入联系人等. 本节课在学习ContentProvider的观察者. 在生活中有第三方的软件,比如什么短信软件,此短信软件是替代了系统中自带的短信软件.当然可读取短信就是利用的ContentProvider,但是此等软件为何能实时的把接受的短信显示出来呢?  这就用到我们的内容观察者. 什么是内容观察者呢?  就是一直在观察系统是否有新短信,如果有新短信就会提示第三方软件赶快去数据库中取短信信息.这样就能实时的

Android 四大组件学习之Activity二

上一节学习如何创建一个Activity,以及如何加载界面. 这一节学习,如何从一个Activity跳转到另外一个Activity. 首先: 先创建二个Activity, 我就用上节课的MainActivity和SecondActivity MainActivity的布局文件,就随便拖放一个TextView和一个Button: <TextView android:id="@+id/textView1" android:layout_width="wrap_content&

Android 四大组件学习之ContentProvider三

上节课学习如何自己创建一个ContentProvider,以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的,读取系统的短信内容. 根据上节知道,既然要读取系统的短信,那就得先找到系统的短信在那里? 先找到短信数据库所在的问题,然后导出,查看里面的内容 既然已经分析好了,我们需要什么,不需要什么. 当然还需要知道短信提供者给第三方的URL.这个可以通过Android源码查看. 那我们就写一个程序,读取系统

Android 四大组件学习之BroadcastReceiver二

上节学习了如何创建一个广播,也尝试接受系统打电话的广播.本节课学习如何自定义广播.自定义广播实质上也就是创建一个发送广播者,创建一个接受该广播者. 那我们就开始行动吧. 先创建一个发送广播的应用: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont

Android 四大组件学习之ContentProvider四

上节我们学习了怎样去读取系统短信以及插入一条短信到系统中. 本节我们学习怎样获取系统的联系人,以及插入一条联系人 好.废话不多说了,直接操作. 首先和读取短信一样,先找到联系人在数据库中的位置. 然后导出,查看数据库中的内容 上图就是怎样到数据库中找打系统的联系人数据,(看起来图画的有点乱,希望能看懂吧) 既然知道怎样能到系统的数据库找到数据.那我们就開始写代码实现吧: public class ReadContactActivity extends Activity { @Override p

Android 四大组件学习之Service二

上节学习如何创建了一个Service,并且用Activity启动一个Service.这节我们在上节的基础上更加完善 这节学习用StartServer启动服务,并且在服务中每隔一秒打印出当前时间 举例说明: MyActivity代码: public class MyActivity extends Activity { private Button btn_start; private Button btn_end; @Override protected void onCreate(Bundle

Android学习之路——Android四大组件之activity(二)

上一篇讲了activity的创建和启动,这一篇,我们来讲讲activity的数据传递 activity之间的数据传递,这里主要介绍的是activity之间简单数据的传递,直接用bundle传递基本数据类型的数据.还有一种数据类型是parcelable和serialable 用bundle 传递数据有两种情况,这篇文章就分别从两个方面说明一下. 一.利用bundle传递基本数据类型 1.启动时传递数据,使用intent的put方法,将数据写入bundle中,然后startActivity(inte

android四大组件学习总结以及各个组件示例(1)

android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. (4)Activity生命周期>什么是