Android 四大組件學習之ContentProvider二

來源:互聯網
上載者:User

標籤:布局檔案   user   com   net   struct   public   table   null   url路徑   

上節學習了什麼是ContentProvider。以及ContentProvider的作用。以及什麼是URL。本節就對上節學習的知識做一個實踐,也就是定義自己的ContentProvider

好。實踐是檢驗真理的唯一標準。 那我們就開始行動吧

第一步: 建立一個自己的ContentProvider,我取名為MyContentProvider

public class MyContentProvider extends ContentProvider {@Overridepublic int delete(Uri arg0, String arg1, String[] arg2) {// TODO Auto-generated method stubreturn 0;}@Overridepublic String getType(Uri arg0) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri arg0, ContentValues arg1) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean onCreate() {// TODO Auto-generated method stubreturn false;}@Overridepublic Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,String arg4) {// TODO Auto-generated method stubreturn null;}@Overridepublic int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {// TODO Auto-generated method stubreturn 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}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL("create table user(_id integer primary key autoincrement, name char(10), age integer(2), salary integer(10))");}@Overridepublic 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;@Overridepublic boolean onCreate() {Log.i("MyContentProvider", "onCreate");//調用MyDbOpenHelper的onCreate方法建立資料庫dhHelper = new MyDbOpenHelper(getContext());db = dhHelper.getWritableDatabase();return false;}//插入第三方應用的資料@Overridepublic 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須要改為:

@Overridepublic 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中改動為:

@Overridepublic 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中的須要改動的代碼:

@Overridepublic 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二

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.