天天看點

android之資料存儲3

Content Provider

定義:提供了我們在應用程式之間共享資料的一種機制(Sqlite資料庫)

程式實作通訊原理: 甲方提供一個資料庫暴露出來給别人使用(ContentProvider),乙方就可以通過 ContentResolver這個類去操作甲方的資料庫(對甲方的資料庫進行增删改查)

讀取寫入自帶聯系人通訊錄所需的權限: <!-- 寫權限 --> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <!-- 讀權限 --> <uses-permission android:name="android.permission.READ_CONTACTS" />

注意:如果在模拟器上進行聯系人操作, 然後可以在file explorer檢視 data/data/目錄下面的/com.providers.contacts下面的 contacts2.db資料庫裡( 沒有進行操作之前是檢視不到的 )

(1)查詢聯系人的資訊 1.獲得ContentResolver對象 ContentResolver contentResolver = getContentResolver(); 獲得Uri對象 private String uri_contacts_data = "content://com.android.contacts/data"; private String uri_contacts_phones = "content://com.android.contacts/data/phones";

2.Uri uri = Uri.parse(uri_contacts_data);

3.調用提供的query方法(傳回的是聯系人id和名字)調用提供的query方法(傳回的是聯系人id和名字) // 要查詢指定的字段,需要同時查詢“_id”字段,否則會報錯,“display_name”這個字段表示聯系人的姓名 Cursor cursor = resolver.query(uri, new String[] { "_id","display_name" }, null, null, null); 4.再次調用提供的query方法--用上次傳回的id作為參數,取得聯系人号碼 query(uri, projection, selection, selectionArgs, sortOrder)

"raw_contact_id = ?" 在"raw_contacts"表中查到的_id字段和“data”表中查到的“raw_contact_id”是一一對應的,是以可以根據“raw_contact_id”這個字段在“data”表中去查詢“data1”

data1和data2 data1屬性存放總資料; data2屬性: -如果此記錄存放姓名,則data2存放名; -如果此記錄存放電話,則data2存放類型,比如手機、家電; -如果此記錄存放組織,則data2存放類型,比如公司、其他; -如果此記錄存放位址,則data2存放類型,比如住宅,機關等;

//周遊查詢出來的使用者名 while (cursor.moveToNext()) { Log.e("bm", "_id: " + cursor.getString(0) + "display_name: " + cursor.getString(1)); Cursor cursor_phone = resolver.query( Uri.parse(uri_contacts_phones), new String[] { "data1" }, "raw_contact_id=?", new String[] { cursor.getString(0) + "" }, null); while (cursor_phone.moveToNext()) { Log.e("bm", cursor_phone.getString(0)); } //讀完遊标裡面的資料,需要關閉遊标 cursor_phone.close(); } //讀完遊标裡面的資料,需要關閉遊标 cursor.close();

(2)查詢指定聯系人: "content://com.android.contacts/data/phones/filter/" + number 代碼示例:

//定義要查詢的電話号碼 String number="180**********"; //去聯系人表中要查詢的位址 String str="content://com.android.contacts/data/phones/filter/" + number; ContentResolver resolver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //得到contentResolver對象 resolver=getContentResolver(); Uri uri=Uri.parse(str); Cursor cursor=resolver.query(uri, new String[]{"display_name"}, null, null, null); if (cursor.moveToFirst()) { Log.e("bm", "姓名:"+cursor.getString(0)); } cursor.close(); }

ContentProvider程序間通訊(Sqlite資料庫) 1.所要操作的資料庫所在程式: 自定義一個MyProvider類 1.定義一個類繼承ContentProvider 2.重寫裡面的方法 -->自動重寫( 需要定義一個Uri比對器來比對Uri) 需要進行哪些操作就去對應的方法裡面 在onCreate()方法裡(類生成時就執行)

代碼示例: MySqlUtils utils; UriMatcher matcher; //得到工具類對象-->上下文對象getContext() utils =new MySqlUtils(getContext()); //得到matcher比對器對象 matcher=new UriMatcher(UriMatcher.NO_MATCH); //添加girl表的URi matcher.addURI(authorities, table_name, code); //添加boy表的uri matcher.addURI("com.xx.content", "boy", 2); query()方法//用來查詢 insert()方法//用來插入資料 @Override public Uri insert(Uri uri, ContentValues values) { switch (matcher.match(uri)) { case 1://添加資料到girl表 utils.addGirl(values); break; case 2://添加資料到boy表 utils.addBoy(values); break; default: break; } return null; } delete()方法//用來删除資料 update()放法//用來修改資料

3.在清單檔案裡面進行注冊 <!-- 注冊ContentProvider (1)name="包名.類名" (2) authorities = "com.公司名.項目名" (3)exported="true" 在安卓4.2之後必須設定這個屬性-->

2.用戶端使用ContentResolver操作ContentProvider中的資料 I.擷取ContentResolver 對象 II.擷取Uri III.使用ContentValues來裝資料 IV.用ContentResolver操作ContentValues

代碼示例: setContentView(R.layout.activity_main); //1.得到ContentResolver對象 ContentResolver resolver=getContentResolver(); //2.得到URi對象 //content://甲方在清單檔案裡面注冊的授權/表名 Uri uri=Uri.parse("content://com.xx.content/girl"); //3.執行個體化一個Contentvalues對象 ContentValues values=new ContentValues(); values.put("_id", 1); values.put("name", "小明"); values.put("age",21); //4.插入該資料到甲方的資料庫中去 resolver.insert(uri, values);

---------------------------------------------------------------------

Uri Uri概念粗解: Uri是指通用資源标志符

例子:content://com.example.Mycontentproviderdemo/employee/1 A:字首表明資料受控于一個内容提供者。它從不修改,也就是schema B:是指在AndroidMainfest.xml中我們注冊的provider中的android:authorities屬性所對應 C:具體操作于哪個條目 D:具體指定到哪個條目下的哪條記錄

經常需要解析Uri,并從Uri中擷取資料。 Android系統提供了兩個用于操作Uri的工具類 UriMatcher()用來比對Uri。

使用方法步驟:

1.初始化 UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// UriMatcher.NO_MATCH 表示不比對任何路徑的傳回碼

2.注冊需要的Uri sMatcher.addURI(“com.jiahui.provider.myprovider”, “person”, 1); sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/#”, 2);//#号為通配符 sMatcher.addURI(“com.jiahui.provider.myprovider”, “person/*”, 3);//* 号為任意字元

3.與已經注冊的Uri進行比對

sMatcher.match(uri)

ContentUris它用于在Uri後面追加一個ID或者解析出傳入的Uri所帶上的ID值 使用: withAppendedId (Uri contentUri, long id)---用于為路徑加上ID部分 parseId (Uri contentUri)----從路徑中擷取ID部分

繼續閱讀