1. 程式人生 > >Android 四大組件學習之ContentProvider二

Android 四大組件學習之ContentProvider二

gravity over mod cti parse rec 自己的 fontsize activit

上節學習了什麽是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就到這裏,我們實現了所以的增刪改查操作。






Android 四大組件學習之ContentProvider二