1. 程式人生 > >自定義資料庫 -- ContentProvider和ContentResolver

自定義資料庫 -- ContentProvider和ContentResolver

在android中自己通過ContentProvider建立一個上述資料表。

1. 首先通過SQLiteOpenHelper執行SQL語句,建立資料表。

	private static final String DATABASE_NAME = "simrecord.db";
	private static final int DATABASE_VERSION = 1;
<p>	private static final String SIMCARD_TABLE_CREATE = "CREATE TABLE " + TABLE_NAME + //“CREATE TABLE ”後面需要加一個空格
			"(_id INTEGER primary key," +
			" card_id VARCHAR," +
			"date VARCHAR," +
			"sim_state VARCHAR," +
			"sim_operator VARCHAR," +
			"sim_country VARCHAR," +
			"data_state VARCHAR," +
			"network_type VARCHAR)";
	</p>
<pre class="java" name="code">private class MyDataBaseHelper extends SQLiteOpenHelper{  //by SQLiteOpenHelper to make SQLiteDatabase


		public MyDataBaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			// TODO Auto-generated method stub
			Log.d(TAG,"MyDataBaseHelper onCreate()");
			db.execSQL(SIMCARD_TABLE_CREATE);
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated method stub
			Log.d(TAG,"MyDataBaseHelper onUpgrade()");
			
		}
		
		
	}

2.然後通過繼承ContentProvider類

其中onCreate()方法,通過SQLiteOpenHelper類的getWritableDatabase()方法獲取資料庫SQLiteDatabase類mDb,然後通過mDb對資料庫進行各項操作。
覆寫其中查詢/刪除/插入/增加方法,通過mDb對資料表進行相應的操作。

public class SimRecordProvider extends ContentProvider {
	
	
	private static final String TAG ="simrecord: SimRecordProvider";
	private static final String PROVIDER_NAME ="com.sec.provider.simrecord";
	private static final String TABLE_NAME = "simrecord";
	
	private  MyDataBaseHelper mDataBaseHelper;
	private  SQLiteDatabase mDb;

	@Override
	public boolean onCreate() {
		// TODO Auto-generated method stub
		Log.d(TAG," onCreate()");
		mDataBaseHelper =new MyDataBaseHelper(getContext());
		mDb = mDataBaseHelper.getWritableDatabase();
		return true;
	}

	@Override
	public int delete(Uri uri, String selection, String[] selectionArgs) {
		// TODO Auto-generated method stub
		Log.d(TAG," delete()");
		//Log.d(TAG," delete() where : " +selection);
		mDb.delete(TABLE_NAME, selection, null);
		return 0;
	}

	@Override
	public String getType(Uri uri) {
		// TODO Auto-generated method stub
		Log.d(TAG," getType()");
		return null;
	}

	@Override
	public Uri insert(Uri uri, ContentValues values) {
		// TODO Auto-generated method stub
		Log.d(TAG," insert()");
		//Log.d(TAG," insert() values : " +values);
		
		mDb.insert(TABLE_NAME, null, values);
		return null;
	}


	@Override
	public Cursor query(Uri uri, String[] projection, String selection, String[] seletionArgs,
			String sortOrder) {
		// TODO Auto-generated method stub
		Log.d(TAG," query()");
		//Log.d(TAG," query() where : " +selection);
		//String where = "card_id=?";
		Cursor mCursor =null;
		mCursor = mDb.query(TABLE_NAME, null, selection, seletionArgs, null, null, null);
		return mCursor;
		
	}

	@Override
	public int update(Uri uri, ContentValues values, String selection, String[] seletionArgs) {
		// TODO Auto-generated method stub
		Log.d(TAG," update()");
		//Log.d(TAG," update() where : " +selection);
		mDb.update(TABLE_NAME, values, selection, seletionArgs);
		return 0;
	}

}


3.在AndroidManifest.xml檔案中新增SimRecordProvider.java的authorities, 這樣子ContentResolver才可以通過URI查詢到該資料庫

        <provider 
            android:name=".SimRecordProvider"
            android:authorities="com.sec.provider.simrecord"
            android:exported="true">
            
        </provider>
           


4.ContentResolver類其實就是提供給使用者進行操作資料庫的介面。

通過context.getContentResolver() 獲取ContentResolver,ContentResolver類中的方法:query()/delete()/insert()/update()分別對應著ContentProvider類中的相應方法。

CONTENT_URI相當於ContentProvider類中的地址,ContentResolver通過CONTENT_URI查詢到對應的ContentProvider。

private static final String CONTENT_URI ="content://com.sec.provider.simrecord";
mContentResolver = context.getContentResolver();


查詢資料表中有多少條資料:

	public int queryCount (){
 		
		//Log.d(TAG," queryCount()****************Begin");
		Cursor mCursor = mContentResolver.query(Uri.parse(CONTENT_URI), null, null, null, null);
		if(mCursor==null){
			return 0;
		}
		//Log.d(TAG," queryCount() mCursor = " + mCursor);
		Log.d(TAG," queryCount() mCursor.getCount() = " + mCursor.getCount());
		int count = mCursor.getCount();
		return count;			
	}
	

插入新的卡資料:通過ContentValues類封裝需要儲存的資料。

	public void insertCard(String card_id, ContentValues values){
		//Log.d(TAG," insertCard()****************Begin");
		//Log.d(TAG," insertCard() card_id = " + card_id);
		
		if(!isNewCard(card_id)){
			Toast.makeText(mContext, "the card_id is alread exsit", Toast.LENGTH_SHORT).show();
			Log.d(TAG," insertCard()**the card_id is alread exsit");
			return ;
		}
		mContentResolver.insert(Uri.parse(CONTENT_URI), values);
		Log.d(TAG," insertCard()** the card  inserted in database");
		Toast.makeText(mContext, "insert card_id="+card_id, Toast.LENGTH_SHORT).show();
	}



刪除指定card_id的卡資料:

	public void deleteCard(String card_id){
		if(card_id != null){
			
			String where = "card_id='"+card_id+"'";   // where = '123456'
			Log.d(TAG," deleteCard() where= "+where );
			mContentResolver.delete(Uri.parse(CONTENT_URI), where, null);
		}
			
	}