Home | History | Annotate | Download | only in providers
      1 page.title=   
      2 @jd:body
      3 <div id="qv-wrapper">
      4 <div id="qv">
      5 <!-- In this document -->
      6 <h2>  </h2>
      7 <ol>
      8     <li>
      9         <a href="#Basics"></a>
     10         <ol>
     11             <li>
     12                 <a href="#ClientProvider"> </a>
     13             </li>
     14             <li>
     15                 <a href="#ContentURIs"> URI</a>
     16             </li>
     17         </ol>
     18     </li>
     19     <li>
     20         <a href="#SimpleQuery">  </a>
     21         <ol>
     22             <li>
     23                 <a href="#RequestPermissions">   </a>
     24             </li>
     25             <li>
     26                 <a href="#Query"> </a>
     27             </li>
     28             <li>
     29                 <a href="#DisplayResults">  </a>
     30             </li>
     31             <li>
     32                 <a href="#GettingResults">   </a>
     33             </li>
     34         </ol>
     35     </li>
     36     <li>
     37         <a href="#Permissions">  </a>
     38     </li>
     39     <li>
     40         <a href="#Modifications"> ,   </a>
     41         <ol>
     42             <li>
     43                 <a href="#Inserting"> </a>
     44             </li>
     45             <li>
     46                 <a href="#Updating"> </a>
     47             </li>
     48             <li>
     49                 <a href="#Deleting"> </a>
     50             </li>
     51         </ol>
     52     </li>
     53     <li>
     54         <a href="#DataTypes">  </a>
     55     </li>
     56     <li>
     57         <a href="#AltForms">   </a>
     58         <ol>
     59             <li>
     60                 <a href="#Batch"> </a>
     61             </li>
     62             <li>
     63                 <a href="#Intents">   </a>
     64             </li>
     65         </ol>
     66     </li>
     67     <li>
     68         <a href="#ContractClasses"> </a>
     69     </li>
     70     <li>
     71         <a href="#MIMETypeReference">MIME  </a>
     72     </li>
     73 </ol>
     74 
     75     <!-- Key Classes -->
     76 <h2>Key </h2>
     77     <ol>
     78         <li>
     79             {@link android.content.ContentProvider}
     80         </li>
     81         <li>
     82             {@link android.content.ContentResolver}
     83         </li>
     84         <li>
     85             {@link android.database.Cursor}
     86         </li>
     87         <li>
     88             {@link android.net.Uri}
     89         </li>
     90     </ol>
     91 
     92     <!-- Related Samples -->
     93 <h2> </h2>
     94     <ol>
     95         <li>
     96         <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/List2.html">
     97         ()</a>
     98         </li>
     99         <li>
    100         <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/List7.html">
    101         ()</a>
    102         </li>
    103     </ol>
    104 
    105     <!-- See also -->
    106 <h2> </h2>
    107     <ol>
    108         <li>
    109             <a href="{@docRoot}guide/topics/providers/content-provider-creating.html">
    110           </a>
    111         </li>
    112         <li>
    113             <a href="{@docRoot}guide/topics/providers/calendar-provider.html">
    114          </a>
    115         </li>
    116     </ol>
    117 </div>
    118 </div>
    119 
    120     <!-- Intro paragraphs -->
    121 <p>
    122           . 
    123  Android  ,    UI    .
    124          . 
    125       . 
    126           
    127       .
    128 </p>
    129 <p>
    130          .
    131 </p>
    132     <ul>
    133         <li>   </li>
    134         <li>      API</li>
    135         <li>    ,      API</li>
    136         <li>      API </li>
    137     </ul>
    138 
    139     <!-- Basics -->
    140 <h2 id="Basics"></h2>
    141 <p>
    142          ,   
    143           . 
    144         , 
    145          .
    146 </p>
    147 <p>
    148       Android          . 
    149        .  1    
    150        .
    151 </p>
    152 <p class="table-caption">
    153     <strong> 1:</strong>    .
    154 </p>
    155 <table id="table1" style="width: 50%;">
    156     <tr>
    157         <th style="width:20%" align="center" scope="col"></th>
    158         <th style="width:20%" align="center" scope="col"> ID</th>
    159         <th style="width:20%" align="center" scope="col"></th>
    160         <th style="width:20%" align="center" scope="col"></th>
    161         <th style="width:20%" align="center" scope="col">_ID</th>
    162     </tr>
    163     <tr>
    164         <td align="center" scope="row">mapreduce</td>
    165         <td align="center">user1</td>
    166         <td align="center">100</td>
    167         <td align="center">en_US</td>
    168         <td align="center">1</td>
    169     </tr>
    170     <tr>
    171         <td align="center" scope="row">precompiler</td>
    172         <td align="center">user14</td>
    173         <td align="center">200</td>
    174         <td align="center">fr_FR</td>
    175         <td align="center">2</td>
    176     </tr>
    177     <tr>
    178         <td align="center" scope="row">applet</td>
    179         <td align="center">user2</td>
    180         <td align="center">225</td>
    181         <td align="center">fr_CA</td>
    182         <td align="center">3</td>
    183     </tr>
    184     <tr>
    185         <td align="center" scope="row">const</td>
    186         <td align="center">user1</td>
    187         <td align="center">255</td>
    188         <td align="center">pt_BR</td>
    189         <td align="center">4</td>
    190     </tr>
    191     <tr>
    192         <td align="center" scope="row">int</td>
    193         <td align="center">user5</td>
    194         <td align="center">100</td>
    195         <td align="center">en_UK</td>
    196         <td align="center">5</td>
    197     </tr>
    198 </table>
    199 <p>
    200      1,         
    201 .        .   
    202        .    
    203  .      <code>locale</code>  . 
    204   , <code>_ID</code>     " " 
    205  .
    206 </p>
    207 <p class="note">
    208     <strong>:</strong>        , 
    209     <code>_ID</code>     .    
    210 {@link android.widget.ListView}  
    211    <code>_ID</code> .   
    212 <a href="#DisplayResults">  </a>    .
    213 </p>
    214 <h3 id="ClientProvider"> </h3>
    215 <p>
    216         
    217 {@link android.content.ContentResolver}   . 
    218            . 
    219  {@link android.content.ContentProvider}      . 
    220 {@link android.content.ContentResolver}  
    221    "CRUD"(, ,   )  .
    222 </p>
    223 <p>
    224          {@link android.content.ContentResolver} 
    225      {@link android.content.ContentProvider}  
    226    .
    227 {@link android.content.ContentProvider}  
    228              .
    229 </p>
    230 <p class="note">
    231     <strong>:</strong>     
    232        .  
    233 <a href="#Permissions">  </a>     .
    234 </p>
    235 <p>
    236               ,
    237 {@link android.content.ContentResolver#query ContentResolver.query()}  .
    238     {@link android.content.ContentResolver#query query()}     
    239 {@link android.content.ContentProvider#query ContentProvider.query()} 
    240 .     
    241 {@link android.content.ContentResolver#query ContentResolver.query()}   .
    242 <p>
    243 <pre>
    244 // Queries the user dictionary and returns results
    245 mCursor = getContentResolver().query(
    246     UserDictionary.Words.CONTENT_URI,   // The content URI of the words table
    247     mProjection,                        // The columns to return for each row
    248     mSelectionClause                    // Selection criteria
    249     mSelectionArgs,                     // Selection criteria
    250     mSortOrder);                        // The sort order for the returned rows
    251 </pre>
    252 <p>
    253      2
    254 {@link android.content.ContentResolver#query
    255 query(Uri,projection,selection,selectionArgs,sortOrder)}   SQL SELECT     .
    256 </p>
    257 <p class="table-caption">
    258     <strong> 2:</strong> Query() SQL   .
    259 </p>
    260 <table id="table2" style="width: 75%;">
    261     <tr>
    262         <th style="width:25%" align="center" scope="col">query() </th>
    263         <th style="width:25%" align="center" scope="col">SELECT /</th>
    264         <th style="width:50%" align="center" scope="col"></th>
    265     </tr>
    266     <tr>
    267         <td align="center"><code>Uri</code></td>
    268         <td align="center"><code>FROM <em>table_name</em></code></td>
    269         <td><code>Uri</code> <em>table_name</em>     .</td>
    270     </tr>
    271     <tr>
    272         <td align="center"><code>projection</code></td>
    273         <td align="center"><code><em>col,col,col,...</em></code></td>
    274         <td>
    275             <code>projection</code>       .
    276 
    277         </td>
    278     </tr>
    279     <tr>
    280         <td align="center"><code>selection</code></td>
    281         <td align="center"><code>WHERE <em>col</em> = <em>value</em></code></td>
    282         <td><code>selection</code>    .</td>
    283     </tr>
    284     <tr>
    285         <td align="center"><code>selectionArgs</code></td>
    286         <td align="center">
    287             (  .      <code>?</code>
    288    .)
    289         </td>
    290     </tr>
    291     <tr>
    292         <td align="center"><code>sortOrder</code></td>
    293         <td align="center"><code>ORDER BY <em>col,col,...</em></code></td>
    294         <td>
    295             <code>sortOrder</code>  
    296 {@link android.database.Cursor}     .
    297         </td>
    298     </tr>
    299 </table>
    300 <h3 id="ContentURIs"> URI</h3>
    301 <p>
    302     <strong> URI</strong>    URI. 
    303  URI    ( <strong></strong>)
    304   (<strong></strong>) . 
    305         ,
    306     URI   .
    307 </p>
    308 <p>
    309         
    310 {@link android.provider.UserDictionary.Words#CONTENT_URI} 
    311   ""   URI . {@link android.content.ContentResolver}
    312    URI    ,    "".          .
    313  
    314  {@link android.content.ContentResolver}   
    315     .
    316 </p>
    317 <p>
    318     {@link android.content.ContentProvider}  URI   
    319   .      <strong></strong> .
    320 </p>
    321 <p>
    322         ""    URI  .
    323 </p>
    324 <pre>
    325 content://user_dictionary/words
    326 </pre>
    327 <p>
    328      <code>user_dictionary</code>   
    329 <code>words</code>   . 
    330 <code>content://</code>(<strong></strong>)  ,
    331   URI .
    332 </p>
    333 <p>
    334       URI   ID   
    335        .   <code>_ID</code> 
    336   <code>4</code>  ,   URI  .
    337 </p>
    338 <pre>
    339 Uri singleUri = ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI,4);
    340 </pre>
    341 <p>
    342                 ID  
    343  .
    344 </p>
    345 <p class="note">
    346     <strong>:</strong> {@link android.net.Uri} 
    347 {@link android.net.Uri.Builder}    (Well-Formed) URI       . 
    348 {@link android.content.ContentUris} URI ID       .
    349   {@link android.content.ContentUris#withAppendedId
    350 withAppendedId()}  UserDictionary  URI ID .
    351 </p>
    352 
    353 
    354     <!-- Retrieving Data from the Provider -->
    355 <h2 id="SimpleQuery">  </h2>
    356 <p>
    357              
    358  .
    359 </p>
    360 <p class="note">
    361            
    362 {@link android.content.ContentResolver#query ContentResolver.query()} "UI " . 
    363          .     
    364 {@link android.content.CursorLoader} 
    365      .   <a href="{@docRoot}guide/components/loaders.html">
    366 </a>     . ,          .
    367 
    368 </p>
    369 <p>
    370            .
    371 </p>
    372 <ol>
    373    <li>
    374              .
    375    </li>
    376    <li>
    377             .
    378    </li>
    379 </ol>
    380 <h3 id="RequestPermissions">   </h3>
    381 <p>
    382            "  " .
    383       .        . , 
    384 
    385 <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></code>
    386         .
    387            ""  
    388 .    ,     .
    389 
    390 </p>
    391 <p>
    392                 
    393        .
    394 
    395 </p>
    396 <p>
    397             
    398 <a href="#Permissions">  </a>     .
    399 </p>
    400 <p>
    401        
    402 <code>android.permission.READ_USER_DICTIONARY</code>     .    
    403          .
    404 </p>
    405 <!-- Constructing the query -->
    406 <h3 id="Query"> </h3>
    407 <p>
    408             .     
    409           .
    410 </p>
    411 <pre class="prettyprint">
    412 
    413 // A "projection" defines the columns that will be returned for each row
    414 String[] mProjection =
    415 {
    416     UserDictionary.Words._ID,    // Contract class constant for the _ID column name
    417     UserDictionary.Words.WORD,   // Contract class constant for the word column name
    418     UserDictionary.Words.LOCALE  // Contract class constant for the locale column name
    419 };
    420 
    421 // Defines a string to contain the selection clause
    422 String mSelectionClause = null;
    423 
    424 // Initializes an array to contain selection arguments
    425 String[] mSelectionArgs = {""};
    426 
    427 </pre>
    428 <p>
    429            
    430 {@link android.content.ContentResolver#query ContentResolver.query()}
    431     .    SQL  , 
    432      ,       .
    433 </p>
    434 <p>
    435          <strong></strong>
    436 (<code>mProjection</code>) .
    437 </p>
    438 <p>
    439              .
    440      ,   
    441 ( <code>mSelectionClause</code>)  . 
    442      <code>?</code> , 
    443        ( <code>mSelectionArgs</code>).
    444 </p>
    445 <p>
    446       ,       
    447 <code>null</code> ,      . 
    448      <code>UserDictionary.Words.WORD + " = ?"</code> 
    449         .
    450 </p>
    451 <pre class="prettyprint">
    452 /*
    453  * This defines a one-element String array to contain the selection argument.
    454  */
    455 String[] mSelectionArgs = {""};
    456 
    457 // Gets a word from the UI
    458 mSearchString = mSearchWord.getText().toString();
    459 
    460 // Remember to insert code here to check for invalid or malicious input.
    461 
    462 // If the word is the empty string, gets everything
    463 if (TextUtils.isEmpty(mSearchString)) {
    464     // Setting the selection clause to null will return all words
    465     mSelectionClause = null;
    466     mSelectionArgs[0] = "";
    467 
    468 } else {
    469     // Constructs a selection clause that matches the word that the user entered.
    470     mSelectionClause = UserDictionary.Words.WORD + " = ?";
    471 
    472     // Moves the user's input string to the selection arguments.
    473     mSelectionArgs[0] = mSearchString;
    474 
    475 }
    476 
    477 // Does a query against the table and returns a Cursor object
    478 mCursor = getContentResolver().query(
    479     UserDictionary.Words.CONTENT_URI,  // The content URI of the words table
    480     mProjection,                       // The columns to return for each row
    481     mSelectionClause                   // Either null, or the word the user entered
    482     mSelectionArgs,                    // Either empty, or the string the user entered
    483     mSortOrder);                       // The sort order for the returned rows
    484 
    485 // Some providers return null if an error occurs, others throw an exception
    486 if (null == mCursor) {
    487     /*
    488      * Insert code here to handle the error. Be sure not to use the cursor! You may want to
    489      * call android.util.Log.e() to log this error.
    490      *
    491      */
    492 // If the Cursor is empty, the provider found no matches
    493 } else if (mCursor.getCount() &lt; 1) {
    494 
    495     /*
    496      * Insert code here to notify the user that the search was unsuccessful. This isn't necessarily
    497      * an error. You may want to offer the user the option to insert a new row, or re-type the
    498      * search term.
    499      */
    500 
    501 } else {
    502     // Insert code here to do something with the results
    503 
    504 }
    505 </pre>
    506 <p>
    507       SQL   .
    508 </p>
    509 <pre>
    510 SELECT _ID, word, locale FROM words WHERE word = &lt;userinput&gt; ORDER BY word ASC;
    511 </pre>
    512 <p>
    513      SQL         .
    514 </p>
    515 <h4 id="Injection">   </h4>
    516 <p>
    517         SQL   , 
    518  SQL        SQL    .
    519 </p>
    520 <p>
    521          .
    522 </p>
    523 <pre>
    524 // Constructs a selection clause by concatenating the user's input to the column name
    525 String mSelectionClause =  "var = " + mUserInput;
    526 </pre>
    527 <p>
    528          SQL   SQL    .
    529        <code>mUserInput</code>  "nothing; DROP TABLE *;"   . 
    530      <code>var = nothing; DROP TABLE *;</code> . 
    531    SQL      SQLite   
    532      ( <a href="http://en.wikipedia.org/wiki/SQL_injection">SQL </a> 
    533     ).
    534 </p>
    535 <p>
    536        <code>?</code>      , 
    537      .  ,   SQL      .
    538 
    539      SQL       SQL   . 
    540           .
    541 </p>
    542 <pre>
    543 // Constructs a selection clause with a replaceable parameter
    544 String mSelectionClause =  "var = ?";
    545 </pre>
    546 <p>
    547         .
    548 </p>
    549 <pre>
    550 // Defines an array to contain the selection arguments
    551 String[] selectionArgs = {""};
    552 </pre>
    553 <p>
    554            .
    555 </p>
    556 <pre>
    557 // Sets the selection argument to the user's input
    558 selectionArgs[0] = mUserInput;
    559 </pre>
    560 <p>
    561     <code>?</code>       
    562          . 
    563   SQL     .
    564 </p>
    565 <!-- Displaying the results -->
    566 <h3 id="DisplayResults">  </h3>
    567 <p>
    568     {@link android.content.ContentResolver#query ContentResolver.query()} 
    569              
    570 {@link android.database.Cursor} . 
    571 {@link android.database.Cursor}         .
    572  {@link android.database.Cursor}       , 
    573              .
    574   {@link android.database.Cursor}     ,
    575 {@link android.database.Cursor}         
    576          .
    577 </p>
    578 <p class="note">
    579     <strong>:</strong>       
    580      .           . 
    581         .
    582 </p>
    583 <p>
    584         ,  
    585 {@link android.database.Cursor}  .   
    586 {@link android.database.Cursor#getCount Cursor.getCount()} 0( ).
    587 </p>
    588 <p>
    589        ,      . 
    590 <code>null</code>    , {@link java.lang.Exception}   .
    591 </p>
    592 <p>
    593     {@link android.database.Cursor}  "",
    594 {@link android.database.Cursor}     {@link android.widget.SimpleCursorAdapter}  {@link android.widget.ListView}
    595  .
    596 </p>
    597 <p>
    598            . 
    599     {@link android.database.Cursor}  
    600 {@link android.widget.SimpleCursorAdapter}  ,   
    601 {@link android.widget.ListView}   .
    602 </p>
    603 <pre class="prettyprint">
    604 // Defines a list of columns to retrieve from the Cursor and load into an output row
    605 String[] mWordListColumns =
    606 {
    607     UserDictionary.Words.WORD,   // Contract class constant containing the word column name
    608     UserDictionary.Words.LOCALE  // Contract class constant containing the locale column name
    609 };
    610 
    611 // Defines a list of View IDs that will receive the Cursor columns for each row
    612 int[] mWordListItems = { R.id.dictWord, R.id.locale};
    613 
    614 // Creates a new SimpleCursorAdapter
    615 mCursorAdapter = new SimpleCursorAdapter(
    616     getApplicationContext(),               // The application's Context object
    617     R.layout.wordlistrow,                  // A layout in XML for one row in the ListView
    618     mCursor,                               // The result from the query
    619     mWordListColumns,                      // A string array of column names in the cursor
    620     mWordListItems,                        // An integer array of view IDs in the row layout
    621     0);                                    // Flags (usually none are needed)
    622 
    623 // Sets the adapter for the ListView
    624 mWordList.setAdapter(mCursorAdapter);
    625 </pre>
    626 <p class="note">
    627     <strong>:</strong> {@link android.database.Cursor} {@link android.widget.ListView} ,
    628  <code>_ID</code>   .
    629          ""   <code>_ID</code>  
    630 , {@link android.widget.ListView}    .
    631            <code>_ID</code>     .
    632 
    633 </p>
    634 
    635         <!-- Getting data from query results -->
    636 <h3 id="GettingResults">   </h3>
    637 <p>
    638                . 
    639  ,            .
    640   , {@link android.database.Cursor}    .
    641 </p>
    642 <pre class="prettyprint">
    643 
    644 // Determine the column index of the column named "word"
    645 int index = mCursor.getColumnIndex(UserDictionary.Words.WORD);
    646 
    647 /*
    648  * Only executes if the cursor is valid. The User Dictionary Provider returns null if
    649  * an internal error occurs. Other providers may throw an Exception instead of returning null.
    650  */
    651 
    652 if (mCursor != null) {
    653     /*
    654      * Moves to the next row in the cursor. Before the first movement in the cursor, the
    655      * "row pointer" is -1, and if you try to retrieve data at that position you will get an
    656      * exception.
    657      */
    658     while (mCursor.moveToNext()) {
    659 
    660         // Gets the value from the column.
    661         newWord = mCursor.getString(index);
    662 
    663         // Insert code here to process the retrieved word.
    664 
    665         ...
    666 
    667         // end of while loop
    668     }
    669 } else {
    670 
    671     // Insert code here to report an error if the cursor is null or the provider threw an exception.
    672 }
    673 </pre>
    674 <p>
    675     {@link android.database.Cursor}  
    676   ""         .     
    677 {@link android.database.Cursor#getString getString()} . 
    678         
    679 {@link android.database.Cursor#getType getType()}  .
    680 </p>
    681 
    682 
    683     <!-- Requesting permissions -->
    684 <h2 id="Permissions">  </h2>
    685 <p>
    686                 
    687    .            
    688   .            
    689  .         .
    690 
    691 </p>
    692 <p>
    693           ,     
    694    .        
    695            .
    696 </p>
    697 <p>
    698              
    699 <code>android.permission.READ_USER_DICTIONARY</code>  .
    700        ,      <code>android.permission.WRITE_USER_DICTIONARY</code>
    701  .
    702 </p>
    703 <p>
    704            
    705     <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></code>
    706    . Android     , 
    707       .    
    708    ,        .
    709 
    710 </p>
    711 <p>
    712     
    713  <code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">&lt;uses-permission&gt;</a></code>
    714          .
    715 </p>
    716 <pre>
    717     &lt;uses-permission android:name="android.permission.READ_USER_DICTIONARY"&gt;
    718 </pre>
    719 <p>
    720          
    721 <a href="{@docRoot}guide/topics/security/security.html">  </a>      .
    722 </p>
    723 
    724 
    725 <!-- Inserting, Updating, and Deleting Data -->
    726 <h2 id="Modifications"> ,   </h2>
    727 <p>
    728          ,       
    729 {@link android.content.ContentProvider}   .
    730     {@link android.content.ContentResolver}   
    731 {@link android.content.ContentProvider}     . 
    732        .
    733 </p>
    734 <h3 id="Inserting"> </h3>
    735 <p>
    736        , 
    737 {@link android.content.ContentResolver#insert ContentResolver.insert()}
    738   .           URI .
    739               .
    740 </p>
    741 <pre class="prettyprint">
    742 // Defines a new Uri object that receives the result of the insertion
    743 Uri mNewUri;
    744 
    745 ...
    746 
    747 // Defines an object to contain the new values to insert
    748 ContentValues mNewValues = new ContentValues();
    749 
    750 /*
    751  * Sets the values of each column and inserts the word. The arguments to the "put"
    752  * method are "column name" and "value"
    753  */
    754 mNewValues.put(UserDictionary.Words.APP_ID, "example.user");
    755 mNewValues.put(UserDictionary.Words.LOCALE, "en_US");
    756 mNewValues.put(UserDictionary.Words.WORD, "insert");
    757 mNewValues.put(UserDictionary.Words.FREQUENCY, "100");
    758 
    759 mNewUri = getContentResolver().insert(
    760     UserDictionary.Word.CONTENT_URI,   // the user dictionary content URI
    761     mNewValues                          // the values to insert
    762 );
    763 </pre>
    764 <p>
    765               {@link android.content.ContentValues} 
    766 .           . 
    767         <code>null</code>   . 
    768  {@link android.content.ContentValues#putNull ContentValues.putNull()}  .
    769 </p>
    770 <p>
    771      <code>_ID</code>   .     .
    772       <code>_ID</code>  .
    773         .
    774 </p>
    775 <p>
    776     <code>newUri</code>   URI       .
    777 
    778 </p>
    779 <pre>
    780 content://user_dictionary/words/&lt;id_value&gt;
    781 </pre>
    782 <p>
    783     <code>&lt;id_value&gt;</code>    <code>_ID</code> .
    784          URI    ,       .
    785 
    786 </p>
    787 <p>
    788      {@link android.net.Uri} <code>_ID</code>  
    789 {@link android.content.ContentUris#parseId ContentUris.parseId()} .
    790 </p>
    791 <h3 id="Updating"> </h3>
    792 <p>
    793          {@link android.content.ContentValues}  . 
    794     ,     .
    795       
    796 {@link android.content.ContentResolver#update ContentResolver.update()}. 
    797        {@link android.content.ContentValues}   . 
    798   ,  <code>null</code> .
    799 </p>
    800 <p>
    801         "en"    <code>null</code>  .
    802      .
    803 </p>
    804 <pre>
    805 // Defines an object to contain the updated values
    806 ContentValues mUpdateValues = new ContentValues();
    807 
    808 // Defines selection criteria for the rows you want to update
    809 String mSelectionClause = UserDictionary.Words.LOCALE +  "LIKE ?";
    810 String[] mSelectionArgs = {"en_%"};
    811 
    812 // Defines a variable to contain the number of updated rows
    813 int mRowsUpdated = 0;
    814 
    815 ...
    816 
    817 /*
    818  * Sets the updated value and updates the selected words.
    819  */
    820 mUpdateValues.putNull(UserDictionary.Words.LOCALE);
    821 
    822 mRowsUpdated = getContentResolver().update(
    823     UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI
    824     mUpdateValues                       // the columns to update
    825     mSelectionClause                    // the column to select on
    826     mSelectionArgs                      // the value to compare to
    827 );
    828 </pre>
    829 <p>
    830     
    831 {@link android.content.ContentResolver#update ContentResolver.update()}      .     
    832 <a href="#Injection">   </a>   .
    833 </p>
    834 <h3 id="Deleting"> </h3>
    835 <p>
    836            . ,        
    837       .
    838        ID "user"   .     .
    839 
    840 </p>
    841 <pre>
    842 
    843 // Defines selection criteria for the rows you want to delete
    844 String mSelectionClause = UserDictionary.Words.APP_ID + " LIKE ?";
    845 String[] mSelectionArgs = {"user"};
    846 
    847 // Defines a variable to contain the number of rows deleted
    848 int mRowsDeleted = 0;
    849 
    850 ...
    851 
    852 // Deletes the words that match the selection criteria
    853 mRowsDeleted = getContentResolver().delete(
    854     UserDictionary.Words.CONTENT_URI,   // the user dictionary content URI
    855     mSelectionClause                    // the column to select on
    856     mSelectionArgs                      // the value to compare to
    857 );
    858 </pre>
    859 <p>
    860     {@link android.content.ContentResolver#delete ContentResolver.delete()} 
    861      .     
    862 <a href="#Injection">   </a>   .
    863 </p>
    864 <!-- Provider Data Types -->
    865 <h2 id="DataTypes">  </h2>
    866 <p>
    867             . 
    868     ,       .
    869 </p>
    870     <ul>
    871         <li>
    872             
    873         </li>
    874         <li>
    875              (Long)
    876         </li>
    877         <li>
    878               
    879         </li>
    880         <li>
    881                (double)
    882         </li>
    883     </ul>
    884 <p>
    885            64KB    BLOB(Binary Large OBject).
    886       
    887 {@link android.database.Cursor}  ""   .
    888 </p>
    889 <p>
    890                 .
    891             
    892 {@link android.provider.UserDictionary.Words}    ( 
    893 <a href="#ContractClasses"> </a>   ).
    894     @link android.database.Cursor#getType
    895     Cursor.getType()}      .
    896 </p>
    897 <p>
    898          URI MIME    . 
    899 MIME             , 
    900 MIME       . 
    901 MIME              .
    902       {@link android.provider.ContactsContract.Data}
    903   MIME          .
    904   URI  MIME   
    905 {@link android.content.ContentResolver#getType ContentResolver.getType()} .
    906 </p>
    907 <p>
    908     <a href="#MIMETypeReference">MIME  </a>      MIME  
    909     .
    910 </p>
    911 
    912 
    913 <!-- Alternative Forms of Provider Access -->
    914 <h2 id="AltForms">   </h2>
    915 <p>
    916                 .
    917 </p>
    918 <ul>
    919     <li>
    920         <a href="#Batch"> </a>: {@link android.content.ContentProviderOperation}
    921        
    922 {@link android.content.ContentResolver#applyBatch ContentResolver.applyBatch()}    .
    923     </li>
    924     <li>
    925          :     .       
    926 {@link android.content.CursorLoader}    .    
    927 <a href="{@docRoot}guide/components/loaders.html"></a>    .
    928 
    929     </li>
    930     <li>
    931         <a href="#Intents">   </a>: 
    932      ,      .
    933       .
    934     </li>
    935 </ul>
    936 <p>
    937             .
    938 </p>
    939 <h3 id="Batch"> </h3>
    940 <p>
    941             ,            
    942  ,       ( ) .
    943 
    944 </p>
    945 <p>
    946     " "  
    947 {@link android.content.ContentProviderOperation}        
    948 {@link android.content.ContentResolver#applyBatch ContentResolver.applyBatch()}
    949   . 
    950     URI   <em></em> .
    951      {@link android.content.ContentProviderOperation}  
    952        . {@link android.content.ContentResolver#applyBatch
    953     ContentResolver.applyBatch()}    .
    954 </p>
    955 <p>
    956     {@link android.provider.ContactsContract.RawContacts}   
    957        . 
    958 <a href="{@docRoot}resources/samples/ContactManager/index.html"> </a>
    959   <code>ContactAdder.java</code>
    960       .
    961 </p>
    962 <div class="sidebox-wrapper">
    963 <div class="sidebox">
    964 <h2>    </h2>
    965 <p>
    966        <em></em> 
    967         .     
    968     {@link android.content.Intent#ACTION_VIEW} .
    969        UI        .
    970      
    971 <a href="{@docRoot}guide/topics/providers/calendar-provider.html"> </a>  .
    972 </p>
    973 <p>
    974             .
    975        ,      URI   
    976 {@link android.content.Intent#ACTION_VIEW}  
    977     .
    978 </p>
    979 </div>
    980 </div>
    981 <h3 id="Intents">   </h3>
    982 <p>
    983            .     
    984       ,         
    985           .
    986 
    987 </p>
    988 <h4>   </h4>
    989 <p>
    990               . 
    991       "URI"       .
    992 
    993         URI  ,      .
    994               .
    995 
    996 </p>
    997 <ul>
    998     <li>
    999         <strong> :</strong>
   1000 {@link android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION}
   1001     </li>
   1002     <li>
   1003         <strong> :</strong>
   1004 {@link android.content.Intent#FLAG_GRANT_WRITE_URI_PERMISSION}
   1005     </li>
   1006 </ul>
   1007 <p class="note">
   1008     <strong>:</strong>     URI          
   1009   .   URI  .
   1010 </p>
   1011 <p>
   1012          URI  URI  .  
   1013 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">&lt;provider&gt;</a></code>
   1014   
   1015 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn">android:grantUriPermission</a></code>
   1016   , 
   1017 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html">&lt;provider&gt;</a></code>
   1018   
   1019 <code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html">&lt;grant-uri-permission&gt;</a></code>
   1020    . 
   1021 URI   "URI "  <a href="{@docRoot}guide/topics/security/security.html">  </a> 
   1022   .
   1023 </p>
   1024 <p>
   1025      , {@link android.Manifest.permission#READ_CONTACTS}  
   1026         . 
   1027     ,            . 
   1028 {@link android.Manifest.permission#READ_CONTACTS}  
   1029         ,            .
   1030   ,   .
   1031 </p>
   1032 <ol>
   1033     <li>
   1034         {@link android.app.Activity#startActivityForResult
   1035 startActivityForResult()}  
   1036 {@link android.content.Intent#ACTION_PICK}  "contacts" MIME 
   1037 {@link android.provider.ContactsContract.RawContacts#CONTENT_ITEM_TYPE}    .
   1038 
   1039     </li>
   1040     <li>
   1041             ""      ,    .
   1042 
   1043     </li>
   1044     <li>
   1045              .
   1046      
   1047 {@link android.app.Activity#setResult setResult(resultcode, intent)}
   1048      . 
   1049       URI ""  
   1050 {@link android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION}  . 
   1051   URI     URI        . 
   1052     {@link android.app.Activity#finish()}  
   1053   .
   1054     </li>
   1055     <li>
   1056           ,  
   1057 {@link android.app.Activity#onActivityResult onActivityResult()} 
   1058 .          .
   1059 
   1060     </li>
   1061     <li>
   1062             URI        .
   1063          .
   1064                .
   1065 
   1066     </li>
   1067 </ol>
   1068 <h4>  </h4>
   1069 <p>
   1070                 
   1071            .
   1072 </p>
   1073 <p>
   1074      ,  
   1075   UI  {@link android.content.Intent#ACTION_INSERT}  .  UI       "extras" 
   1076    .    
   1077      
   1078 {@link android.content.Intent#ACTION_INSERT}      
   1079   .
   1080 </p>
   1081 <!-- Contract Classes -->
   1082 <h2 id="ContractClasses"> </h2>
   1083 <p>
   1084         URI,  ,       
   1085      .       . 
   1086             .
   1087  Android       
   1088 {@link android.provider}      .
   1089 </p>
   1090 <p>
   1091      ,     URI     
   1092 {@link android.provider.UserDictionary}   . 
   1093 ""    URI 
   1094 {@link android.provider.UserDictionary.Words#CONTENT_URI UserDictionary.Words.CONTENT_URI} .
   1095     {@link android.provider.UserDictionary.Words}  
   1096     ,      . 
   1097         .
   1098 </p>
   1099 <pre>
   1100 String[] mProjection =
   1101 {
   1102     UserDictionary.Words._ID,
   1103     UserDictionary.Words.WORD,
   1104     UserDictionary.Words.LOCALE
   1105 };
   1106 </pre>
   1107 <p>
   1108           {@link android.provider.ContactsContract}.
   1109              . 
   1110      {@link android.provider.ContactsContract.Intents.Insert}
   1111         .
   1112 </p>
   1113 
   1114 
   1115 <!-- MIME Type Reference -->
   1116 <h2 id="MIMETypeReference">MIME  </h2>
   1117 <p>
   1118        MIME     MIME  ,        .
   1119 </p>
   1120 <p>
   1121     MIME    .
   1122 </p>
   1123 <pre>
   1124 <em>type</em>/<em>subtype</em>
   1125 </pre>
   1126 <p>
   1127      ,   MIME  <code>text/html</code> <code>text</code> 
   1128 <code>html</code>   .  URI    ,
   1129  URI   HTML       .
   1130 </p>
   1131 <p>
   1132       MIME   "" MIME   
   1133  <em></em> <em> </em>   . <em></em>      .
   1134 </p>
   1135 <pre>
   1136 vnd.android.cursor.<strong>dir</strong>
   1137 </pre>
   1138 <p>
   1139     (  )
   1140 </p>
   1141 <pre>
   1142 vnd.android.cursor.<strong>item</strong>
   1143 </pre>
   1144 <p>
   1145     (  ).
   1146 </p>
   1147 <p>
   1148     <em> </em>  . Android        .
   1149           .       MIME   .
   1150 
   1151 </p>
   1152 <pre>
   1153 vnd.android.cursor.item/phone_v2
   1154 </pre>
   1155 <p>
   1156         <code>phone_v2</code>   .
   1157 </p>
   1158 <p>
   1159                    .
   1160           .
   1161       <code>com.example.trains</code>   
   1162 Line1, Line2, Line3  .    URI   .
   1163 </p>
   1164 <p>
   1165 <pre>
   1166 content://com.example.trains/Line1
   1167 </pre>
   1168 <p>
   1169      Line1 ,    MIME  .
   1170 </p>
   1171 <pre>
   1172 vnd.android.cursor.<strong>dir</strong>/vnd.example.line1
   1173 </pre>
   1174 <p>
   1175         URI   .
   1176 </p>
   1177 <pre>
   1178 content://com.example.trains/Line2/5
   1179 </pre>
   1180 <p>
   1181      Line2  5    MIME   .
   1182 </p>
   1183 <pre>
   1184 vnd.android.cursor.<strong>item</strong>/vnd.example.line2
   1185 </pre>
   1186 <p>
   1187          MIME      . 
   1188  ,     {@link android.provider.ContactsContract.RawContacts}
   1189    MIME  
   1190   {@link android.provider.ContactsContract.RawContacts#CONTENT_ITEM_TYPE}
   1191 .
   1192 </p>
   1193 <p>
   1194         URI 
   1195 <a href="#ContentURIs"> URI</a>   .
   1196 </p>
   1197