1 page.title= 2 @jd:body 3 <div id="qv-wrapper"> 4 <div id="qv"> 5 6 7 <h2> </h2> 8 <ol> 9 <li> 10 <a href="#DataStorage"> </a> 11 </li> 12 <li> 13 <a href="#ContentURI"> URI </a> 14 </li> 15 <li> 16 <a href="#ContentProvider"> ContentProvider</a> 17 <ol> 18 <li> 19 <a href="#RequiredAccess"> </a> 20 </li> 21 <li> 22 <a href="#Query"> query()</a> 23 </li> 24 <li> 25 <a href="#Insert"> insert()</a> 26 </li> 27 <li> 28 <a href="#Delete"> delete()</a> 29 </li> 30 <li> 31 <a href="#Update"> update()</a> 32 </li> 33 <li> 34 <a href="#OnCreate"> onCreate()</a> 35 </li> 36 </ol> 37 </li> 38 <li> 39 <a href="#MIMETypes"> MIME </a> 40 <ol> 41 <li> 42 <a href="#TableMIMETypes"> MIME </a> 43 </li> 44 <li> 45 <a href="#FileMIMETypes"> MIME </a> 46 </li> 47 </ol> 48 </li> 49 <li> 50 <a href="#ContractClass"> -</a> 51 </li> 52 <li> 53 <a href="#Permissions"> </a> 54 </li> 55 <li> 56 <a href="#ProviderElement"> <provider></a> 57 </li> 58 <li> 59 <a href="#Intents"> </a> 60 </li> 61 </ol> 62 <h2> </h2> 63 <ol> 64 <li> 65 {@link android.content.ContentProvider} 66 </li> 67 <li> 68 {@link android.database.Cursor} 69 </li> 70 <li> 71 {@link android.net.Uri} 72 </li> 73 </ol> 74 <h2> </h2> 75 <ol> 76 <li> 77 <a href="{@docRoot}resources/samples/NotePad/index.html"> 78 Note Pad 79 </a> 80 </li> 81 </ol> 82 <h2>. :</h2> 83 <ol> 84 <li> 85 <a href="{@docRoot}guide/topics/providers/content-provider-basics.html"> 86 </a> 87 </li> 88 <li> 89 <a href="{@docRoot}guide/topics/providers/calendar-provider.html"> 90 </a> 91 </li> 92 </ol> 93 </div> 94 </div> 95 96 97 <p> 98 . 99 Android, 100 . 101 {@link android.content.ContentProvider}, 102 . , 103 , , , , 104 , . 105 </p> 106 <p> 107 108 API-. 109 </p> 110 111 112 <!-- Before You Start Building --> 113 <h2 id="BeforeYouStart"> </h2> 114 <p> 115 , . 116 </p> 117 <ol> 118 <li> 119 <strong>, </strong>. 120 , : 121 <ul> 122 <li> ;</li> 123 <li> ;</li> 124 <li> .</li> 125 </ul> 126 <p> 127 <em> </em> SQLite, 128 . 129 </p> 130 </li> 131 <li> 132 , 133 134 <a href="{@docRoot}guide/topics/providers/content-provider-basics.html"> </a>, . 135 </li> 136 </ol> 137 <p> 138 . . 139 </p> 140 <ol> 141 <li> 142 . : 143 <dl> 144 <dt> 145 146 </dt> 147 <dd> 148 , , 149 , - . 150 . 151 . 152 </dd> 153 <dt> 154 155 </dt> 156 <dd> 157 , , . 158 , . 159 , , , . 160 , , . 161 SQLite, 162 . , 163 Android, 164 <a href="#DataStorage"> </a>. 165 </dd> 166 </dl> 167 </li> 168 <li> 169 {@link android.content.ContentProvider} 170 . 171 Android. 172 <a href="#ContentProvider"> ContentProvider</a>. 173 </li> 174 <li> 175 , URI . , 176 , , 177 . , , 178 . 179 -; . 180 URI 181 <a href="#ContentURI"> URI </a>. 182 183 <a href="#Intents"> </a>. 184 </li> 185 <li> 186 , , 187 {@link android.content.AbstractThreadedSyncAdapter}, 188 . 189 </li> 190 </ol> 191 192 193 <!-- Designing Data Storage --> 194 <h2 id="DataStorage"> </h2> 195 <p> 196 , . 197 , . 198 , . 199 </p> 200 <p> 201 Android : 202 </p> 203 <ul> 204 <li> 205 Android API SQLite, Android 206 . 207 {@link android.database.sqlite.SQLiteOpenHelper} , 208 {@link android.database.sqlite.SQLiteDatabase} 209 . 210 <p> 211 , . 212 , , 213 . 214 </p> 215 </li> 216 <li> 217 Android API- . 218 219 <a href="{@docRoot}guide/topics/data/data-storage.html"> </a>. 220 , , , , 221 . 222 </li> 223 <li> 224 {@link java.net} 225 {@link android.net}. 226 (, ), . 227 228 <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html"> </a>. 229 </li> 230 </ul> 231 <h3 id="DataDesign"> 232 233 </h3> 234 <p> 235 , : 236 </p> 237 <ul> 238 <li> 239 , 240 . 241 ( ). , 242 , {@link android.provider.BaseColumns#_ID BaseColumns._ID}, 243 244 {@link android.widget.ListView} , 245 <code>_ID</code>. 246 </li> 247 <li> 248 , 249 , 250 . , 251 {@link android.content.ContentResolver}. 252 </li> 253 <li> 254 255 BLOB. , BLOB 256 <a href="http://code.google.com/p/protobuf"> </a> 257 <a href="http://www.json.org"> JSON</a>. 258 <p> 259 BLOB , <em> </em>. 260 , MIME 261 BLOB. BLOB 262 MIME. 263 . , , 264 265 {@link android.provider.ContactsContract.Data}. 266 </p> 267 </li> 268 </ul> 269 <!-- Designing Content URIs --> 270 <h2 id="ContentURI"> URI </h2> 271 <p> 272 <strong>URI </strong> URI, . URI 273 ( <strong></strong>) 274 , (<strong></strong>). URI 275 . 276 {@link android.content.ContentProvider} URI ( ); 277 , . 278 </p> 279 <p> 280 URI 281 282 <a href="{@docRoot}guide/topics/providers/content-provider-basics.html"> </a>. 283 </p> 284 <h3> </h3> 285 <p> 286 , Android. 287 288 ( ). Android, 289 290 , . , Android 291 <code>com.example.<appname></code>, 292 <code>com.example.<appname>.provider</code>. 293 </p> 294 <h3> </h3> 295 <p> 296 URI , , 297 . , , <em>table1</em> 298 <em>table2</em>, 299 URI : 300 <code>com.example.<appname>.provider/table1</code> 301 <code>com.example.<appname>.provider/table2</code>. 302 , . 303 </p> 304 <h3> URI </h3> 305 <p> 306 URI , 307 . 308 <code>_ID</code> 309 . 310 </p> 311 <p> 312 , . 313 {@link android.database.Cursor} 314 {@link android.widget.ListView} {@link android.widget.CursorAdapter}. 315 {@link android.widget.CursorAdapter} , 316 {@link android.database.Cursor} <code>_ID</code> 317 </p> 318 <p> 319 , 320 . {@link android.database.Cursor} 321 {@link android.widget.ListView}, <code>_ID</code> , 322 URI , . 323 , . 324 </p> 325 <h3> URI </h3> 326 <p> 327 URI , API 328 {@link android.content.UriMatcher}, URI 329 . <code>switch</code>, 330 URI , . 331 </p> 332 <p> 333 URI : 334 </p> 335 <ul> 336 <li> 337 <strong><code>*</code>:</strong> ; 338 </li> 339 <li> 340 <strong><code>#</code>:</strong> . 341 </li> 342 </ul> 343 <p> 344 URI 345 <code>com.example.app.provider</code>, 346 URI , : 347 </p> 348 <ul> 349 <li> 350 <code>content://com.example.app.provider/table1</code>: <code>table1</code>; 351 </li> 352 <li> 353 <code>content://com.example.app.provider/table2/dataset1</code>: 354 <code>dataset1</code>; 355 </li> 356 <li> 357 <code>content://com.example.app.provider/table2/dataset2</code>: 358 <code>dataset2</code>; 359 </li> 360 <li> 361 <code>content://com.example.app.provider/table3</code>: <code>table3</code>. 362 </li> 363 </ul> 364 <p> 365 URI , (, 366 <code>content://com.example.app.provider/table3/1</code> 367 <code>1</code> <code>table3</code>. 368 </p> 369 <p> 370 URI : 371 </p> 372 <dl> 373 <dt> 374 <code>content://com.example.app.provider/*</code> 375 </dt> 376 <dd> 377 URI . 378 </dd> 379 <dt> 380 <code>content://com.example.app.provider/table2/*</code>: 381 </dt> 382 <dd> 383 URI <code>dataset1</code> 384 <code>dataset2</code>, URI <code>table1</code> 385 <code>table3</code>. 386 </dd> 387 <dt> 388 <code>content://com.example.app.provider/table3/#</code>: URI 389 <code>table3</code>, 390 <code>content://com.example.app.provider/table3/6</code> 391 <code>6</code>. 392 </dt> 393 </dl> 394 <p> 395 , {@link android.content.UriMatcher}. 396 URI , URI 397 , URI 398 <code>content://<authority>/<path></code> 399 <code>content://<authority>/<path>/<id></code> . 400 </p> 401 <p> 402 {@link android.content.UriMatcher#addURI(String, String, int) addURI()} 403 . {@link android.content.UriMatcher#match(Uri) 404 match()} URI. <code>switch</code> 405 , : 406 </p> 407 <pre class="prettyprint"> 408 public class ExampleProvider extends ContentProvider { 409 ... 410 // Creates a UriMatcher object. 411 private static final UriMatcher sUriMatcher; 412 ... 413 /* 414 * The calls to addURI() go here, for all of the content URI patterns that the provider 415 * should recognize. For this snippet, only the calls for table 3 are shown. 416 */ 417 ... 418 /* 419 * Sets the integer value for multiple rows in table 3 to 1. Notice that no wildcard is used 420 * in the path 421 */ 422 sUriMatcher.addURI("com.example.app.provider", "table3", 1); 423 424 /* 425 * Sets the code for a single row to 2. In this case, the "#" wildcard is 426 * used. "content://com.example.app.provider/table3/3" matches, but 427 * "content://com.example.app.provider/table3 doesn't. 428 */ 429 sUriMatcher.addURI("com.example.app.provider", "table3/#", 2); 430 ... 431 // Implements ContentProvider.query() 432 public Cursor query( 433 Uri uri, 434 String[] projection, 435 String selection, 436 String[] selectionArgs, 437 String sortOrder) { 438 ... 439 /* 440 * Choose the table to query and a sort order based on the code returned for the incoming 441 * URI. Here, too, only the statements for table 3 are shown. 442 */ 443 switch (sUriMatcher.match(uri)) { 444 445 446 // If the incoming URI was for all of table3 447 case 1: 448 449 if (TextUtils.isEmpty(sortOrder)) sortOrder = "_ID ASC"; 450 break; 451 452 // If the incoming URI was for a single row 453 case 2: 454 455 /* 456 * Because this URI was for a single row, the _ID value part is 457 * present. Get the last path segment from the URI; this is the _ID value. 458 * Then, append the value to the WHERE clause for the query 459 */ 460 selection = selection + "_ID = " uri.getLastPathSegment(); 461 break; 462 463 default: 464 ... 465 // If the URI is not recognized, you should do some error handling here. 466 } 467 // call the code to actually do the query 468 } 469 </pre> 470 <p> 471 , {@link android.content.ContentUris}, 472 <code>id</code> URI . {@link android.net.Uri} 473 {@link android.net.Uri.Builder} 474 {@link android.net.Uri} . 475 </p> 476 477 <!-- Implementing the ContentProvider class --> 478 <h2 id="ContentProvider"> ContentProvider</h2> 479 <p> 480 {@link android.content.ContentProvider} 481 . , 482 {@link android.content.ContentResolver}, 483 {@link android.content.ContentProvider} . 484 </p> 485 <h3 id="RequiredAccess"> </h3> 486 <p> 487 {@link android.content.ContentProvider} , 488 . , 489 {@link android.content.ContentProvider#onCreate() onCreate()}, , 490 . 491 </p> 492 <dl> 493 <dt> 494 {@link android.content.ContentProvider#query(Uri, String[], String, String[], String) 495 query()} 496 </dt> 497 <dd> 498 . , 499 , , . 500 {@link android.database.Cursor}. 501 </dd> 502 <dt> 503 {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()} 504 </dt> 505 <dd> 506 . 507 , . URI 508 . 509 </dd> 510 <dt> 511 {@link android.content.ContentProvider#update(Uri, ContentValues, String, String[]) 512 update()} 513 </dt> 514 <dd> 515 . 516 , . . 517 </dd> 518 <dt> 519 {@link android.content.ContentProvider#delete(Uri, String, String[]) delete()} 520 </dt> 521 <dd> 522 . 523 . . 524 </dd> 525 <dt> 526 {@link android.content.ContentProvider#getType(Uri) getType()} 527 </dt> 528 <dd> 529 MIME, URI . 530 <a href="#MIMETypes"> MIME </a>. 531 </dd> 532 <dt> 533 {@link android.content.ContentProvider#onCreate() onCreate()} 534 </dt> 535 <dd> 536 . Android 537 . , , 538 {@link android.content.ContentResolver} . 539 </dd> 540 </dl> 541 <p> 542 543 {@link android.content.ContentResolver}. 544 </p> 545 <p> 546 . 547 </p> 548 <ul> 549 <li> 550 , {@link android.content.ContentProvider#onCreate() onCreate()}, 551 , . 552 553 554 <a href="{@docRoot}guide/components/processes-and-threads.html"> </a>. 555 </li> 556 <li> 557 {@link android.content.ContentProvider#onCreate() 558 onCreate()}. , . 559 560 <a href="#OnCreate"> onCreate</a>. 561 </li> 562 <li> 563 , , - , 564 . , , 565 . 566 {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()} 567 0. 568 </li> 569 </ul> 570 <h3 id="Query"> query()</h3> 571 <p> 572 573 {@link android.content.ContentProvider#query(Uri, String[], String, String[], String) 574 ContentProvider.query()} {@link android.database.Cursor}, 575 {@link java.lang.Exception}. SQLite, 576 {@link android.database.Cursor}, 577 <code>query()</code> {@link android.database.sqlite.SQLiteDatabase}. 578 , {@link android.database.Cursor}, 579 {@link android.database.Cursor#getCount()} 0. 580 <code>null</code> , . 581 </p> 582 <p> 583 SQLite , 584 {@link android.database.Cursor}. , {@link android.database.MatrixCursor} 585 cursor, {@link java.lang.Object}. 586 {@link android.database.MatrixCursor#addRow(Object[]) addRow()}, . 587 </p> 588 <p> 589 , Android {@link java.lang.Exception} 590 . Android , 591 . 592 </p> 593 <ul> 594 <li> 595 {@link java.lang.IllegalArgumentException} ( , 596 URI ); 597 </li> 598 <li> 599 {@link java.lang.NullPointerException}. 600 </li> 601 </ul> 602 <h3 id="Insert"> insert()</h3> 603 <p> 604 {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()} 605 , 606 {@link android.content.ContentValues}. {@link android.content.ContentValues} , 607 , ( , 608 ). 609 </p> 610 <p> 611 URI . 612 <code>_ID</code> ( ) URI , 613 {@link android.content.ContentUris#withAppendedId(Uri, long) withAppendedId()}. 614 </p> 615 <h3 id="Delete"> delete()</h3> 616 <p> 617 {@link android.content.ContentProvider#delete(Uri, String, String[]) delete()} 618 . , 619 620 delete . 621 delete . 622 </p> 623 <h3 id="Update"> update()</h3> 624 <p> 625 {@link android.content.ContentProvider#update(Uri, ContentValues, String, String[]) 626 update()} {@link android.content.ContentValues}, 627 {@link android.content.ContentProvider#insert(Uri, ContentValues) insert()}, 628 <code>selection</code> <code>selectionArgs</code>, 629 {@link android.content.ContentProvider#delete(Uri, String, String[]) delete()} 630 {@link android.content.ContentProvider#query(Uri, String[], String, String[], String) 631 ContentProvider.query()}. . 632 </p> 633 <h3 id="OnCreate"> onCreate()</h3> 634 <p> 635 Android {@link android.content.ContentProvider#onCreate() 636 onCreate()} . 637 , 638 . 639 {@link android.content.ContentProvider#onCreate() onCreate()} 640 . , 641 . 642 </p> 643 <p> 644 , SQLite, 645 646 {@link android.content.ContentProvider#onCreate() ContentProvider.onCreate()} 647 {@link android.database.sqlite.SQLiteOpenHelper}, SQL . , 648 {@link android.database.sqlite.SQLiteOpenHelper#getWritableDatabase 649 getWritableDatabase()} 650 {@link android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase) 651 SQLiteOpenHelper.onCreate()}. 652 </p> 653 <p> 654 655 {@link android.content.ContentProvider#onCreate() ContentProvider.onCreate()} 656 {@link android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase) 657 SQLiteOpenHelper.onCreate()}. 658 {@link android.content.ContentProvider#onCreate() ContentProvider.onCreate()}: 659 </p> 660 <pre class="prettyprint"> 661 public class ExampleProvider extends ContentProvider 662 663 /* 664 * Defines a handle to the database helper object. The MainDatabaseHelper class is defined 665 * in a following snippet. 666 */ 667 private MainDatabaseHelper mOpenHelper; 668 669 // Defines the database name 670 private static final String DBNAME = "mydb"; 671 672 // Holds the database object 673 private SQLiteDatabase db; 674 675 public boolean onCreate() { 676 677 /* 678 * Creates a new helper object. This method always returns quickly. 679 * Notice that the database itself isn't created or opened 680 * until SQLiteOpenHelper.getWritableDatabase is called 681 */ 682 mOpenHelper = new MainDatabaseHelper( 683 getContext(), // the application context 684 DBNAME, // the name of the database) 685 null, // uses the default SQLite cursor 686 1 // the version number 687 ); 688 689 return true; 690 } 691 692 ... 693 694 // Implements the provider's insert method 695 public Cursor insert(Uri uri, ContentValues values) { 696 // Insert code here to determine which table to open, handle error-checking, and so forth 697 698 ... 699 700 /* 701 * Gets a writeable database. This will trigger its creation if it doesn't already exist. 702 * 703 */ 704 db = mOpenHelper.getWritableDatabase(); 705 } 706 } 707 </pre> 708 <p> 709 710 {@link android.database.sqlite.SQLiteOpenHelper#onCreate(SQLiteDatabase) 711 SQLiteOpenHelper.onCreate()}, : 712 </p> 713 <pre class="prettyprint"> 714 ... 715 // A string that defines the SQL statement for creating a table 716 private static final String SQL_CREATE_MAIN = "CREATE TABLE " + 717 "main " + // Table's name 718 "(" + // The columns in the table 719 " _ID INTEGER PRIMARY KEY, " + 720 " WORD TEXT" 721 " FREQUENCY INTEGER " + 722 " LOCALE TEXT )"; 723 ... 724 /** 725 * Helper class that actually creates and manages the provider's underlying data repository. 726 */ 727 protected static final class MainDatabaseHelper extends SQLiteOpenHelper { 728 729 /* 730 * Instantiates an open helper for the provider's SQLite data repository 731 * Do not do database creation and upgrade here. 732 */ 733 MainDatabaseHelper(Context context) { 734 super(context, DBNAME, null, 1); 735 } 736 737 /* 738 * Creates the data repository. This is called when the provider attempts to open the 739 * repository and SQLite reports that it doesn't exist. 740 */ 741 public void onCreate(SQLiteDatabase db) { 742 743 // Creates the main table 744 db.execSQL(SQL_CREATE_MAIN); 745 } 746 } 747 </pre> 748 749 750 <!-- Implementing ContentProvider MIME Types --> 751 <h2 id="MIMETypes"> MIME ContentProvider</h2> 752 <p> 753 {@link android.content.ContentProvider} MIME: 754 </p> 755 <dl> 756 <dt> 757 {@link android.content.ContentProvider#getType(Uri) getType()} 758 </dt> 759 <dd> 760 , . 761 </dd> 762 <dt> 763 {@link android.content.ContentProvider#getStreamTypes(Uri, String) getStreamTypes()} 764 </dt> 765 <dd> 766 , , . 767 </dd> 768 </dl> 769 <h3 id="TableMIMETypes"> MIME </h3> 770 <p> 771 {@link android.content.ContentProvider#getType(Uri) getType()} 772 {@link java.lang.String} MIME, , 773 URI . {@link android.net.Uri} , URI; 774 , URI , 775 . 776 </p> 777 <p> 778 , , HTML JPEG, 779 {@link android.content.ContentProvider#getType(Uri) getType()} 780 MIME. 781 - 782 <a href="http://www.iana.org/assignments/media-types/index.htm">IANA MIME Media Types</a>. 783 </p> 784 <p> 785 URI , , 786 {@link android.content.ContentProvider#getType(Uri) getType()} 787 MIME MIME , Android: 788 </p> 789 <ul> 790 <li> 791 : <code>vnd</code> 792 </li> 793 <li> 794 : 795 <ul> 796 <li> 797 URI : <code>android.cursor.<strong>item</strong>/</code> 798 </li> 799 <li> 800 URI : <code>android.cursor.<strong>dir</strong>/</code> 801 </li> 802 </ul> 803 </li> 804 <li> 805 : <code>vnd.<name></code>.<code><type></code> 806 <p> 807 <code><name></code> <code><type></code>. 808 <code><name></code> , 809 <code><type></code> 810 URI. <code><name></code> 811 Android . 812 <code><type></code> , 813 URI . 814 </p> 815 816 </li> 817 </ul> 818 <p> 819 , 820 <code>com.example.app.provider</code>, 821 <code>table1</code>, MIME <code>table1</code> : 822 </p> 823 <pre> 824 vnd.android.cursor.<strong>dir</strong>/vnd.com.example.provider.table1 825 </pre> 826 <p> 827 <code>table1</code> MIME : 828 </p> 829 <pre> 830 vnd.android.cursor.<strong>item</strong>/vnd.com.example.provider.table1 831 </pre> 832 <h3 id="FileMIMETypes"> MIME </h3> 833 <p> 834 , 835 {@link android.content.ContentProvider#getStreamTypes(Uri, String) getStreamTypes()}. 836 {@link java.lang.String} MIME , 837 URI . MIME, 838 MIME, . 839 </p> 840 <p> 841 , , <code>.jpg</code>, 842 <code>.png</code> <code>.gif</code>. 843 {@link android.content.ContentResolver#getStreamTypes(Uri, String) 844 ContentResolver.getStreamTypes()} <code>image/*</code> ( ), 845 {@link android.content.ContentProvider#getStreamTypes(Uri, String) 846 ContentProvider.getStreamTypes()} 847 : 848 </p> 849 <pre> 850 { "image/jpeg", "image/png", "image/gif"} 851 </pre> 852 <p> 853 <code>.jpg</code>, 854 {@link android.content.ContentResolver#getStreamTypes(Uri, String) 855 ContentResolver.getStreamTypes()} <code>*\/jpeg</code>; 856 {@link android.content.ContentProvider#getStreamTypes(Uri, String) 857 ContentProvider.getStreamTypes()} : 858 <pre> 859 {"image/jpeg"} 860 </pre> 861 <p> 862 MIME, , 863 {@link android.content.ContentProvider#getStreamTypes(Uri, String) getStreamTypes()} 864 <code>null</code>. 865 </p> 866 867 868 <!-- Implementing a Contract Class --> 869 <h2 id="ContractClass"> -</h2> 870 <p> 871 - <code>public final</code>, 872 URI, , MIME . 873 874 URI, 875 . . 876 </p> 877 <p> 878 - , , 879 , URI. , 880 Javadoc. , 881 Eclipse, - Javadoc 882 . 883 </p> 884 <p> 885 - , 886 - <code>.jar</code>. 887 </p> 888 <p> 889 - 890 {@link android.provider.ContactsContract} . 891 </p> 892 <h2 id="Permissions"> </h2> 893 <p> 894 Android 895 <a href="{@docRoot}guide/topics/security/security.html"> </a>. 896 , <a href="{@docRoot}guide/topics/data/data-storage.html"> </a> 897 , . 898 . 899 </p> 900 <ul> 901 <li> 902 903 . 904 </li> 905 <li> 906 {@link android.database.sqlite.SQLiteDatabase} 907 . 908 </li> 909 <li> 910 , , <em></em>, 911 <em> </em>. , 912 , API . 913 </li> 914 <li> 915 SQLite, , 916 , . 917 , 918 , , , 919 . 920 , . 921 </li> 922 </ul> 923 <p> 924 , 925 , SQLite (, 926 ), . 927 </p> 928 <h3> </h3> 929 <p> 930 , 931 , . , 932 933 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 934 <provider></a></code> . , 935 , . 936 </p> 937 <p> 938 939 <code><a href="{@docRoot}guide/topics/manifest/permission-element.html"> 940 <permission></a></code> . 941 , , Java, 942 <code><a href="{@docRoot}guide/topics/manifest/permission-element.html#nm"> 943 android:name</a></code>. , 944 <code>com.example.app.provider.permission.READ_PROVIDER</code>. 945 946 </p> 947 <p> 948 , , 949 , . 950 . 951 </p> 952 <dl> 953 <dt> 954 / 955 </dt> 956 <dd> 957 , , , 958 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#prmsn"> 959 android:permission</a></code> 960 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 961 <provider></a></code>. 962 </dd> 963 <dt> 964 / 965 </dt> 966 <dd> 967 . 968 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#rprmsn"> 969 android:readPermission</a></code> 970 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#wprmsn"> 971 android:writePermission</a></code> 972 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 973 <provider></a></code>. , 974 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#prmsn"> 975 android:permission</a></code>. 976 </dd> 977 <dt> 978 979 </dt> 980 <dd> 981 , / URI . 982 URI, , 983 <code><a href="{@docRoot}guide/topics/manifest/path-permission-element.html"> 984 <path-permission></a></code> 985 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 986 <provider></a></code>. URI 987 /, , . 988 /. , 989 . 990 </dd> 991 <dt> 992 993 </dt> 994 <dd> 995 , 996 , . 997 , 998 . , , 999 , , 1000 . 1001 <p> 1002 , , 1003 1004 . , 1005 URI . , 1006 , , , 1007 URI . 1008 . , 1009 . 1010 </p> 1011 <p> 1012 , 1013 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn"> 1014 android:grantUriPermissions</a></code> 1015 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 1016 <provider></a></code>, 1017 <code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"> 1018 <grant-uri-permission></a></code> 1019 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 1020 <provider></a></code>. , 1021 {@link android.content.Context#revokeUriPermission(Uri, int) 1022 Context.revokeUriPermission()} , URI 1023 , URI . 1024 </p> 1025 <p> 1026 , . 1027 <code>true</code>, 1028 , , 1029 . 1030 </p> 1031 <p> 1032 <code>false</code>, 1033 <code><a href="{@docRoot}guide/topics/manifest/grant-uri-permission-element.html"> 1034 <grant-uri-permission></a></code> 1035 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 1036 <provider></a></code>. URI , 1037 . 1038 </p> 1039 <p> 1040 , 1041 {@link android.content.Intent#FLAG_GRANT_READ_URI_PERMISSION} 1042 {@link android.content.Intent#FLAG_GRANT_WRITE_URI_PERMISSION} , . 1043 {@link android.content.Intent#setFlags(int) setFlags()}. 1044 </p> 1045 <p> 1046 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn"> 1047 android:grantUriPermissions</a></code> , , 1048 <code>false</code>. 1049 </p> 1050 </dd> 1051 </dl> 1052 1053 1054 1055 <!-- The Provider Element --> 1056 <h2 id="ProviderElement"> <provider></h2> 1057 <p> 1058 {@link android.app.Activity} {@link android.app.Service}, 1059 {@link android.content.ContentProvider} 1060 1061 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 1062 <provider></a></code>. , Android 1063 . 1064 <dl> 1065 <dt> 1066 1067 (<a href="{@docRoot}guide/topics/manifest/provider-element.html#auth">{@code 1068 android:authorities}</a>) 1069 </dt> 1070 <dd> 1071 , . 1072 1073 <a href="#ContentURI"> URI </a>. 1074 </dd> 1075 <dt> 1076 1077 (<code> 1078 <a href="{@docRoot}guide/topics/manifest/provider-element.html#nm">android:name</a> 1079 </code>) 1080 </dt> 1081 <dd> 1082 , {@link android.content.ContentProvider}. 1083 1084 <a href="#ContentProvider"> ContentProvider</a>. 1085 </dd> 1086 <dt> 1087 1088 </dt> 1089 <dd> 1090 , , 1091 : 1092 <ul> 1093 <li> 1094 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#gprmsn"> 1095 android:grantUriPermssions</a></code>: ; 1096 </li> 1097 <li> 1098 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#prmsn"> 1099 android:permission</a></code>: / ; 1100 </li> 1101 <li> 1102 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#rprmsn"> 1103 android:readPermission</a></code>: ; 1104 </li> 1105 <li> 1106 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#wprmsn"> 1107 android:writePermission</a></code>: . 1108 </li> 1109 </ul> 1110 <p> 1111 1112 1113 <a href="#Permissions"> </a>. 1114 </p> 1115 </dd> 1116 <dt> 1117 1118 </dt> 1119 <dd> 1120 Android, 1121 , : 1122 <ul> 1123 <li> 1124 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#enabled"> 1125 android:enabled</a></code>: , ; 1126 </li> 1127 <li> 1128 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#exported"> 1129 android:exported</a></code>: , ; 1130 </li> 1131 <li> 1132 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#init"> 1133 android:initOrder</a></code>: 1134 ( ); 1135 </li> 1136 <li> 1137 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#multi"> 1138 android:multiProcess</a></code>: , 1139 , ; 1140 </li> 1141 <li> 1142 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#proc"> 1143 android:process</a></code>: , 1144 ; 1145 </li> 1146 <li> 1147 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#sync"> 1148 android:syncable</a></code>: , , 1149 . 1150 </li> 1151 </ul> 1152 <p> 1153 , 1154 1155 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 1156 <provider></a></code>. 1157 </p> 1158 </dd> 1159 <dt> 1160 1161 </dt> 1162 <dd> 1163 : 1164 <ul> 1165 <li> 1166 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#icon"> 1167 android:icon</a></code>: , . 1168 1169 <em></em>><em></em>><em></em>. 1170 </li> 1171 <li> 1172 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html#label"> 1173 android:label</a></code>: 1174 , . 1175 <em></em>><em></em>><em></em>. 1176 </li> 1177 </ul> 1178 <p> 1179 , 1180 <code><a href="{@docRoot}guide/topics/manifest/provider-element.html"> 1181 <provider></a></code>. 1182 </p> 1183 </dd> 1184 </dl> 1185 1186 <!-- Intent Access --> 1187 <h2 id="Intents"> </h2> 1188 <p> 1189 {@link android.content.Intent}. 1190 - {@link android.content.ContentResolver} 1191 {@link android.content.ContentProvider}. , , 1192 . 1193 . , , 1194 . 1195 , 1196 ; , 1197 . 1198 </p> 1199 <p> 1200 1201 </p> 1202 <p> 1203 , . , 1204 , . 1205 1206 , . , . 1207 , 1208 . 1209 </p> 1210 <p> 1211 1212 . 1213 <a href="{@docRoot}guide/components/intents-filters.html"> Intent Intent</a>. 1214 </p> 1215