Android內容提供者源碼

 

  1. Android內容提供者源碼,我不想說多,只講一些實用的代碼,增刪改查。通過contentProvider向數據進行操作。大家可以下載,通過日誌與LogCat打印出來的信息作爲參考!  
  2.  
  3. package com.smart;  
  4.  
  5.  
  6. import android.app.Activity;  
  7. import android.content.ContentResolver;  
  8. import android.content.ContentValues;  
  9. import android.database.Cursor;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.provider.ContactsContract;  
  13. import android.util.Log;  
  14.  
  15. public class ContentProvider extends Activity {  
  16.   private static final String TAG = "ContentProvider";  
  17.     @Override 
  18.     public void onCreate(Bundle savedInstanceState) {  
  19.         super.onCreate(savedInstanceState);  
  20.         setContentView(R.layout.main);  
  21. //      通過這個類,方問DB項目  
  22.       ContentResolver contentResolver = this.getContentResolver();  
  23.       Uri alluri = Uri.parse("content://com.smart.provider.personprovider/person");  
  24. //      Uri uri = Uri.parse("content://com.smart.provider.personprovider/person");  
  25.       ContentValues values = new ContentValues();  
  26.       values.put("name""smart99"); // 這裏更改就可以了。/  
  27.       values.put("age", (short)44);  
  28. //      contentResolver.insert(uri, values); //增加  
  29.         
  30.       Uri uri = Uri.parse("content://com.smart.provider.personprovider/person/5");  
  31. //      contentResolver.update(uri, values, null, null);//更新  
  32. //      contentResolver.delete(uri, null, null);//刪除  
  33.         
  34.         
  35.         
  36.       //查詢  
  37. //      Cursor cursor = contentResolver.query(uri, new String[] {  
  38. //        "personid", "name", "age" }, null, null, "personid desc");  
  39. //      while (cursor.moveToNext()) {  
  40. //       Log.i(TAG,  
  41. //         "personid=" + cursor.getInt(0) + ",name="  
  42. //           + cursor.getString(1) + ",age="  
  43. //           + cursor.getShort(2));  
  44. //      }  
  45. //      cursor.close();  
  46. //      記得要關掉數據  
  47.         
  48.       //01:19  
  49.         
  50.       contactMethod();  
  51.     }  
  52.     //讀取通迅裏的人員。  
  53.  public void contactMethod(){  
  54.  //聯繫人,/媒體庫/  
  55.  ContentResolver contentResolver = this.getContentResolver();  
  56.  Cursor cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, nullnullnullnull);  
  57.    
  58.  while (cursor.moveToNext()) {  
  59.     
  60.   int contactId=cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));  
  61.   String name=cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));  
  62.   Log.i(TAG,"contactId=" + contactId + ",name=" 
  63.       + name);  
  64.     
  65.     
  66.   Cursor phones=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,  
  67.     null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, nullnull);  
  68.   StringBuffer sb=new StringBuffer();  
  69.   while(phones.moveToNext()){  
  70.    String phoneNumber=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));  
  71.   sb.append(phoneNumber).append(",");  
  72.     
  73.  }  
  74.   //電話號碼可以得到  
  75.   Log.i(TAG, sb.toString());  
  76.    
  77.  }  
  78.    
  79.  cursor.close();  
  80.    
  81. }  
  82.       
  83.       
  84. }  
  85.  
  86.  
  87.  
  88.  
  89.  
  90. package com.smart.dh;  
  91.  
  92. import android.content.ContentProvider;  
  93. import android.content.ContentUris;  
  94. import android.content.ContentValues;  
  95. import android.content.UriMatcher;  
  96. import android.database.Cursor;  
  97. import android.database.sqlite.SQLiteDatabase;  
  98. import android.net.Uri;  
  99. import android.text.TextUtils;  
  100.  
  101. import com.smart.service.DataBaseOpenHelper;  
  102.  
  103. /**  
  104.  * 使用內容提供者  
  105. ContentProvider共享數據  
  106. 當應用繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法  
  107. 就可以向其它應用共享其數據。雖然使用其它方法對外共享數據,但是數據訪問  
  108. 方式 會因數據存儲的方式而不同。,而採用文件操作讀寫數據,採用sharedoreferences共享數據的需要使用sharedpreferences API讀寫數據,而使用ContentProvider共享數據的好處  
  109. 好處是統一了數據訪問方式,當應用需要通過ContentProvider對外共享 數據時,第一步需要繼承ContentProvider並重寫下面的方法。  
  110. Public class PersonContentProvider extends ContentProvider{  
  111. Public boolean onCreate();  
  112. Public Uri insert(Uri uri,ContentValues values);  
  113. Public int delete(Uri uri,String selection,String[] selectionArgs);  
  114. Public int update(Uri uri,ContentValues values,String selection,String selectionArgs);  
  115. Pullic Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String softOrder);  
  116. Public String getType(Uri uri);  
  117. }  
  118.  
  119. 第二步需要在AndroidMandifest.xml使用<provider>對該ContentProvider進行配置,爲了能讓其它應用找到該ContentProvider,ContentProvider採用了authorites(主機名、域名)對它進行唯一標識,你可以把ContentProvider看作是一個網站(想想,網站也是提供數據者),authorites就是他的域名:  
  120. 下面是在要註冊信息  
  121. <appli…>  
  122. <provider android:name=”.類名” android:authorities=”con.smart.provider.包名”>  
  123.  
  124. </appli>  
  125.  
  126. 注意:一旦應用繼承了ContentProvider類,後面我們就會把這個應用稱爲ContentProvider內容提供者  
  127.  
  128.  * ContentProvider來自於文件與數據庫都可以  
  129.  *   
  130.  * Uri介紹  
  131.  * Uri代表了要操作的數據,Uri主要包含了兩部信息:1》  
  132.  * 需要操作的ContentProvider,2>  
  133.  * 對ContentProvider中的,什麼數據進行操作, 一個Uri由以下幾個部分組成。  
  134.  * content:// com.smart.provider.personperovider/person/988  
  135.  *  content://  指 scheme    
  136.  *  om.smart.provider.personperovider指 主機名或authority  
  137.  *  person  指路徑  
  138.  *  988  指ID  
  139.  * */ 
  140. public class PersonContentProvider extends ContentProvider {  
  141.  // 另一個工程,方問這一個類。  
  142.  
  143.  private DataBaseOpenHelper dbOpenHelper;  
  144.  private static final int ALLPERSON = 1;  
  145.  private static final int PERSON = 2;  
  146.  private static UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 任何不匹配的時候,返回爲-1  
  147.  static {  
  148. //    
  149.   sMatcher.addURI("com.smart.provider.personprovider""person",ALLPERSON);  
  150.     
  151.   sMatcher.addURI("com.smart.provider.personprovider""person/#", PERSON);  
  152.  }  
  153.  //刪除  
  154.  @Override 
  155.  public int delete(Uri uri, String selection, String[] selectionArgs) {  
  156.   SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  157.   int count = 0;// 返回的行數  
  158.   switch (sMatcher.match(uri)) {  
  159.   case ALLPERSON:  
  160.    count = db.delete("person", selection, selectionArgs);  
  161.    break;  
  162.   case PERSON:  
  163.    long personid = ContentUris.parseId(uri);  
  164.    String where = TextUtils.isEmpty(selection) ? "personid=?" 
  165.      : selection + " and personid=?";  
  166.    String[] params = new String[] { String.valueOf(personid) };  
  167.    if (!TextUtils.isEmpty(selection) && selectionArgs != null) {  
  168.     params = new String[selectionArgs.length + 1];  
  169.     for (int i = 0; i < selectionArgs.length; i++) {  
  170.      params[i] = selectionArgs[i];  
  171.     }  
  172.     params[selectionArgs.length + 1] = String.valueOf(personid);  
  173.    }  
  174.    count = db.delete("person", where, params);  
  175.    break;  
  176.   default:  
  177.    throw new IllegalArgumentException("Unkow Uri:" + uri);  
  178.   }  
  179.   return count;  
  180.  }  
  181.    
  182.  /**  
  183.   * public String getType(Uri uri)  
  184.   * 方法用於返回URI所代表數據的MIME類型,如果操作的數據發球集合類型,哪麼MIME類型  
  185.   * 字符串應該以vnd.android.cursor.dir/開頭,要得到所有的person記錄Uri爲,  
  186.   * ontent//com.smart.domain/person 哪麼返回MIME類型字符串應該爲,  
  187.   * vnd.android.cursor.item/開頭,比如,得到的ID爲1的person記錄,URI爲  
  188.   * ontent//com.smart.domain/person/10 ,哪麼返回的MIME類型字符串應該爲  
  189.   * vnd.android.cursor.item/person  
  190.   * */ 
  191. // 操作數據類型  
  192.  @Override   //這個方法,不實現也可以的。  
  193.  public String getType(Uri uri) {  
  194.   switch (sMatcher.match(uri)) {  
  195.   case ALLPERSON:  
  196.    //多條  
  197.    return "vnd.android.cursor.dir/personprovider.person";  
  198.   case PERSON:  
  199.    //personprovider.person  內容提供表的  
  200.    //單條  
  201.    return "vnd.android.cursor.item/personprovider.person";  
  202.   default:  
  203.    throw new IllegalArgumentException("Unkow Uri:" + uri);  
  204.   }  
  205.  }  
  206.  
  207.  /**  
  208.   * UriMatcher類的使用介紹 因爲URI代表了要操作的數據,所以我們很經常需要解析URI,並從URI中獲得取數據,ANDROID系統  
  209.   * 提供了兩個用於操作URI的工具類,分別爲URIMATCHER和CONTENTURIS。掌握它們的使用,會便於我們的開發工作,  
  210.   * URIMATCHER類於匹配URI。它的用法如下。 首先第一步把你需要匹配路徑全部給註冊上,如下 常量  
  211.   * UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼 Urimatcher sMatcher=new  
  212.   * UriMatcher(UriMatcher.NO_MATCH);  
  213.   * 如果match()方法匹配content//com.smart.domain/person 路徑,返回匹配爲1  
  214.   * sMatcher.addURI(content//com.smart.domain/person/1);  
  215.   * 如果match()方法匹配content//com.smart.domain/person/230 路徑,返回匹配爲2  
  216.   * sMatcher.addURI(content//com.smart.domain/person/#,2); /#爲通配符  
  217.   *   
  218.   * 這裏講一下,parse方法爲任何的一個字符串轉換爲Uri地址  
  219.   * switch(sMatcher.match(Uri.parse("content//com.smart.domain/person/10"))){  
  220.   *   
  221.   * }  
  222.   *   
  223.   *   
  224.   * 註冊完需要匹配的URI後,就可以使用sMatcher.match(Uri)方法對輸入進行匹配 ,如果匹配就返回匹配碼  
  225.   * 匹配碼是調用ADDRUI()方法傳入第三個參數,假設匹配 content//com.smart.domain/person 路徑,返回的匹配碼爲1  
  226.   *   
  227.   * **/ 
  228.  //增加  
  229.  @Override 
  230.  public Uri insert(Uri uri, ContentValues values) {  
  231.   // 返回的類型爲,返回一路徑,  
  232.   SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  233.   long id = 0;  
  234.   // com.smart.domain/person/100  
  235.   switch (sMatcher.match(uri)) {  
  236.   case ALLPERSON:  
  237.    // com.smart.domain/person/  
  238.    id = db.insert("person""name", values);// 記是記錄的行號,主健INT類,就是主健,  
  239.    return ContentUris.withAppendedId(uri, id);  
  240.  
  241.   case PERSON:  
  242.    // com.smart.domain/person/20  
  243.    db.insert("person""name", values);  
  244.    String path = uri.toString();  
  245.    // 從0個開始,取到,com.smart.domain/person/20 前面20的一個'/'  
  246.    return Uri.parse(path.substring(0, path.lastIndexOf('/')) + id);  
  247.   default:  
  248.    // 返回一個參數  
  249.    throw new IllegalArgumentException("Unkow Uri:" + uri);  
  250.   }  
  251.  
  252.  }  
  253.    
  254.  
  255.  
  256.  @Override 
  257.  public boolean onCreate() {  
  258.   dbOpenHelper = new DataBaseOpenHelper(this.getContext());  
  259.   return true;  
  260.  }  
  261. //查詢  
  262.  @Override 
  263.  public Cursor query(Uri uri, String[] projection, String selection,  
  264.  String[] selectionArgs, String sortOrder) {  
  265.   SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  266.   switch (sMatcher.match(uri)) {  
  267.   case ALLPERSON:  
  268.   return db.query("person", projection, selection, selectionArgs,null,null,sortOrder);  
  269.   case PERSON:  
  270.    long personid = ContentUris.parseId(uri);  
  271.    String where = TextUtils.isEmpty(selection) ? "personid=?" 
  272.      : selection + " and personid=?";  
  273.    String[] params = new String[] { String.valueOf(personid) };  
  274.    if (!TextUtils.isEmpty(selection) && selectionArgs != null) {  
  275.     params = new String[selectionArgs.length + 1];  
  276.     for (int i = 0; i < selectionArgs.length; i++) {  
  277.      params[i] = selectionArgs[i];  
  278.     }  
  279.     params[selectionArgs.length + 1] = String.valueOf(personid);  
  280.    }  
  281.    return db.query("person", projection, where, params,null,null,sortOrder);  
  282.   default:  
  283.    throw new IllegalArgumentException("Unkow Uri:" + uri);  
  284.   }  
  285.     
  286.  }  
  287. //更新  
  288.  @Override 
  289.  public int update(Uri uri, ContentValues values, String selection,  
  290.    String[] selectionArgs) {  
  291.   SQLiteDatabase db = dbOpenHelper.getWritableDatabase();  
  292.   int count = 0;// 返回的行數  
  293.   switch (sMatcher.match(uri)) {  
  294.   case ALLPERSON:  
  295.    count = db.update("person", values, selection, selectionArgs);  
  296.    break;  
  297.   case PERSON://com.smart.domain/100  
  298.    long personid = ContentUris.parseId(uri);//得到100的記錄  
  299.    //判斷是否爲空,爲條件  
  300.    String where = TextUtils.isEmpty(selection) ? "personid=?" 
  301.      : selection + " and personid=?";  
  302.    String[] params = new String[] { String.valueOf(personid) };  
  303.    if (!TextUtils.isEmpty(selection) && selectionArgs != null) {  
  304.     params = new String[selectionArgs.length + 1];  
  305.     for (int i = 0; i < selectionArgs.length; i++) {  
  306.      params[i] = selectionArgs[i];  
  307.     }  
  308.     params[selectionArgs.length + 1] = String.valueOf(personid);  
  309.    }  
  310.    count = db.update("person", values, where, params);  
  311.    break;  
  312.   default:  
  313.    throw new IllegalArgumentException("Unkow Uri:" + uri);  
  314.   }  
  315.   return count;  
  316.  }  
  317.  /*****  
  318.   * 增加 ContentUris類用於獲取Uri 路徑後面的ID部分,它有兩個實用的方法,  
  319.   * withAppendedld(Uri,id)用於爲路徑爲上ID部分 Uri  
  320.   * uri=Uri.parse("content://com.smart.domain/person"); Uri  
  321.   * resultUri=ContentUris.withAppendedld(uri,10)  
  322.   * 生成後Uri爲:content://com.smart.domain/person/10  
  323.   *   
  324.   * 更新的方法 parseld(uri)方法用於從路徑中獲取ID部分 Uri  
  325.   * uri=Uri.parse("com.smart.domain/person/10"); long  
  326.   * personid=ContentUris.parseld(uri);//獲取的結果爲10  
  327.   *   
  328.   *   
  329.   * **/ 
  330. }  
  331.  
  332.  
  333. <?xml version="1.0" encoding="utf-8"?>  
  334. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  335.       package="com.smart.dh" 
  336.       android:versionCode="1" 
  337.       android:versionName="1.0">  
  338.     <application android:icon="@drawable/icon" android:label="@string/app_name">  
  339.         <uses-library android:name="android.test.runner"/>  
  340.        <provider android:name=".PersonContentProvider" 
  341.         android:authorities="com.smart.provider.personprovider"   
  342.         android:permission="com.smart.provider.personprovider"/>   
  343.        
  344.         <activity android:name=".DBActivity" 
  345.                   android:label="@string/app_name">  
  346.             <intent-filter>  
  347.                 <action android:name="android.intent.action.MAIN" />  
  348.                 <category android:name="android.intent.category.LAUNCHER" />  
  349.             </intent-filter>  
  350.         </activity>  
  351.  
  352.     </application>  
  353.     <uses-sdk android:minSdkVersion="8" />  
  354.  <instrumentation android:name="android.test.InstrumentationTestRunner" 
  355.  android:targetPackage="com.smart.dh" android:label="Tests for My App"/>  
  356. </manifest>   
  357.  
  358.  
  359.  
  360.  
  361.  
  362.  
  363.    <!--  android:permission="cn.itcast.provider.personprovider" 
  364.         這行是指權限    android:permission="com.smart.domain" 
  365.         com.smart.domain  
  366.         -->  
  367.  
  368.  
  369.  
  370.  
  371.  
  372.  
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.  
  381.  
  382.  
  383.  
  384.  
  385.  

大家記住了,兩個工程,一定都導進來,然後運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章