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; } }
第二步: 創建一個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 } }
第三步: 在配置文件裏註冊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就到這裏,我們實現了所以的增刪改查操作。
Android 四大組件學習之ContentProvider二