Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自學筆記-12-ContentProvider簡單例子

Android自學筆記-12-ContentProvider簡單例子

編輯:關於Android編程

在編寫Android程序的時候,有時候我們會需要將程序中的某些數據暴露給其他的程序訪問,這時候我們就可以使用ContentProvider實現該功能。ContentProvider可以通過一定的格式將我們程序中的數據(可能是私有文件中的數據或者數據庫中的數據等)暴露給其他程序訪問。

在編寫ContentProvider的時候我們需要使用如下的步驟:

1 編寫一個java類繼承ContentProvider類,然後實現裡面的方法。

2 在AndroidManifest.xml配置該ContentProvider。

編寫完了我們還需要從該ContentProvider獲取數據,這時候我們就可以直接實例化一個ContentResolver對象,然後調用其中的方法對數據進行操作。

下面簡單列出部分代碼:

自定義的ContentProvider代碼:

package com.mxy;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log;

/**
 * 使用contentProvider的時候 數據庫不需要關閉
 * @author mxy
 * 我們在操作該ContentProvider數據的時候,需要根據特定的Uri去操作
 * Uri構造格式如下:content:///自定義內容
 */
public class MyProvider extends ContentProvider {
	
	private static int NOMATCH = -1;
	private static int INSERT = 1;
	private static int QUERY = 2;
	private static int UPDATE = 3;
	private static int DELETE = 4;
	
	//為了方便我們操作Google提供了UriMatcher,我們可以通過該類去構造我們能夠匹配
	//的Uri,當然我們也可以自己去進行匹配,但是那樣容易書寫錯誤
	private static UriMatcher matcher = new UriMatcher(NOMATCH);
	static{
		matcher.addURI("com.mxy.MyProvider", "insert", INSERT);
		matcher.addURI("com.mxy.MyProvider", "query", QUERY);
		matcher.addURI("com.mxy.MyProvider", "update", UPDATE);
		matcher.addURI("com.mxy.MyProvider", "delete", DELETE);
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		Log.i("mxy", "provider  delete" + matcher.match(uri));
		return 0;
	}

	@Override
	public String getType(Uri uri) {
		Log.i("mxy", "provider  getType" + matcher.match(uri));
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		Log.i("mxy", "provider  insert" + matcher.match(uri));
		return null;
	}

	@Override
	public boolean onCreate() {
		Log.i("mxy", "provider  onCreate");
		return false;
	}

	@Override
	public Cursor query(Uri uri, String[] projection, String selection,
			String[] selectionArgs, String sortOrder) {
		Log.i("mxy", "provider  query" + matcher.match(uri));
		if(QUERY == matcher.match(uri)){
			PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
			SQLiteDatabase db = helper.getReadableDatabase();
			Cursor cursor = db.query("person", projection, selection, selectionArgs, null, null, sortOrder);
			return cursor;
		}else{
			return null;
		}
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection,
			String[] selectionArgs) {
		Log.i("mxy", "provider  update" + matcher.match(uri));
		return 0;
	}

}

上面的代碼中使用到了Sqlite數據的操作,我沒有粘貼出來,可以下載源碼工程查看。

AndroidManifest.xml需要配置Provider:




    

    
        
            
                

                
            
        

        
        
    


這樣我們就可以運行這個工程,這樣就可以創建一個ContentProvider了,下面我們需要另一個程序去使用ContentProvider,另外一個程序的主要代碼如下:
package com.mxy.contentProviderReader;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
      //讀取contentprovider 數據
      ContentResolver resolver = this.getContentResolver();
      
      Uri uri = Uri.parse("content://com.mxy.MyProvider/query");
      Cursor cursor = resolver.query(uri, null,null ,null, null);
      
      Log.i("mxy", cursor + "--------" );
      
      while(cursor != null && cursor.moveToNext()){
      	int id = cursor.getInt(cursor.getColumnIndex("id"));
      	String number = cursor.getString(2);
      	Log.i("mxy", "id:" + id + "  number:" + number);
      }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

兩個程序都沒有見面元素,結果都是在logcat中顯示的。


例子工程下載地址:http://download.csdn.net/detail/mengxiangyue/7079701

http://download.csdn.net/detail/mengxiangyue/7079717

轉載請注明出處:http://blog.csdn.net/mengxiangyu


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved