Android 四大组件学习之ContentProvider二

犀渠玉剑良家子,白马金羁侠少年。这篇文章主要讲述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。 在执行第三方应用,得到结果为:
Android 四大组件学习之ContentProvider二

文章图片



接下来,看一下删除的操作, 我们删除名字为王五的同学:
Activity中当点击deletebutton后:
【Android 四大组件学习之ContentProvider二】
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; }


执行结果为:
Android 四大组件学习之ContentProvider二

文章图片



接下来学习改动操作, 因为朱八同学近期表现比較好,老板给加薪了。
加了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; }


执行效果为:
Android 四大组件学习之ContentProvider二

文章图片

接下来最后一个操作,查询操作。查询工资大于等于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; }


串口的打印:
Android 四大组件学习之ContentProvider二

文章图片



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

































    推荐阅读