自定義資料庫 -- ContentProvider和ContentResolver
阿新 • • 發佈:2019-01-09
在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);
}
}