blob: 2fa2ed3c9bdf9ecc1e500828d93d15b032d7b45b [file] [log] [blame]
page.title=Trình cung cp Danh b
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Xem nhanh</h2>
<ul>
<li>Kho lưu gi thông tin v con người ca Android.</li>
<li>
Đồng b vi web.
</li>
<li>
Tích hp d liu theo lung xã hi.
</li>
</ul>
<h2>Trong tài liu này</h2>
<ol>
<li>
<a href="#InformationTypes">T chc Trình cung cp Danh bạ</a>
</li>
<li>
<a href="#RawContactBasics">Liên lc thô</a>
</li>
<li>
<a href="#DataBasics">D liu</a>
</li>
<li>
<a href="#ContactBasics">Danh bạ</a>
</li>
<li>
<a href="#Sources">D liu t Trình điu hp Đồng bộ</a>
</li>
<li>
<a href="#Permissions">Quyn được Yêu cu</a>
</li>
<li>
<a href="#UserProfile">H sơ Người dùng</a>
</li>
<li>
<a href="#ContactsProviderMetadata">Siêu d liu Trình cung cp Danh bạ</a>
</li>
<li>
<a href="#Access">Truy cp Trình cung cp Danh bạ</a>
<li>
</li>
<li>
<a href="#SyncAdapters">Trình điu hp Đồng b Trình cung cp Danh bạ</a>
</li>
<li>
<a href="#SocialStream">D liu t Lung Xã hi</a>
</li>
<li>
<a href="#AdditionalFeatures">Các Tính năng B sung ca Trình cung cp Danh bạ</a>
</li>
</ol>
<h2>Lp khóa</h2>
<ol>
<li>{@link android.provider.ContactsContract.Contacts}</li>
<li>{@link android.provider.ContactsContract.RawContacts}</li>
<li>{@link android.provider.ContactsContract.Data}</li>
<li>{@code android.provider.ContactsContract.StreamItems}</li>
</ol>
<h2>Các Mu Liên quan</h2>
<ol>
<li>
<a href="{@docRoot}resources/samples/ContactManager/index.html">
Trình qun lý Danh b
</a>
</li>
<li>
<a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">
Trình điu hp Đồng b Mu</a>
</li>
</ol>
<h2>Xem thêm</h2>
<ol>
<li>
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
Ni dung Cơ bn v Trình cung cp Ni dung
</a>
</li>
</ol>
</div>
</div>
<p>
Trình cung cp Danh b là mt thành phn Android mnh m và linh hot có chc năng qun lý
kho d liu trung tâm v con người ca thiết bị. Trình cung cp Danh b là ngun ca nhng d liu
mà bn thy trong ng dng danh b ca thiết bị, và bn cũng có th truy cp d liu ca nó trong
ng dng ca chính mình và chuyn d liu gia thiết b và các dch v trc tuyến. Trình cung cp cha
đủ loi ngun d liu và c gng qun lý nhiu d liu nht có th cho mi người, kết qu
là t chc ca nó tr nên phc tp. Vì điu này, API ca trình cung cp bao gm mt
tp m rng gm các lp hp đồng và giao din to điu kin cho vic truy xut và sa đổi
d liu.
</p>
<p>
Hướng dn này trình bày nhng ni dung sau:
</p>
<ul>
<li>
Cu trúc cơ bn ca trình cung cp.
</li>
<li>
Cách truy xut d liu t trình cung cp.
</li>
<li>
Cách sa đổi d liu trong trình cung cp.
</li>
<li>
Cách ghi mt trình điu hp đồng b để đồng b hóa d liu t máy ch ca bn vi
Trình cung cp Danh bạ.
</li>
</ul>
<p>
Hướng dn này gi s rng bn biết nhng ni dung cơ bn v trình cung cp ni dung Android. Để tìm hiu thêm
v trình cung cp ni dung Android, hãy đọc hướng dn
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
Ni dung Cơ bn v Trình cung cp Ni dung</a>. ng dng mu
<a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">Trình điu hp Đồng b Mu</a>
là mt ví d v cách s dng mt trình điu hp đồng b để chuyn d liu gia Trình cung cp
Danh b và ng dng mu được lưu tr bi Dch v Web Google.
</p>
<h2 id="InformationTypes">T chc Trình cung cp Danh bạ</h2>
<p>
Trình cung cp Danh b là mt thành phn ca trình cung cp ni dung Android. Nó cha ba loi
d liu v mt người, tng loi tương ng vi mt bng do trình cung cp đưa ra, như
được minh ha trong hình 1:
</p>
<img src="{@docRoot}images/providers/contacts_structure.png" alt="" height="364" id="figure1" />
<p class="img-caption">
<strong>Hình 1.</strong> Cu trúc bng ca Trình cung cp Danh bạ.
</p>
<p>
Ba bng này thường được đề cp theo tên các lp hp đồng ca chúng. Các lp này
s định nghĩa các hng s cho URI ni dung, tên ct và giá tr ct được s dng bi các bng:
</p>
<dl>
<dt>
Bng {@link android.provider.ContactsContract.Contacts}
</dt>
<dd>
Hàng th hin nhng người khác nhau da trên tng hp ca các hàng liên lc thô.
</dd>
<dt>
Bng {@link android.provider.ContactsContract.RawContacts}
</dt>
<dd>
Hàng cha mt bn tng hp d liu v mt người, liên quan ti tài khon và loi người dùng.
</dd>
<dt>
Bng {@link android.provider.ContactsContract.Data}
</dt>
<dd>
Hàng cha các thông tin chi tiết v liên lc thô, chng hn như địa ch e-mail hoc s đin thoi.
</dd>
</dl>
<p>
Các bng khác được đại din bi các lp hp đồng trong {@link android.provider.ContactsContract}
là bng ph mà Trình cung cp Danh b s dng để qun lý thao tác ca nó hoc h tr
các chc năng c th trong ng dng danh b hoc đin thoi ca thiết bị.
</p>
<h2 id="RawContactBasics">Liên lc thô</h2>
<p>
Mt liên lc thô th hin d liu ca mt người xut phát t mt loi tài khon và tên tài khon
riêng. Vì Trình cung cp Danh b cho phép nhiu hơn mt dch v trc tuyến làm ngun
d liu cho mt người, Trình cung cp Danh b cho phép nhiu liên lc thô cho cùng mt người.
Nhiu liên lc thô cũng cho phép người dùng kết hp d liu ca mt người t nhiu hơn mt tài khon
t cùng loi tài khon.
</p>
<p>
Hu hết d liu ca mt liên lc thô không được lưu gi trong bng
{@link android.provider.ContactsContract.RawContacts}. Thay vào đó, nó được lưu gi trong mt hoc nhiu
hàng trong bng {@link android.provider.ContactsContract.Data}. Mi hàng d liu có mt ct
{@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID Data.RAW_CONTACT_ID} chứa
giá tr {@code android.provider.BaseColumns#_ID RawContacts._ID} của
hàng {@link android.provider.ContactsContract.RawContacts} m ca nó.
</p>
<h3 id="RawContactsColumns">Các ct liên lc thô quan trng</h3>
<p>
Các ct quan trng trong bng {@link android.provider.ContactsContract.RawContacts} được
lit kê trong bng 1. Hãy đọc các lưu ý theo sau bng dưới đây:
</p>
<p class="table-caption" id="table1">
<strong>Bng 1.</strong> Các ct liên lc thô quan trng.
</p>
<table>
<tr>
<th scope="col">Tên ct</th>
<th scope="col">S dng</th>
<th scope="col">Lưu ý</th>
</tr>
<tr>
<td>
{@link android.provider.ContactsContract.SyncColumns#ACCOUNT_NAME}
</td>
<td>
Tên tài khon cho loi tài khon là ngun ca liên lc thô này.
Ví dụ, tên tài khon ca mt tài khon Google là mt trong các địa ch Gmail
ca ch s hu thiết bị. Xem mc nhp tiếp theo cho
{@link android.provider.ContactsContract.SyncColumns#ACCOUNT_TYPE} để biết thêm
thông tin.
</td>
<td>
Định dng ca tên này áp dng theo loi tài khon ca nó. Đó không nht thiết
là mt địa ch e-mail.
</td>
</tr>
<tr>
<td>
{@link android.provider.ContactsContract.SyncColumns#ACCOUNT_TYPE}
</td>
<td>
Loi tài khon là ngun ca liên lc thô này. Ví dụ, loi tài khon
ca mt tài khon Google là <code>com.google</code>. Luôn xác định loi tài khon ca bn
bng mt mã định danh min cho mt min mà bn s hu hoc kim soát. Điu này đảm bo rng loi tài khon
ca bn là duy nht.
</td>
<td>
Mt loi tài khon cung cp d liu danh b thường có mt trình điu hp đồng b liên kết để
đồng b hoá vi Trình điu hp Đồng bộ.
</tr>
<tr>
<td>
{@link android.provider.ContactsContract.RawContactsColumns#DELETED}
</td>
<td>
C "đã xóa" cho mt liên lc thô.
</td>
<td>
C này cho phép Trình cung cp Danh b duy trì hàng bên trong ti khi trình điu hp đồng b
có th xóa hàng đó khi máy ch ca chúng ri cui cùng là xóa hàng
khi kho lưu giữ.
</td>
</tr>
</table>
<h4>Lưu ý</h4>
<p>
Sau đây là các ghi chú quan trng v bng
{@link android.provider.ContactsContract.RawContacts}:
</p>
<ul>
<li>
Tên ca liên lc thô không được lưu gi trong hàng ca nó trong
{@link android.provider.ContactsContract.RawContacts}. Thay vào đó, nó được lưu gi trong
bng {@link android.provider.ContactsContract.Data}, trong mt hàng
{@link android.provider.ContactsContract.CommonDataKinds.StructuredName}. Liên lc thô
ch có mt hàng thuc loi này trong bng {@link android.provider.ContactsContract.Data}.
</li>
<li>
<strong>Chú ý:</strong> Để s dng d liu tài khon ca chính bn trong mt hàng liên lc thô, trước tiên d liu
phi được đăng ký vi {@link android.accounts.AccountManager}. Để làm điu này, hãy nhc
người dùng thêm loi tài khon và tên tài khon ca chúng vào danh sách tài khon. Nếu bn không
làm vy, Trình cung cp Danh b s t động xóa hàng liên lc thô ca bn.
<p>
Ví dụ, nếu bn mun ng dng ca mình duy trì d liu danh b cho dch v da trên nn web ca mình
vi min {@code com.example.dataservice}, và tài khon ca người dùng cho dch v ca bn
là {@code becky.sharp@dataservice.example.com}, trước tiên, người dùng phi thêm
"loại" tài khon ({@code com.example.dataservice}) và "tên" tài khon
({@code becky.smart@dataservice.example.com}) trước khi ng dng ca bn có th thêm hàng liên lc thô.
Bn có th gii thích yêu cu này vi người dùng bng tài liu, hoc bn có th nhc
người dùng thêm loi và tên này, hoc c hai. Loi tài khon và tên tài khon
được trình bày chi tiết hơn trong phn sau.
</li>
</ul>
<h3 id="RawContactsExample">Các ngun d liu liên lc thô</h3>
<p>
Để hiu cách hot động ca liên lc thô, hãy xét người dùng "Emily Dickinson", cô ta có ba tài khon
người dùng sau được xác định trên thiết b ca mình:
</p>
<ul>
<li><code>emily.dickinson@gmail.com</code></li>
<li><code>emilyd@gmail.com</code></li>
<li>Tài khon Twitter "belle_of_amherst"</li>
</ul>
<p>
Người dùng này đã kích hot <em>Đồng b Danh bạ</em> cho c ba tài khon này trong cài đặt
<em>Tài khon</em>.
</p>
<p>
Gi s Emily Dickinson m mt ca s trình duyt, đăng nhp vào Gmail bng tài khon
<code>emily.dickinson@gmail.com</code>, m
Danh bạ, và thêm "Thomas Higginson". Sau đó, cô đăng nhp vào Gmail bng tài khon
<code>emilyd@gmail.com</code> và gi mt e-mail ti "Thomas Higginson", làm vy s t động
thêm người này làm mt liên lc. Cô y cũng theo dõi "colonel_tom" (ID Twitter ca Thomas Higginson) trên
Twitter.
</p>
<p>
Trình cung cp Danh b s to ba liên lc thô do kết qu ca vic làm này:
</p>
<ol>
<li>
Mt liên lc thô cho "Thomas Higginson" liên kết vi <code>emily.dickinson@gmail.com</code>.
Loi tài khon người dùng là Google.
</li>
<li>
Mt liên lc thô th hai cho "Thomas Higginson" liên kết vi <code>emilyd@gmail.com</code>.
Loi tài khon người dùng cũng là Google. Có mt liên lc thô th hai ngay c khi
tên ging vi mt tên trước đó, vì người này đã được thêm cho mt
tài khon người dùng khác.
</li>
<li>
Mt liên lc thô th ba cho "Thomas Higginson" liên kết vi "belle_of_amherst". Loi tài khon người dùng
là Twitter.
</li>
</ol>
<h2 id="DataBasics">D liu</h2>
<p>
Như đề cp trước đó, d liu ca mt liên lc thô được lưu gi trong mt hàng
{@link android.provider.ContactsContract.Data} được liên kết vi giá tr
<code>_ID</code> ca liên lc thô. Điu này cho phép mt liên lc thô có nhiu thc th cùng loi
d liu chng hn như địa ch e-mail hay s đin thoi. Ví dụ, nếu
"Thomas Higginson" ca {@code emilyd@gmail.com} (hàng liên lc thô cho Thomas Higginson
liên kết vi tài khon Google <code>emilyd@gmail.com</code>) có mt địa ch e-mail nhà là
<code>thigg@gmail.com</code> và mt địa ch e-mail cơ quan là
<code>thomas.higginson@gmail.com</code>, Trình cung cp Danh b s lưu tr hai hàng địa ch e-mail đó
và liên kết c hai vi liên lc thô.
</p>
<p>
Để ý rng các loi d liu khác nhau được lưu gi trong mt bng này. Các hàng tên hin thị,
s đin thoi, e-mail, địa ch gi thư, nh và chi tiết trang web đều được tìm thy trong bng
{@link android.provider.ContactsContract.Data}. Để giúp qun lý điu này, bng
{@link android.provider.ContactsContract.Data} có mt s ct có tên mô tả,
và các ct còn li có tên chung. Các ni dung ca ct tên mô t có cùng ý nghĩa
không ph thuc vào loi d liu trong hàng, trong khi ni dung ca ct tên chung có
ý nghĩa khác nhau tùy vào loi d liu.
</p>
<h3 id="DescriptiveColumns">Tên ct mô tả</h3>
<p>
Mt s ví d v tên ct mô t là:
</p>
<dl>
<dt>
{@link android.provider.ContactsContract.Data#RAW_CONTACT_ID}
</dt>
<dd>
Giá tr ca ct <code>_ID</code> ca liên lc thô đối vi d liu này.
</dd>
<dt>
{@link android.provider.ContactsContract.Data#MIMETYPE}
</dt>
<dd>
Loi d liu được lưu gi trong hàng này, được th hin dưới dng mt kiu MIME tùy chnh. Trình cung cp Danh b
s dng các kiu MIME được định nghĩa trong lp con ca
{@link android.provider.ContactsContract.CommonDataKinds}. Các kiu MIME là ngun mở,
và có th được s dng bi bt k ng dng hay trình điu hp đồng b nào hot động vi Trình cung cp Danh bạ.
</dd>
<dt>
{@link android.provider.ContactsContract.DataColumns#IS_PRIMARY}
</dt>
<dd>
Nếu kiu hàng d liu này có th xy ra nhiu hơn mt ln đối vi mt liên lc thô, ct
{@link android.provider.ContactsContract.DataColumns#IS_PRIMARY} sẽ gắn cờ
hàng d liu cha d liu sơ cp cho kiu đó. Ví dụ, nếu
người dùng nhn gi mt s đin thoi cho mt liên lc và chn <strong>Đặt mc định</strong>,
khi đó hàng {@link android.provider.ContactsContract.Data} cha s đó
có ct tương ng {@link android.provider.ContactsContract.DataColumns#IS_PRIMARY} được đặt thành một
giá tr khác 0.
</dd>
</dl>
<h3 id="GenericColumns">Tên ct chung</h3>
<p>
Có 15 ct chung được đặt tên <code>DATA1</code> thông qua
<code>DATA15</code> thường có sn và thêm bn ct
chung <code>SYNC1</code> thông qua <code>SYNC4</code> mà ch được s dng bi trình điu hp
đồng bộ. Các hng s tên ct chung luôn có tác dng, không ph thuc vào loi
d liu mà hàng đó cha.
</p>
<p>
Ct <code>DATA1</code> được đánh ch mc. Trình cung cp Danh b luôn s dng ct này cho
d liu mà trình cung cp k vng s là đối tượng truy vn thường xuyên nht. Ví dụ,
trong mt hàng e-mail, ct này cha địa ch e-mail thc sự.
</p>
<p>
Theo quy ước, ct <code>DATA15</code> được dành để lưu gi d liu Binary Large Object
(BLOB) chng hn như hình thu nh ca nh.
</p>
<h3 id="TypeSpecificNames">Tên ct theo kiu</h3>
<p>
Để to điu kin làm vic vi các ct đối vi mt kiu hàng c thể, Trình cung cp Danh b
cũng cung cp các hng s tên ct theo kiu, được định nghĩa trong các lp con ca
{@link android.provider.ContactsContract.CommonDataKinds}. Các hng s ch cp mt
tên hng s khác cho cùng tên ct, điu này giúp bn truy cp d liu trong mt hàng thuc
mt kiu c thể.
</p>
<p>
Ví dụ, lp {@link android.provider.ContactsContract.CommonDataKinds.Email} định nghĩa
các hng s tên ct theo kiu cho mt hàng {@link android.provider.ContactsContract.Data} mà
có kiu MIME
{@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_ITEM_TYPE
Email.CONTENT_ITEM_TYPE}. Lp cha hng s
{@link android.provider.ContactsContract.CommonDataKinds.Email#ADDRESS} cho cột
địa ch e-mail. Giá tr thc s ca
{@link android.provider.ContactsContract.CommonDataKinds.Email#ADDRESS} là "data1", giá trị này
ging ht như tên chung ca ct.
</p>
<p class="caution">
<strong>Chú ý:</strong> Không được thêm d liu tùy chnh ca chính bn vào bng
{@link android.provider.ContactsContract.Data} bng cách s dng mt hàng có mt trong các kiu MIME được xác định trước
ca trình cung cp. Nếu làm vy, bn có th làm mt d liu hoc khiến trình cung cp
gp trc trc. Ví dụ, bn không nên thêm mt hàng có kiu MIME
{@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_ITEM_TYPE
Email.CONTENT_ITEM_TYPE} mà cha tên người dùng thay vì địa ch e-mail trong ct
<code>DATA1</code>. Nếu s dng kiu MIME tùy chnh ca mình cho hàng, khi đó bn được t do
định nghĩa tên ct theo kiu ca chính mình và s dng các ct theo cách bn mun.
</p>
<p>
Hình 2 minh ha cách các ct mô t và ct d liu xut hin trong hàng
{@link android.provider.ContactsContract.Data}, và cách mà tên ct theo kiu "phủ lên"
tên ct chung
</p>
<img src="{@docRoot}images/providers/data_columns.png" alt="How type-specific column names map to generic column names" height="311" id="figure2" />
<p class="img-caption">
<strong>Hình 2.</strong> Tên ct theo kiu và tên ct chung.
</p>
<h3 id="ColumnMaps">Lp tên ct theo kiu</h3>
<p>
Bng 2 lit kê các lp tên ct theo kiu thường được s dng nht:
</p>
<p class="table-caption" id="table2">
<strong>Bng 2.</strong> Lớp tên cột theo kiểu</p>
<table>
<tr>
<th scope="col">Lp ánh xạ</th>
<th scope="col">Kiu d liu</th>
<th scope="col">Lưu ý</th>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.CommonDataKinds.StructuredName}</td>
<td>D liu tên ca liên lc thô liên kết vi hàng d liu này.</td>
<td>Mt liên lc thô ch có mt trong nhng hàng này.</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.CommonDataKinds.Photo}</td>
<td>nh chính ca liên lc thô được liên kết vi hàng d liu này.</td>
<td>Mt liên lc thô ch có mt trong nhng hàng này.</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.CommonDataKinds.Email}</td>
<td>Địa ch e-mail ca liên lc thô được liên kết vi hàng d liu này.</td>
<td>Mt liên lc thô có th có nhiu địa ch e-mail.</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.CommonDataKinds.StructuredPostal}</td>
<td>Địa ch cng ca liên lc thô được liên kết vi hàng d liu này.</td>
<td>Mt liên lc thô có th có nhiu địa ch cng.</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.CommonDataKinds.GroupMembership}</td>
<td>Mã định danh liên kết liên lc thô vi mt trong các nhóm trong Trình cung cp Danh bạ.</td>
<td>
Nhóm là mt tính năng tùy chn ca loi tài khon và tên tài khon. Chúng được mô t
chi tiết hơn trong phn <a href="#Groups">Nhóm liên lc</a>.
</td>
</tr>
</table>
<h3 id="ContactBasics">Danh bạ</h3>
<p>
Trình cung cp Danh b kết hp các hàng liên lc thô gia tt c các loi tài khon và tên tài khon
để to thành mt <strong>liên lc</strong>. Điu này to điu kin để hin th và sa đổi tt c d liu mà mt
người dùng đã thu thp cho mt người. Trình cung cp Danh b qun lý vic to các hàng liên lc mi
và tng hp các liên lc thô vi hàng liên lc hin có. ng dng ln
trình điu hp đồng b đều không được cho phép thêm liên lc và mt s ct trong mt hàng liên lc là ct ch đọc.
</p>
<p class="note">
<strong>Lưu ý:</strong> Nếu bn c gng thêm mt liên lc vào Trình cung cp Danh b có mt
{@link android.content.ContentResolver#insert(Uri,ContentValues) insert()}, bạn sẽ gặp
li ngoi l {@link java.lang.UnsupportedOperationException}. Nếu bn c gng cp nht mt ct
mà được lit kê là "chỉ đọc," cp nht s b b qua.
</p>
<p>
Trình cung cp Danh b to mt liên lc mi để hi đáp li vic thêm mt liên lc thô mi
không khp vi bt k liên lc nào hin có. Trình cung cp cũng làm vy nếu d liu
ca mt liên lc thô hin có thay đổi sao cho nó không còn khp vi liên lc mà trước đó
nó được gn vi. Nếu mt ng dng hoc trình điu hp đồng b to mt liên lc thô mi mà
<em>khp</em> vi mt liên lc hin ti, liên lc thô mi s được tng hp vào liên lc
hin có.
</p>
<p>
Trình cung cp Danh b s liên kết mt hàng liên lc vi các hàng liên lc thô ca nó bng ct
<code>_ID</code> ca hàng liên lc đó trong bng {@link android.provider.ContactsContract.Contacts Contacts}
. Ct <code>CONTACT_ID</code> ca bng liên lc thô
{@link android.provider.ContactsContract.RawContacts} cha các giá tr <code>_ID</code> cho
các hàng liên lc liên kết vi tng hàng liên lc thô.
</p>
<p>
Bng {@link android.provider.ContactsContract.Contacts} cũng có ct
{@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} mà là một liên kết
"cố định" vi hàng liên lc đó. Vì Trình cung cp Danh b t động duy trì
các liên lc, nó có th thay đổi giá tr {@code android.provider.BaseColumns#_ID} của một hàng liên lạc
hi đáp li mt s tng hp hoc đồng bộ. Ngay c khi điu này xy ra, URI ni dung
{@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI} kết hợp với
{@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} của liên lạc sẽ vẫn
ch v hàng liên lc đó, vì thế bn có th s dng
{@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY}
để duy trì các liên kết đến liên lc "yêu thích", v.v. Ct này có định dng riêng không
liên quan ti định dng ca ct {@code android.provider.BaseColumns#_ID}.
</p>
<p>
Hình 3 minh ha mi liên quan gia ba bng chính này vi nhau.
</p>
<img src="{@docRoot}images/providers/contacts_tables.png" alt="Contacts provider main tables" height="514" id="figure4" />
<p class="img-caption">
<strong>Hình 3.</strong> Mi quan h gia các bng Danh bạ, Liên lc Thô, và Chi tiết.
</p>
<h2 id="Sources">D liu t Trình điu hp Đồng bộ</h2>
<p>
Người dùng nhp d liu danh b trc tiếp vào thiết bị, nhưng d liu cũng đi đến Trình cung cp
Danh b t các dch v web thông qua <strong>trình điu hp đồng bộ</strong>, giúp t động
chuyn d liu gia thiết b và các dch vụ. Trình điu hp đồng b chy ngm
dưới s kim soát ca h thng, và chúng gi các phương pháp {@link android.content.ContentResolver} để
qun lý d liu.
</p>
<p>
Trong Android, dch v web mà mt trình điu hp đồng b làm vic cùng s được xác định bng mt loi tài khon.
Mi trình điu hp đồng b làm vic vi mt loi tài khon, nhưng nó có th h tr nhiu tên tài khon cho
loi đó. Các loi tài khon và tên tài khon được mô t sơ qua trong phn
<a href="#RawContactsExample">Các ngun d liu liên lc thô</a>. Các định nghĩa sau trình bày
chi tiết hơn và mô t mi liên quan gia loi và tên tài khon vi các trình điu hp đồng b và dch vụ.
</p>
<dl>
<dt>
Loi tài khon
</dt>
<dd>
Xác định mt dch v mà người dùng đã lưu gi d liu trong đó. Trong phn ln thi gian, người dùng phi
xác thc dch vụ. Ví dụ, Google Contacts là mt loi tài khon được xác định
bi mã <code>google.com</code>. Giá tr này tương ng vi loi tài khon được s dng bi
{@link android.accounts.AccountManager}.
</dd>
<dt>
Tên tài khon
</dt>
<dd>
Xác định mt tài khon hoc đăng nhp c th cho mt loi tài khon. Tài khon Google Contacts
ging như tài khon Google, chúng có mt địa ch e-mail làm tên tài khon.
Các dch v khác có th s dng tên người dùng là mt t hoc id ch số.
</dd>
</dl>
<p>
Loi tài khon không nht thiết phi duy nht. Mt người dùng có th cu hình nhiu tài khon Google Contacts
và ti xung d liu ca chúng vào Trình cung cp Danh bạ; điu này có th xy ra nếu người dùng có mt tp hp
các liên lc cá nhân cho mt tên tài khon cá nhân, và mt tp hp khác cho cơ quan. Tên tài khon thường
là duy nht. Cùng nhau, chúng xác định mt dòng d liu c th gia Trình cung cp Danh b và
mt dch v bên ngoài.
</p>
<p>
Nếu mun chuyn d liu t dch v ca bn sang Trình cung cp Danh bạ, bn cn ghi
vào trình điu hp đồng b ca chính mình. Điu này được mô t chi tiết hơn trong phn
<a href="#SyncAdapters">Trình điu hp Đồng b Trình cung cp Danh bạ</a>.
</p>
<p>
Hình 4 minh ha cách mà Trình cung cp Danh b phù hp vi dòng d liu
v con người. Trong hp được đánh du "trình điều hợp đồng bộ," mi trình điu hp được ghi nhãn theo loi tài khon ca nó.
</p>
<img src="{@docRoot}images/providers/ContactsDataFlow.png" alt="Flow of data about people" height="252" id="figure5" />
<p class="img-caption">
<strong>Hình 4.</strong> Lung d liu ca Trình cung cp Danh bạ.
</p>
<h2 id="Permissions">Quyn được Yêu cu</h2>
<p>
Nhng ng dng mun truy cp Trình cung cp Danh b phi yêu cu các quyn
sau:
</p>
<dl>
<dt>Quyn truy cp đọc vào mt hoc nhiu bng</dt>
<dd>
{@link android.Manifest.permission#READ_CONTACTS}, được quy định trong
<code>AndroidManifest.xml</code> vi phn t
<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">
&lt;uses-permission&gt;</a></code> là
<code>&lt;uses-permission android:name="android.permission.READ_CONTACTS"&gt;</code>.
</dd>
<dt>Quyn truy cp ghi vào mt hoc nhiu bng</dt>
<dd>
{@link android.Manifest.permission#WRITE_CONTACTS}, được quy định trong
<code>AndroidManifest.xml</code> vi phn t
<code><a href="{@docRoot}guide/topics/manifest/uses-permission-element.html">
&lt;uses-permission&gt;</a></code> là
<code>&lt;uses-permission android:name="android.permission.WRITE_CONTACTS"&gt;</code>.
</dd>
</dl>
<p>
Nhng quyn này không m rng sang d liu h sơ người dùng. H sơ người dùng và các quyn
được yêu cu được đề cp trong phn sau,
<a href="#UserProfile">H sơ Người dùng</a>.
</p>
<p>
Nh rng d liu danh b ca người dùng là d liu cá nhân và nhy cm. Người dùng quan tâm v
quyn riêng tư ca họ, vì thế h không mun các ng dng thu thp d liu v mình hoc danh b ca mình.
Nếu không rõ ràng v lý do bn cn quyn truy cp d liu danh b ca họ, h có th cho
ng dng ca bn đánh giá thp hoc t chi cài đặt ng dng.
</p>
<h2 id="UserProfile">H sơ Người dùng</h2>
<p>
Bng {@link android.provider.ContactsContract.Contacts} có mt hàng đơn cha
d liu h sơ cho người dùng ca thiết bị. D liu này mô t <code>user</code> ca thiết b ch không phi
ca mt trong các liên lc ca người dùng. Hàng liên lc h sơ được liên kết vi hàng
liên lc thô đối vi tng h thng s dng h sơ.
Mi hàng liên lc thô ca h sơ có th có nhiu hàng d liu. Các hng s để truy cp h sơ
người dùng có sn trong lp {@link android.provider.ContactsContract.Profile}.
</p>
<p>
Truy cp h sơ người dùng đòi hi phi có các quyn đặc bit. Ngoài các quyn
{@link android.Manifest.permission#READ_CONTACTS} và
{@link android.Manifest.permission#WRITE_CONTACTS} cần để đọc và ghi, truy cập
h sơ người dùng còn yêu cu quyn {@code android.Manifest.permission#READ_PROFILE} và
{@code android.Manifest.permission#WRITE_PROFILE} tương ứng cho quyền truy cập đọc và
ghi.
</p>
<p>
Nh rng bn nên coi h sơ ca mt người dùng là ni dung nhy cm. Quyn
{@code android.Manifest.permission#READ_PROFILE} cho phép bạn truy cập dữ liệu xác định cá nhân
ca người dùng thiết bị. Chc chn phi nói cho người dùng biết lý do ti sao
bn cn các quyn truy cp h sơ người dùng trong phn mô t ng dng ca mình.
</p>
<p>
Để truy xut hàng liên lc cha h sơ ca người dùng,
hãy gi {@link android.content.ContentResolver#query(Uri,String[], String, String[], String)
ContentResolver.query()}. Đặt URI ni dung thành
{@link android.provider.ContactsContract.Profile#CONTENT_URI} và không cung cấp bất kỳ
tiêu chí la chn nào. Bn cũng có th s dng URI ni dung này làm URI cơ s để truy xut các liên lc thô
hoc d liu cho h sơ. Ví dụ, đon mã HTML này truy xut d liu cho h sơ:
</p>
<pre>
// Sets the columns to retrieve for the user profile
mProjection = new String[]
{
Profile._ID,
Profile.DISPLAY_NAME_PRIMARY,
Profile.LOOKUP_KEY,
Profile.PHOTO_THUMBNAIL_URI
};
// Retrieves the profile from the Contacts Provider
mProfileCursor =
getContentResolver().query(
Profile.CONTENT_URI,
mProjection ,
null,
null,
null);
</pre>
<p class="note">
<strong>Lưu ý:</strong> Nếu bn truy xut nhiu hàng liên lc và mun xác định xem mt trong s chúng có phi
là h sơ người dùng không, hãy kim tra ct
{@link android.provider.ContactsContract.ContactsColumns#IS_USER_PROFILE} của hàng. Cột này
được đặt thành "1" nếu liên lc là h sơ người dùng.
</p>
<h2 id="ContactsProviderMetadata">Siêu d liu Trình cung cp Danh bạ</h2>
<p>
Trình cung cp Danh b qun lý d liu theo dõi trng thái ca d liu danh b trong
kho lưu giữ. Siêu d liu v kho lưu gi này được lưu gi nhiu nơi khác nhau, bao gm
các hàng bng Liên lc Thô, D liu, và Danh bạ, bng
{@link android.provider.ContactsContract.Settings}, và bng
{@link android.provider.ContactsContract.SyncState}. Bng sau đây cho biết
nh hưởng ca tng mc trong siêu d liu này:
</p>
<p class="table-caption" id="table3">
<strong>Bng 3.</strong> Siêu dữ liệu trong Trình cung cấp Danh bạ</p>
<table>
<tr>
<th scope="col">Bng</th>
<th scope="col">Ct</th>
<th scope="col">Giá trị</th>
<th scope="col" nghĩa</th>
</tr>
<tr>
<td rowspan="2">{@link android.provider.ContactsContract.RawContacts}</td>
<td rowspan="2">{@link android.provider.ContactsContract.SyncColumns#DIRTY}</td>
<td>"0" - không thay đổi k t ln đồng b cui cùng.</td>
<td rowspan="2">
Đánh du các liên lc thô đã được thay đổi trên thiết b và phi được đồng b tr li
máy chủ. Giá tr được đặt t động bi Trình cung cp Danh b khi các ng dng
Android cp nht mt hàng.
<p>
Các trình điu hp đồng b sa đổi bng liên lc thô hoc d liu nên luôn ni
xâu {@link android.provider.ContactsContract#CALLER_IS_SYNCADAPTER} với
URI ni dung mà chúng s dng. Làm vy s ngăn không cho trình cung cp đánh du hàng là không tt.
Nếu không, các sa đổi trình điu hp đồng b xem như sa đổi cc b và được
gi ti máy chủ, ngay c khi máy ch là ngun sa đổi.
</p>
</td>
</tr>
<tr>
<td>"1" - đã thay đổi k t ln đồng b cui cùng, cn được đồng b li máy chủ.</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.RawContacts}</td>
<td>{@link android.provider.ContactsContract.SyncColumns#VERSION}</td>
<td>S phiên bn ca hàng này.</td>
<td>
Trình cung cp Danh b t động tăng dn giá tr này bt c khi nào hàng hoc
d liu có liên quan ca hàng thay đổi.
</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.Data}</td>
<td>{@link android.provider.ContactsContract.DataColumns#DATA_VERSION}</td>
<td>S phiên bn ca hàng này.</td>
<td>
Trình cung cp Danh b t động tăng dn giá tr này bt c khi nào hàng d liu
b thay đổi.
</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.RawContacts}</td>
<td>{@link android.provider.ContactsContract.SyncColumns#SOURCE_ID}</td>
<td>
Mt xâu giá tr xác định duy nht liên lc thô này cho tài khon mà
nó được to trong đó.
</td>
<td>
Khi mt trình điu hp đồng b to mt liên lc thô mi, ct này nên được đặt thành
ID duy nht ca máy ch dành cho liên lc thô đó. Khi mt ng dng Android to mt liên lc thô
mi, ng dng đó s để trng ct này. Điu này báo hiu vi trình điu hp
đồng b rng nó nên to mt liên lc thô mi trên máy chủ, và ly mt
giá tr cho {@link android.provider.ContactsContract.SyncColumns#SOURCE_ID}.
<p>
C thể, id ngun phi là <strong>duy nht</strong> đối vi tng loi tài khon
và nên n định gia các ln đồng bộ:
</p>
<ul>
<li>
Duy nht: Mi liên lc thô đối vi mt tài khon phi có id ngun riêng ca mình. Nếu không
thi hành điu này, bn s gây ra s c trong ng dng danh bạ.
Để ý rng hai liên lc thô đối vi cùng <em>loi</em> tài khon có th có
cùng id ngun. Ví dụ, liên lc thô "Thomas Higginson" đối vi
tài khon {@code emily.dickinson@gmail.com} được cho phép có cùng id ngun
như liên lc thô "Thomas Higginson" đối vi tài khon
{@code emilyd@gmail.com}.
</li>
<li>
n định: Id ngun là mt b phn c định ca d liu t dch v trc tuyến đối vi
liên lc thô. Ví dụ, nếu người dùng xóa Lưu tr Danh b khi
cài đặt ng dng và đồng b li, các liên lc thô được khôi phc s có cùng
id ngun như trước. Nếu bn không thi hành điu này, các li tt s dng
hot động.
</li>
</ul>
</td>
</tr>
<tr>
<td rowspan="2">{@link android.provider.ContactsContract.Groups}</td>
<td rowspan="2">{@link android.provider.ContactsContract.GroupsColumns#GROUP_VISIBLE}</td>
<td>"0" - Các liên lc trong nhóm này không nên được hin th trong UI ng dng Android.</td>
<td>
Ct này dành cho tính tương thích vi các máy ch mà cho phép người dùng n các liên lc trong
mt s nhóm.
</td>
</tr>
<tr>
<td>"1" - Các liên lc trong nhóm này được cho phép hin th trong UI ng dng.</td>
</tr>
<tr>
<td rowspan="2">{@link android.provider.ContactsContract.Settings}</td>
<td rowspan="2">
{@link android.provider.ContactsContract.SettingsColumns#UNGROUPED_VISIBLE}</td>
<td>
"0" - Đối vi tài khon và loi tài khon này, nhng liên lc không thuc v nhóm
được n đối vi UI ng dng Android.
</td>
<td rowspan="2">
Theo mc định, các liên lc được hin th nếu không có liên lc thô nào ca chúng thuc v mt nhóm
(Tư cách thành viên nhóm đối vi mt liên lc thô được th hin bng mt hoc nhiu hàng
{@link android.provider.ContactsContract.CommonDataKinds.GroupMembership} trong
bng {@link android.provider.ContactsContract.Data}).
Bng cách đặt c này trong hàng bng {@link android.provider.ContactsContract.Settings} đối vi
mt loi tài khon và tài khon, bn có th buc nhng liên lc không có nhóm phi hin thị.
Mt công dng ca c này đó là để hin th liên lc t các máy ch không s dng nhóm.
</td>
</tr>
<tr>
<td>
"1" - Đối vi tài khon và loi tài khon này, nhng liên lc không thuc v nhóm
s được hin th đối vi UI ng dng.
</td>
</tr>
<tr>
<td>{@link android.provider.ContactsContract.SyncState}</td>
<td>(tt cả)</td>
<td>
S dng bng này để lưu gi siêu d liu cho trình điu hp đồng b ca bn.
</td>
<td>
Vi bng này, bn có th lưu gi trng thái đồng b và các d liu khác liên quan ti đồng b mt cách lâu dài
trên thiết bị.
</td>
</tr>
</table>
<h2 id="Access">Truy cp Trình cung cp Danh bạ</h2>
<p>
Phn này mô t các hướng dn v truy cp d liu t Trình cung cp Danh bạ, tp trung vào nhng
ni dung sau:
</p>
<ul>
<li>
Truy vn thc thể.
</li>
<li>
Sa đổi hàng lot.
</li>
<li>
Truy xut và sa đổi bng ý định.
</li>
<li>
Toàn vn d liu.
</li>
</ul>
<p>
Thc hin sa đổi t mt trình điu hp đồng b cũng được đề cp chi tiết hơn trong phn
<a href="#SyncAdapters">Trình điu hp Đồng b Trình cung cp Danh bạ</a>.
</p>
<h3 id="Entities">Truy vn thc thể</h3>
<p>
Vì các bng ca Trình cung cp Danh b được t chc theo mt phân cp, thường s hu ích nếu
truy xut mt hàng và tt c hàng "con" được liên kết vi nó. Ví dụ, để hin th
tt c thông tin cho mt người, bn có th mun truy xut tt c hàng
{@link android.provider.ContactsContract.RawContacts} đối vi mt hàng
{@link android.provider.ContactsContract.Contacts} đơn, hoc tt c hàng
{@link android.provider.ContactsContract.CommonDataKinds.Email} đối vi mt hàng
{@link android.provider.ContactsContract.RawContacts} đơn. Để to điu kin cho điu này, Trình cung cp
Danh b s cung cp các cu trúc <strong>thc thể</strong> đóng vai trò như liên kết cơ s d liu
gia các bng.
</p>
<p>
Thc th ging như mt bng bao gm các ct được chn t mt bng m và bng con ca nó.
Khi bn truy vn mt thc thể, bn cung cp mt d tho và các tiêu chí da trên các ct
có sn t thc thể. Kết qu là mt {@link android.database.Cursor} trong đó cha
mt hàng cho tng hàng bng con được truy xut. Ví dụ, nếu bn truy vn
{@link android.provider.ContactsContract.Contacts.Entity} cho mt tên liên lc
và tt c hàng {@link android.provider.ContactsContract.CommonDataKinds.Email} đối vi tt c
liên lc thô cho tên đó, bn s nhn li mt {@link android.database.Cursor} cha mt hàng
cho mi hàng {@link android.provider.ContactsContract.CommonDataKinds.Email}.
</p>
<p>
Các thc th s đơn gin hóa vic truy vn. Bng cách s dng mt thc thể, bn có th truy xut ngay lp tc tt c d liu danh b cho mt
liên lc hoc liên lc thô, thay vì phi truy vn bng m trước để nhn mt
ID, và ri phi truy xut bng con bng ID đó. Đồng thi, Trình cung cp Danh b x lý
mt truy vn đối vi mt thc th trong mt giao tác đơn, điu này đảm bo rng d liu được truy xut s được
nht quán trong ni bộ.
</p>
<p class="note">
<strong>Lưu ý:</strong> Mt thc th thường không cha tt c ct ca bng m và
bng con. Nếu bn c gng làm vic vi mt tên ct không có trong danh sách các hng s tên ct
đối vi thc th đó, bn s nhn được mt {@link java.lang.Exception}.
</p>
<p>
Đon mã HTML sau cho biết cách truy xut tt c hàng liên lc thô cho mt liên lc. Đon mã HTML
là b phn ca mt ng dng ln hơn có hai hot động, "chính" và "chi tiết". Hot động chính
hin th mt danh sách các hàng liên lc; khi người dùng chn mt hàng, hot động s gi ID ca hàng ti hot động
chi tiết. Hot động chi tiết s dng {@link android.provider.ContactsContract.Contacts.Entity}
để hin th tt c hàng d liu t tt c liên lc thô được liên kết vi liên lc
đã chn.
</p>
<p>
Đon mã HTML này được ly t hot động "chi tiết":
</p>
<pre>
...
/*
* Appends the entity path to the URI. In the case of the Contacts Provider, the
* expected URI is content://com.google.contacts/#/entity (# is the ID value).
*/
mContactUri = Uri.withAppendedPath(
mContactUri,
ContactsContract.Contacts.Entity.CONTENT_DIRECTORY);
// Initializes the loader identified by LOADER_ID.
getLoaderManager().initLoader(
LOADER_ID, // The identifier of the loader to initialize
null, // Arguments for the loader (in this case, none)
this); // The context of the activity
// Creates a new cursor adapter to attach to the list view
mCursorAdapter = new SimpleCursorAdapter(
this, // the context of the activity
R.layout.detail_list_item, // the view item containing the detail widgets
mCursor, // the backing cursor
mFromColumns, // the columns in the cursor that provide the data
mToViews, // the views in the view item that display the data
0); // flags
// Sets the ListView's backing adapter.
mRawContactList.setAdapter(mCursorAdapter);
...
&#64;Override
public Loader&lt;Cursor&gt; onCreateLoader(int id, Bundle args) {
/*
* Sets the columns to retrieve.
* RAW_CONTACT_ID is included to identify the raw contact associated with the data row.
* DATA1 contains the first column in the data row (usually the most important one).
* MIMETYPE indicates the type of data in the data row.
*/
String[] projection =
{
ContactsContract.Contacts.Entity.RAW_CONTACT_ID,
ContactsContract.Contacts.Entity.DATA1,
ContactsContract.Contacts.Entity.MIMETYPE
};
/*
* Sorts the retrieved cursor by raw contact id, to keep all data rows for a single raw
* contact collated together.
*/
String sortOrder =
ContactsContract.Contacts.Entity.RAW_CONTACT_ID +
" ASC";
/*
* Returns a new CursorLoader. The arguments are similar to
* ContentResolver.query(), except for the Context argument, which supplies the location of
* the ContentResolver to use.
*/
return new CursorLoader(
getApplicationContext(), // The activity's context
mContactUri, // The entity content URI for a single contact
projection, // The columns to retrieve
null, // Retrieve all the raw contacts and their data rows.
null, //
sortOrder); // Sort by the raw contact ID.
}
</pre>
<p>
Khi hoàn thành vic ti, {@link android.app.LoaderManager} gi ra mt lnh gi li đến
{@link android.app.LoaderManager.LoaderCallbacks#onLoadFinished(Loader, D)
onLoadFinished()}. Mt trong các tham đối đến vi phương pháp này là mt
{@link android.database.Cursor} vi các kết qu ca truy vn. Trong ng dng ca chính mình, bn có th nhn d liu
t {@link android.database.Cursor} này để hin th nó hoc thao tác thêm vi nó.
</p>
<h3 id="Transactions">Sa đổi hàng lot</h3>
<p>
Bt c khi nào có thể, bn nên chèn, cp nht và xóa d liu trong Trình cung cp Danh b trong
"chế độ hàng loạt", bng cách to mt {@link java.util.ArrayList} ca các đối tượng
{@link android.content.ContentProviderOperation} và gi
{@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}. Vì
Trình cung cp Danh b thc hin tt c thao tác trong mt
{@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()} trong một giao tác
đơn, các sa đổi ca bn s không bao gi ra khi kho lưu gi danh b mt cách
không nht quán. Sa đổi hàng lot cũng to điu kin cho vic chèn mt liên lc thô và d liu chi tiết ca liên lc
ti cùng thi đim.
</p>
<p class="note">
<strong>Lưu ý:</strong> Để sửa đổi một liên lạc thô <em>đơn</em>, hãy xét gi mt ý định ti
ng dng danh b ca thiết b thay vì x lý sa đổi trong ng dng ca bn.
Vic làm này được mô t chi tiết hơn trong phn
<a href="#Intents">Truy xut và sa đổi bng ý định</a>.
</p>
<h4>Đim kết quả</h4>
<p>
Sa đổi hàng lot cha nhiu thao tác có th chn các tiến trình khác,
dn đến tri nghim người dùng tng th không tt. Để sp xếp t chc tt c sa đổi mà bn mun
thc hin trong ít danh sách riêng nht có thể, và đồng thi ngăn chúng
chn h thng, bn nên đặt các <strong>đim kết quả</strong> cho mt hoc nhiu thao tác.
Đim kết qu là mt đối tượng {@link android.content.ContentProviderOperation} có giá tr
{@link android.content.ContentProviderOperation#isYieldAllowed()} được đặt thành
<code>true</code>. Khi các Trình cung cp Danh b gp phi mt đim kết quả, nó tm dng công vic để
cho phép các tiến trình khác chy và đóng giao tác hin ti. Khi trình cung cp bt đầu li, nó
tiếp tc vi thao tác tiếp theo trong {@link java.util.ArrayList} và bt đầu mt giao tác
mi.
</p>
<p>
Đim kết qu dn đến có nhiu hơn mt giao tác trên mi lnh gi ti
{@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}. Vì
điu này, bn nên đặt mt đim kết qu cho thao tác cui cùng đối vi mt tp hp các hàng có liên quan.
Ví dụ, bn nên đặt mt đim kết qu cho thao tác cui cùng trong mt tp hp mà thêm
các hàng liên lc thô và hàng d liu liên kết ca chúng, hoc thao tác cui cùng đối vi mt tp hp các hàng liên quan ti
mt liên lc riêng lẻ.
</p>
<p>
Đim kết qu cũng là mt đơn v thao tác nguyên tử. Tt c truy cp gia hai đim kết qu s
hoc thành công hoc tht bi như mt đơn v riêng lẻ. Nếu bn không đặt bt k đim kết qu nào, thao tác
nguyên t nh nht chính là toàn b lot thao tác. Nếu s dng đim kết quả, bn ngăn cn
các thao tác làm gim hiu sut ca h thng, đồng thi đảm bo rng mt tp con ca
thao tác là tp nguyên tử.
</p>
<h4>Tham chiếu li sa đổi</h4>
<p>
Khi bn đang chèn mt hàng liên lc thô mi và các hàng d liu liên kết ca nó như mt tp hp các đối tượng
{@link android.content.ContentProviderOperation}, bn phi liên kết các hàng d liu vi
hàng liên lc thô bng cách chèn giá tr
{@code android.provider.BaseColumns#_ID} của liên lạc thô làm giá trị
{@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID}. Tuy nhiên, giá trị
này không có sn khi bn đang to {@link android.content.ContentProviderOperation}
cho hàng d liu, vì bn chưa áp dng
{@link android.content.ContentProviderOperation} cho hàng liên lc thô. Để khc phc điu này,
lp {@link android.content.ContentProviderOperation.Builder} có phương pháp
{@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}.
Phương pháp này cho phép bn chèn hoc sa đổi mt ct bng
kết qu ca mt thao tác trước đó.
</p>
<p>
Phương pháp {@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}
có hai tham đối:
</p>
<dl>
<dt>
<code>key</code>
</dt>
<dd>
Khóa ca mt cp khóa-giá trị. Giá tr ca tham đối này nên là tên ca mt ct
trong bng mà bn đang sa đổi.
</dd>
<dt>
<code>previousResult</code>
</dt>
<dd>
Ch mc da trên 0 ca mt giá tr trong mng đối tượng
{@link android.content.ContentProviderResult} t
{@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}. Khi
thao tác hàng lot được áp dng, kết qu ca mi thao tác được lưu gi trong mt mng kết qu
trung gian. Giá tr <code>previousResult</code> là ch mc
ca mt trong nhng kết qu này, nó được truy xut và lưu gi vi giá tr <code>key</code>
. Điu này cho phép bn chèn mt bn ghi liên lc thô mi và nhn li giá tr
{@code android.provider.BaseColumns#_ID} của nó, rồi thực hiện một "tham chiếu ngược" về
giá tr đó khi bn thêm mt hàng {@link android.provider.ContactsContract.Data}.
<p>
Toàn b mng kết qu được to khi bn ln đầu gi
{@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()},
vi kích c bng vi kích c ca {@link java.util.ArrayList} ca các đối tượng
{@link android.content.ContentProviderOperation} mà bn cung cp. Tuy nhiên, tt c
các phn t trong mng kết qu được đặt thành <code>null</code>, và nếu bn c gng
thc hin tham chiếu ngược ti mt kết qu cho mt thao tác chưa được áp dng,
{@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}
s đưa ra mt li {@link java.lang.Exception}.
</p>
</dd>
</dl>
<p>
Các đon mã HTML sau minh ha cách chèn mt liên lc thô mi và d liu hàng lot. Chúng
bao gm mã thiết lp mt đim kết qu và s dng mt tham chiếu li. Đon mã HTML là mt
phiên bn m rng ca phương pháp <code>createContacEntry()</code>, nó là mt phn ca lp
<code>ContactAdder</code> trong ng dng mu
<code><a href="{@docRoot}resources/samples/ContactManager/index.html">
Contact Manager</a></code>.
</p>
<p>
Đon mã HTML đầu tiên truy xut d liu liên lc t UI. Ti đim này, người dùng đã
chn tài khon mà liên lc thô mi nên được thêm cho tài khon đó.
</p>
<pre>
// Creates a contact entry from the current UI values, using the currently-selected account.
protected void createContactEntry() {
/*
* Gets values from the UI
*/
String name = mContactNameEditText.getText().toString();
String phone = mContactPhoneEditText.getText().toString();
String email = mContactEmailEditText.getText().toString();
int phoneType = mContactPhoneTypes.get(
mContactPhoneTypeSpinner.getSelectedItemPosition());
int emailType = mContactEmailTypes.get(
mContactEmailTypeSpinner.getSelectedItemPosition());
</pre>
<p>
Đon mã HTML tiếp theo to mt thao tác để chèn hàng liên lc thô vào bng
{@link android.provider.ContactsContract.RawContacts}:
</p>
<pre>
/*
* Prepares the batch operation for inserting a new raw contact and its data. Even if
* the Contacts Provider does not have any data for this person, you can't add a Contact,
* only a raw contact. The Contacts Provider will then add a Contact automatically.
*/
// Creates a new array of ContentProviderOperation objects.
ArrayList&lt;ContentProviderOperation&gt; ops =
new ArrayList&lt;ContentProviderOperation&gt;();
/*
* Creates a new raw contact with its account type (server type) and account name
* (user's account). Remember that the display name is not stored in this row, but in a
* StructuredName data row. No other data is required.
*/
ContentProviderOperation.Builder op =
ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, mSelectedAccount.getType())
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, mSelectedAccount.getName());
// Builds the operation and adds it to the array of operations
ops.add(op.build());
</pre>
<p>
Tiếp theo, mã to các hàng d liu cho hàng tên hin thị, đin thoi và e-mail.
</p>
<p>
Tng đối tượng b dng thao tác s s dng
{@link android.content.ContentProviderOperation.Builder#withValueBackReference(String, int) withValueBackReference()}
để nhn
{@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID}. Tham chiếu đó sẽ trỏ
ngược v đối tượng {@link android.content.ContentProviderResult} t thao tác đầu tiên,
là thao tác thêm hàng liên lc thô và tr v giá tr {@code android.provider.BaseColumns#_ID}
mi ca nó. Kết qu là, mi hàng d liu được t động liên kết bi
{@link android.provider.ContactsContract.DataColumns#RAW_CONTACT_ID}
ca nó vi hàng {@link android.provider.ContactsContract.RawContacts} mi mà nó thuc về.
</p>
<p>
Đối tượng {@link android.content.ContentProviderOperation.Builder} thêm hàng e-mail s được
gn c bng {@link android.content.ContentProviderOperation.Builder#withYieldAllowed(boolean)
withYieldAllowed()}, mà điu này đặt mt đim kết quả:
</p>
<pre>
// Creates the display name for the new raw contact, as a StructuredName data row.
op =
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
/*
* withValueBackReference sets the value of the first argument to the value of
* the ContentProviderResult indexed by the second argument. In this particular
* call, the raw contact ID column of the StructuredName data row is set to the
* value of the result returned by the first operation, which is the one that
* actually adds the raw contact row.
*/
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
// Sets the data row's MIME type to StructuredName
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
// Sets the data row's display name to the name in the UI.
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name);
// Builds the operation and adds it to the array of operations
ops.add(op.build());
// Inserts the specified phone number and type as a Phone data row
op =
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
/*
* Sets the value of the raw contact id column to the new raw contact ID returned
* by the first operation in the batch.
*/
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
// Sets the data row's MIME type to Phone
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
// Sets the phone number and type
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, phoneType);
// Builds the operation and adds it to the array of operations
ops.add(op.build());
// Inserts the specified email and type as a Phone data row
op =
ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
/*
* Sets the value of the raw contact id column to the new raw contact ID returned
* by the first operation in the batch.
*/
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
// Sets the data row's MIME type to Email
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
// Sets the email address and type
.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, emailType);
/*
* Demonstrates a yield point. At the end of this insert, the batch operation's thread
* will yield priority to other threads. Use after every set of operations that affect a
* single contact, to avoid degrading performance.
*/
op.withYieldAllowed(true);
// Builds the operation and adds it to the array of operations
ops.add(op.build());
</pre>
<p>
Đon mã HTML cui cùng hin th lnh gi ti
{@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()} mà
chèn liên lc thô mi và các hàng d liu.
</p>
<pre>
// Ask the Contacts Provider to create a new contact
Log.d(TAG,"Selected account: " + mSelectedAccount.getName() + " (" +
mSelectedAccount.getType() + ")");
Log.d(TAG,"Creating contact: " + name);
/*
* Applies the array of ContentProviderOperation objects in batch. The results are
* discarded.
*/
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (Exception e) {
// Display a warning
Context ctx = getApplicationContext();
CharSequence txt = getString(R.string.contactCreationFailure);
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(ctx, txt, duration);
toast.show();
// Log exception
Log.e(TAG, "Exception encountered while inserting contact: " + e);
}
}
</pre>
<p>
Thao tác hàng lot cũng cho phép bn trin khai <strong>kim soát đồng thi lc quan</strong>,
mt phương pháp áp dng các giao tác sa đổi mà không phi khóa kho lưu gi liên quan.
Để s dng phương pháp này, bn áp dng giao tác đó ri kim tra các sa đổi khác mà
có th đã được thc hin ti cùng thi đim. Nếu bn thy đã din ra mt sa đổi không nht quán,
hãy quay lui giao tác ca bn và th li.
</p>
<p>
Kim soát đồng thi lc quan rt hu ích đối vi thiết b di động, khi đó mi lúc ch có mt người dùng
và vic truy cp đồng thi vào mt kho lưu gi d liu hiếm khi xy ra. Vì không s dng khóa nên
không b lãng phí thi gian cho vic thiết đặt khóa hay ch các giao tác khác nh khóa ca mình.
</p>
<p>
Để s dng kim soát đồng thi lc quan trong khi đang cp nht mt hàng
{@link android.provider.ContactsContract.RawContacts} đơn, hãy làm theo các bước sau:
</p>
<ol>
<li>
Truy xut ct {@link android.provider.ContactsContract.SyncColumns#VERSION}
ca liên lc thô cùng vi d liu khác mà bn truy xut.
</li>
<li>
To mt đối tượng {@link android.content.ContentProviderOperation.Builder} phù hp để
thi hành mt ràng buc, bng cách s dng phương pháp
{@link android.content.ContentProviderOperation#newAssertQuery(Uri)}. Đối với URI nội dung,
s dng {@link android.provider.ContactsContract.RawContacts#CONTENT_URI
RawContacts.CONTENT_URI}
vi {@code android.provider.BaseColumns#_ID} của liên lạc thô được nối với nó.
</li>
<li>
Đối vi đối tượng {@link android.content.ContentProviderOperation.Builder}, hãy gi
{@link android.content.ContentProviderOperation.Builder#withValue(String, Object)
withValue()} để so sánh ct {@link android.provider.ContactsContract.SyncColumns#VERSION}
vi s phiên bn bn va truy xut.
</li>
<li>
Đối vi cùng {@link android.content.ContentProviderOperation.Builder}, hãy gi
{@link android.content.ContentProviderOperation.Builder#withExpectedCount(int)
withExpectedCount()} để đảm bo rng ch mt hàng được kim tra bng xác nhn này.
</li>
<li>
Gi {@link android.content.ContentProviderOperation.Builder#build()} để tạo đối tượng
{@link android.content.ContentProviderOperation}, ri thêm đối tượng này làm
đối tượng đầu tiên trong {@link java.util.ArrayList} mà bn chuyn cho
{@link android.content.ContentResolver#applyBatch(String, ArrayList) applyBatch()}.
</li>
<li>
Áp dng giao tác hàng lot.
</li>
</ol>
<p>
Nếu hàng liên lc thô được cp nht bi mt thao tác khác gia thi đim bn đọc hàng và
thi đim bn c gng sa đổi nó, "xác nhận" {@link android.content.ContentProviderOperation}
s tht bi, và toàn b lot thao tác s được rút khi. Sau đó, bn có th chn th li
lot hoc thc hin mt hành động khác.
</p>
<p>
Đon mã HTML sau minh ha cách to mt "xác nhận"
{@link android.content.ContentProviderOperation} sau khi truy vn mt liên lc thô đơn bng cách s dng
mt {@link android.content.CursorLoader}:
</p>
<pre>
/*
* The application uses CursorLoader to query the raw contacts table. The system calls this method
* when the load is finished.
*/
public void onLoadFinished(Loader&lt;Cursor&gt; loader, Cursor cursor) {
// Gets the raw contact's _ID and VERSION values
mRawContactID = cursor.getLong(cursor.getColumnIndex(BaseColumns._ID));
mVersion = cursor.getInt(cursor.getColumnIndex(SyncColumns.VERSION));
}
...
// Sets up a Uri for the assert operation
Uri rawContactUri = ContentUris.withAppendedId(RawContacts.CONTENT_URI, mRawContactID);
// Creates a builder for the assert operation
ContentProviderOperation.Builder assertOp = ContentProviderOperation.netAssertQuery(rawContactUri);
// Adds the assertions to the assert operation: checks the version and count of rows tested
assertOp.withValue(SyncColumns.VERSION, mVersion);
assertOp.withExpectedCount(1);
// Creates an ArrayList to hold the ContentProviderOperation objects
ArrayList ops = new ArrayList&lt;ContentProviderOperationg&gt;;
ops.add(assertOp.build());
// You would add the rest of your batch operations to "ops" here
...
// Applies the batch. If the assert fails, an Exception is thrown
try
{
ContentProviderResult[] results =
getContentResolver().applyBatch(AUTHORITY, ops);
} catch (OperationApplicationException e) {
// Actions you want to take if the assert operation fails go here
}
</pre>
<h3 id="Intents">Truy xut và sa đổi bng ý định</h3>
<p>
Vic gi mt ý định ti ng dng danh b ca thiết b cho phép bn truy cp Trình cung cp Danh b
mt cách gián tiếp. Ý định s khi động UI ng dng danh b ca thiết bị, trong đó người dùng có th
thc hin công vic liên quan ti danh bạ. Vi kiu truy cp này, người dùng có thể:
<ul>
<li>Chn mt liên lc t danh sách và tr nó v ng dng ca bn để làm vic tiếp.</li>
<li>Chnh sa d liu ca mt liên lc hin có.</li>
<li>Chèn mt liên lc thô mi cho bt k tài khon nào ca họ.</li>
<li>Xóa mt liên lc hoc d liu danh bạ.</li>
</ul>
<p>
Nếu người dùng đang chèn hoc cp nht d liu, bn có th thu thp d liu trước và gi nó như
mt phn ca ý định.
</p>
<p>
Khi bn s dng ý định để truy cp Trình cung cp Danh b thông qua ng dng danh b ca thiết bị, bn
không phi ghi UI hay mã ca chính mình để truy nhp trình cung cp. Bn cũng không phi
yêu cu quyn đọc hoc ghi đến trình cung cp. ng dng danh b ca thiết b có th
cp quyn đọc đối vi mt liên lc cho bn, và vì bn đang thc hin sa đổi đối vi
trình cung cp thông qua mt ng dng khác, bn không cn phi có quyn ghi.
</p>
<p>
Tiến trình chung để gi mt ý định nhm truy cp mt trình cung cp được mô t chi tiết trong hướng dn
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
Ni dung Cơ bn v Trình cung cp Ni dung</a> trong phn "Truy cập dữ liệu thông qua ý định." Hành động,
kiu MIME, và các giá tr d liu bn s dng cho các tác v có sn được tóm tt trong Bng 4, trong khi các giá tr
ph thêm mà bn có th s dng vi
{@link android.content.Intent#putExtra(String, String) putExtra()} được liệt kê trong
tài liu tham kho cho {@link android.provider.ContactsContract.Intents.Insert}:
</p>
<p class="table-caption" id="table4">
<strong>Bng 4.</strong> Ý định ca Trình cung cp Danh bạ.
</p>
<table style="width:75%">
<tr>
<th scope="col" style="width:10%">Tác vụ</th>
<th scope="col" style="width:5%">Hành động</th>
<th scope="col" style="width:10%">D liu</th>
<th scope="col" style="width:10%">Kiu MIME</th>
<th scope="col" style="width:25%">Lưu ý</th>
</tr>
<tr>
<td><strong>Chn mt liên lc t danh sách</strong></td>
<td>{@link android.content.Intent#ACTION_PICK}</td>
<td>
Mt trong:
<ul>
<li>
{@link android.provider.ContactsContract.Contacts#CONTENT_URI Contacts.CONTENT_URI},
mà hin th mt danh sách các liên lc.
</li>
<li>
{@link android.provider.ContactsContract.CommonDataKinds.Phone#CONTENT_URI Phone.CONTENT_URI},
mà hin th mt danh sách các s đin thoi cho mt liên lc thô.
</li>
<li>
{@link android.provider.ContactsContract.CommonDataKinds.StructuredPostal#CONTENT_URI
StructuredPostal.CONTENT_URI},
mà hin th mt danh sách các địa ch bưu đin cho mt liên lc thô.
</li>
<li>
{@link android.provider.ContactsContract.CommonDataKinds.Email#CONTENT_URI Email.CONTENT_URI},
mà hin th mt danh sách các địa ch e-mail cho mt liên lc thô.
</li>
</ul>
</td>
<td>
Không s dng
</td>
<td>
Hin th mt danh sách các liên lc thô hoc danh sách d liu t mt liên lc thô, tùy vào kiu
URI ni dung mà bn cung cp.
<p>
Gi
{@link android.app.Activity#startActivityForResult(Intent, int) startActivityForResult()},
nó tr v URI ni dung ca hàng được chn. Hình thc ca URI là URI ni dung
ca bng vi <code>LOOKUP_ID</code> ca hàng được ni vi nó.
ng dng danh b ca thiết b cp quyn đọc và ghi cho URI ni dung này
trong sut thi gian hot động ca bn. Xem hướng dn
<a href="{@docRoot}guide/topics/providers/content-provider-basics.html">
Ni dung Cơ bn v Trình cung cp Ni dung</a> để biết thêm chi tiết.
</p>
</td>
</tr>
<tr>
<td><strong>Chèn mt liên lc thô mi</strong></td>
<td>{@link android.provider.ContactsContract.Intents.Insert#ACTION Insert.ACTION}</td>
<td>Không áp dng</td>
<td>
{@link android.provider.ContactsContract.RawContacts#CONTENT_TYPE
RawContacts.CONTENT_TYPE}, kiu MIME cho mt tp hp liên các lc thô.
</td>
<td>
Hin th màn hình <strong>Thêm Liên lc</strong> ca ng dng danh b ca thiết bị. Các
giá tr ph thêm mà bn thêm vào ý định s được hin thị. Nếu được gi bng
{@link android.app.Activity#startActivityForResult(Intent, int) startActivityForResult()},
URI ni dung ca liên lc thô mi thêm s được chuyn li cho phương pháp gi li
{@link android.app.Activity#onActivityResult(int, int, Intent) onActivityResult()}
ca hot động ca bn trong tham đối {@link android.content.Intent}, trong
trường "dữ liệu". Để nhn giá trị, hãy gi {@link android.content.Intent#getData()}.
</td>
</tr>
<tr>
<td><strong>Chnh sa mt liên lc</strong></td>
<td>{@link android.content.Intent#ACTION_EDIT}</td>
<td>
{@link android.provider.ContactsContract.Contacts#CONTENT_LOOKUP_URI} đối với
liên lc. Hot động ca trình chnh sa s cho phép người dùng chnh sa bt k d liu nào được liên kết
vi liên lc này.
</td>
<td>
{@link android.provider.ContactsContract.Contacts#CONTENT_ITEM_TYPE
Contacts.CONTENT_ITEM_TYPE}, mt liên lc đơn.</td>
<td>
Hin th màn hình Chnh sa Liên lc trong ng dng danh bạ. Các giá tr ph thêm mà bn thêm
vào ý định s được hin thị. Khi người dùng nhp vào <strong>Xong</strong> để lưu các
chnh sa, hot động ca bn quay li tin cnh.
</td>
</tr>
<tr>
<td><strong>Hin th mt trình chn mà cũng có th thêm d liu.</strong></td>
<td>{@link android.content.Intent#ACTION_INSERT_OR_EDIT}</td>
<td>
Không áp dng
</td>
<td>
{@link android.provider.ContactsContract.Contacts#CONTENT_ITEM_TYPE}
</td>
<td>
Ý định này luôn hin th màn hình b chn ca ng dng danh bạ. Người dùng có th hoc
chn mt liên lc để chnh sa, hoc thêm mt liên lc mi. Hoc màn hình chnh sa hoc màn hình thêm
s xut hin, tùy vào la chn ca người dùng, và d liu ph thêm mà bn chuyn trong ý định
s được hin thị. Nếu ng dng ca bn hin th d liu chng hn như e-mail hoc s đin thoi, hãy s dng
ý định này để cho phép người dùng thêm d liu vào mt liên lc hin ti.
liên lc,
<p class="note">
<strong>Lưu ý:</strong> Không cn gi mt giá tr tên trong phn ph thêm ca ý định,
vì người dùng luôn chn mt tên hin có hoc thêm mt tên mi. Thêm na,
nếu bn gi mt tên, và người dùng chn thc hin chnh sa, ng dng danh b s
hin th tên mà bn gi, ghi đè giá tr trước. Nếu người dùng không
để ý thy điu này và lưu chnh sa, giá tr cũ s b mt.
</p>
</td>
</tr>
</table>
<p>
ng dng danh b ca thiết b không cho phép bn xóa mt liên lc thô hay bt k d liu nào bng mt
ý định. Thay vào đó, để xóa mt liên lc thô, hãy s dng
{@link android.content.ContentResolver#delete(Uri, String, String[]) ContentResolver.delete()}
hoc {@link android.content.ContentProviderOperation#newDelete(Uri)
ContentProviderOperation.newDelete()}.
</p>
<p>
Đon mã HTML sau minh ha cách xây dng và gi mt ý định để chèn mt liên lc thô mi và
d liu:
</p>
<pre>
// Gets values from the UI
String name = mContactNameEditText.getText().toString();
String phone = mContactPhoneEditText.getText().toString();
String email = mContactEmailEditText.getText().toString();
String company = mCompanyName.getText().toString();
String jobtitle = mJobTitle.getText().toString();
// Creates a new intent for sending to the device's contacts application
Intent insertIntent = new Intent(ContactsContract.Intents.Insert.ACTION);
// Sets the MIME type to the one expected by the insertion activity
insertIntent.setType(ContactsContract.RawContacts.CONTENT_TYPE);
// Sets the new contact name
insertIntent.putExtra(ContactsContract.Intents.Insert.NAME, name);
// Sets the new company and job title
insertIntent.putExtra(ContactsContract.Intents.Insert.COMPANY, company);
insertIntent.putExtra(ContactsContract.Intents.Insert.JOB_TITLE, jobtitle);
/*
* Demonstrates adding data rows as an array list associated with the DATA key
*/
// Defines an array list to contain the ContentValues objects for each row
ArrayList&lt;ContentValues&gt; contactData = new ArrayList&lt;ContentValues&gt;();
/*
* Defines the raw contact row
*/
// Sets up the row as a ContentValues object
ContentValues rawContactRow = new ContentValues();
// Adds the account type and name to the row
rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_TYPE, mSelectedAccount.getType());
rawContactRow.put(ContactsContract.RawContacts.ACCOUNT_NAME, mSelectedAccount.getName());
// Adds the row to the array
contactData.add(rawContactRow);
/*
* Sets up the phone number data row
*/
// Sets up the row as a ContentValues object
ContentValues phoneRow = new ContentValues();
// Specifies the MIME type for this data row (all data rows must be marked by their type)
phoneRow.put(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
);
// Adds the phone number and its type to the row
phoneRow.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
// Adds the row to the array
contactData.add(phoneRow);
/*
* Sets up the email data row
*/
// Sets up the row as a ContentValues object
ContentValues emailRow = new ContentValues();
// Specifies the MIME type for this data row (all data rows must be marked by their type)
emailRow.put(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
);
// Adds the email address and its type to the row
emailRow.put(ContactsContract.CommonDataKinds.Email.ADDRESS, email);
// Adds the row to the array
contactData.add(emailRow);
/*
* Adds the array to the intent's extras. It must be a parcelable object in order to
* travel between processes. The device's contacts app expects its key to be
* Intents.Insert.DATA
*/
insertIntent.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, contactData);
// Send out the intent to start the device's contacts app in its add contact activity.
startActivity(insertIntent);
</pre>
<h3 id="DataIntegrity">Toàn vn d liu</h3>
<p>
Vì kho lưu gi danh b cha d liu quan trng và nhy cm mà người dùng cho là
đúng và cp nht, Trình cung cp Danh b có các quy tc v toàn vn d liu được định nghĩa rõ ràng. Bn có
trách nhim tuân theo nhng quy tc này khi sa đổi d liu danh bạ. Các quy tc
quan trng được lit kê đây:
</p>
<dl>
<dt>
Luôn thêm mt hàng {@link android.provider.ContactsContract.CommonDataKinds.StructuredName} cho
mi hàng {@link android.provider.ContactsContract.RawContacts} mà bn thêm.
</dt>
<dd>
Hàng {@link android.provider.ContactsContract.RawContacts} không có mt hàng
{@link android.provider.ContactsContract.CommonDataKinds.StructuredName} trong bng
{@link android.provider.ContactsContract.Data} có th gây ra s c trong khi
tng hp.
</dd>
<dt>
Luôn liên kết các hàng {@link android.provider.ContactsContract.Data} mi vi hàng
{@link android.provider.ContactsContract.RawContacts} m ca chúng.
</dt>
<dd>
Mi hàng {@link android.provider.ContactsContract.Data} mà không được liên kết vi mt
{@link android.provider.ContactsContract.RawContacts} s không hin th trong ng dng danh b
ca thiết bị, và nó có th gây ra s c vi trình điu hp đồng bộ.
</dd>
<dt>
Ch thay đổi d liu đối vi nhng liên lc thô mà bn s hu.
</dt>
<dd>
Nh rng Trình cung cp Danh b luôn qun lý d liu t vài
loi tài khon/dch v trc tuyến khác nhau. Bn cn đảm bo rng ng dng ca bn ch sa đổi
hoc xóa d liu đối vi các hàng thuc v bn, và rng nó ch chèn d liu có
loi và tên tài khon mà bn kim soát.
</dd>
<dt>
Luôn s dng các hng s được định nghĩa trong {@link android.provider.ContactsContract} và các lp con ca nó
đối vi thm quyn, URI ni dung, đường dn URI, tên ct, kiu MIME, và các giá tr
{@link android.provider.ContactsContract.CommonDataKinds.CommonColumns#TYPE}.
</dt>
<dd>
S dng nhng hng s này s giúp bn tránh gp li. Bn cũng s được thông báo bng cnh báo
t trình biên dch nếu bt k hng s nào không được chp nhn.
</dd>
</dl>
<h3 id="CustomData">Hàng d liu tùy chnh</h3>
<p>
Bng cách to và s dng các kiu MIME tùy chnh ca chính mình, bn có th chèn, chnh sa, xóa và truy xut
các hàng d liu ca chính mình trong bng {@link android.provider.ContactsContract.Data}. Các hàng ca bn
b gii hn bng cách s dng ct được định nghĩa trong
{@link android.provider.ContactsContract.DataColumns}, mc dù bn có th ánh x
tên ct theo kiu ca chính mình vi tên ct mc định. Trong ng dng danh b ca thiết bị,
d liu cho các hàng ca bn được hin th nhưng không th chnh sa hay xóa được, và người dùng không th thêm
d liu b sung. Để cho phép người dùng sa đổi các hàng d liu tùy chnh ca mình, bn phi cung cp mt hot động
trình chnh sa trong ng dng ca chính mình.
</p>
<p>
Để hin th d liu tùy chnh ca mình, hãy cung cp mt tp <code>contacts.xml</code> cha mt phn t
<code>&lt;ContactsAccountType&gt;</code> và mt hoc nhiu phn t con
<code>&lt;ContactsDataKind&gt;</code> ca nó. Điu này được mô t chi tiết hơn trong
phn <a href="#SocialStreamDataKind"><code>&lt;ContactsDataKind&gt; element</code></a>.
</p>
<p>
Để tìm hiu thêm v các kiu MIME tùy chnh, hãy đọc hướng dn
<a href="{@docRoot}guide/topics/providers/content-provider-creating.html">
To mt Trình cung cp Ni dung</a>.
</p>
<h2 id="SyncAdapters">Trình điu hp Đồng b Trình cung cp Danh bạ</h2>
<p>
Trình cung cp Danh b được thiết kế riêng để x lý <strong>đồng b hoá</strong>
d liu danh b gia mt thiết b và mt dch v trc tuyến. Điu này cho phép người dùng ti
d liu hin có xung mt thiết b mi và ti d liu hin có lên mt tài khon mi.
Đồng b hoá cũng đảm bo rng người dùng có sn d liu mi nht, không ph thuc vào
ngun ca các b sung và thay đổi. Mt ưu đim khác ca đồng b hoá đó là nó khiến
d liu danh b có sn ngay c khi thiết b không được kết ni vi mng.
</p>
<p>
Mc dù bn có th trin khai đồng b hoá theo nhiu cách, h thng Android cung cp
mt khuôn kh đồng b hóa b tr có kh năng t động hóa nhng tác v sau:
<ul>
<li>
Kim tra s sn sàng ca mng.
</li>
<li>
Lp lch biu và thc hin đồng b hoá da trên tùy chn ca người dùng.
</li>
<li>
Khi động li nhng đồng b hoá đã dng.
</li>
</ul>
<p>
Để s dng khuôn kh này, bn phi cung cp mt phn b tr trình điu hp đồng bộ. Mi trình điu hp đồng b là duy nht đối vi
mt dch v và trình cung cp ni dung, nhưng có th x lý nhiu tên tài khon cho cùng dch vụ. Khuôn kh
cũng cho phép nhiu trình điu hp đồng b cho cùng dch v và trình cung cp.
</p>
<h3 id="SyncClassesFiles">Các lp và tp trình điu hp đồng bộ</h3>
<p>
Bn trin khai mt trình điu hp đồng b làm lp con ca
{@link android.content.AbstractThreadedSyncAdapter} và cài đặt nó như mt phn ca mt ng dng
Android. H thng biết v trình điu hp đồng b t các phn t trong bn kê khai ng dng
ca nó, và t mt tp XML đặc bit được ch đến trong bn kê khai. Tp XML s định nghĩa
loi tài khon cho dch v trc tuyến và thm quyn cho trình cung cp ni dung, cùng nhau chúng
xác định duy nht mt trình điu hp. Trình điu hp đồng b không được kích hot cho ti khi người dùng thêm mt
tài khon cho loi tài khon ca trình điu hp đồng b và kích hot đồng b hoá cho trình cung cp
ni dung mà trình điu hp đồng b s đồng b cùng. Ti thi đim đó, h thng bt đầu qun lý trình điu hp,
gi nó nếu cn thiết để đồng b hoá gia trình cung cp ni dung và máy chủ.
</p>
<p class="note">
<strong>Lưu ý:</strong> Vic s dng mt loi tài khon để tham gia nhn biết trình điu hp đồng b s cho phép
h thng phát hin và nhóm cùng nhau nhng trình điu hp đồng b truy cp các dch v khác nhau t
cùng t chc. Ví dụ, các trình điu hp đồng b cho dch v trc tuyến ca Google đều có cùng
loi tài khon <code>com.google</code>. Khi người dùng thêm mt tài khon Google vào thiết b ca mình, tt c
trình điu hp đồng b được cài đặt cho dch v Google được lit kê cùng nhau; mi trình điu hp đồng b
được lit kê s đồng b vi mt trình cung cp ni dung khác nhau trên thiết bị.
</p>
<p>
Vì hu hết dch v đều yêu cu người dùng xác minh danh tính ca h trước khi truy cp
d liu, h thng Android cung cp mt khuôn kh xác thc tương t như và thường
được s dng cùng vi khuôn kh ca trình điu hp đồng bộ. Khuôn kh xác thc s dng
các trình xác thc b tr là lp con ca
{@link android.accounts.AbstractAccountAuthenticator}. Mt trình xác thc s xác minh
danh tính ca người dùng theo các bước sau:
<ol>
<li>
Thu thp tên, mt khu hoc thông tin tương t ca người dùng (
<strong>thông tin xác thc</strong> ca người dùng).
</li>
<li>
Gi thông tin xác thc ti dch v
</li>
<li>
Kim tra tr li ca dch vụ.
</li>
</ol>
<p>
Nếu dch v chp nhn thông tin xác thc, trình xác thc có th
lưu gi thông tin xác thc đó để s dng sau. Vì khuôn kh trình xác thc b trợ,
{@link android.accounts.AccountManager} có th cung cp quyn truy cp bt k token xác thc nào mà mt trình xác thc
h tr và chn hin ra, chng hn như token xác thc OAuth2.
</p>
<p>
Mc dù không yêu cu xác thc, phn ln dch v danh b đều s dng nó.
Tuy nhiên, bn không phi s dng khuôn kh xác thc ca Android để thc hin xác thc.
</p>
<h3 id="SyncAdapterImplementing">Trin khai trình điu hp đồng bộ</h3>
<p>
Để trin khai mt trình điu hp đồng b cho Trình cung cp Danh bạ, bn bt đầu bng cách to mt
ng dng Android cha:
</p>
<dl>
<dt>
Mt thành phn {@link android.app.Service} để hi đáp li các yêu cu t h thng nhm
gn kết vi trình điu hp đồng bộ.
</dt>
<dd>
Khi h thng mun chy đồng b hoá, nó gi phương pháp
{@link android.app.Service#onBind(Intent) onBind()} của dịch vụ và nhận một
{@link android.os.IBinder} cho trình điu hp đồng bộ. Điu này cho phép h thng thc hin
lnh gi liên tiến trình ti các phương pháp ca trình điu hp.
<p>
Trong ng dng mu<a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">
Trình điu hp Đồng b Mu</a>, tên lp ca dch v này là
<code>com.example.android.samplesync.syncadapter.SyncService</code>.
</p>
</dd>
<dt>
Trình điu hp đồng b thc tế, được trin khai như mt lp con c th ca
{@link android.content.AbstractThreadedSyncAdapter}.
</dt>
<dd>
Lp này thc hin công vic ti xung d liu t máy chủ, ti lên d liu t
thiết bị, và x lý xung đột. Công vic chính ca trình điu hp được
thc hin trong phương pháp {@link android.content.AbstractThreadedSyncAdapter#onPerformSync(
Account, Bundle, String, ContentProviderClient, SyncResult)
onPerformSync()}. Lp này phi được khi to như mt đối tượng duy nht (singleton).
<p>
Trong ng dng mu <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">
Trình điu hp Đồng b Mu</a>, trình điu hp đồng b được định nghĩa trong lp
<code>com.example.android.samplesync.syncadapter.SyncAdapter</code>.
</p>
</dd>
<dt>
Mt lp con ca {@link android.app.Application}.
</dt>
<dd>
Lp này đóng vai trò như mt nhà máy cho đối tượng duy nht ca trình điu hp đồng bộ. S dng phương pháp
{@link android.app.Application#onCreate()} để khởi tạo trình điều hợp đồng bộ, và
cung cp mt phương pháp "bộ nhận" tĩnh để tr đối tượng duy nht v phương pháp
{@link android.app.Service#onBind(Intent) onBind()} của dịch vụ
ca trình điu hp đồng bộ.
</dd>
<dt>
<strong>Tùy chn:</strong> Mt thành phn {@link android.app.Service} để hi đáp li
các yêu cu t h thng v xác thc người dùng.
</dt>
<dd>
{@link android.accounts.AccountManager} khi động dch v này để bt đầu tiến trình
xác thc. Phương pháp {@link android.app.Service#onCreate()} của dịch vụ này sẽ khởi tạo một
đối tượng trình xác thc. Khi h thng mun xác thc mt tài khon người dùng cho trình điu hp đồng b
ca ng dng, nó s gi phương pháp
{@link android.app.Service#onBind(Intent) onBind()} của dịch vụ để nhận một
{@link android.os.IBinder} cho trình xác thc. Điu này cho phép h thng thc hin
lnh gi liên tiến trình ti các phương pháp ca trình xác thc.
<p>
Trong ng dng mu<a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">
Trình điu hp Đồng b Mu</a>, tên lp ca dch v này là
<code>com.example.android.samplesync.authenticator.AuthenticationService</code>.
</p>
</dd>
<dt>
<strong>Tùy chn:</strong> Mt lp con c th ca
{@link android.accounts.AbstractAccountAuthenticator} để x lý các yêu cu v
xác thc.
</dt>
<dd>
Lp này cung cp các phương pháp mà {@link android.accounts.AccountManager} gi ra
để xác thc các thông tin xác thc ca người dùng vi máy chủ. Các chi tiết ca
tiến trình xác thc rt khác nhau da trên công ngh máy ch đang s dng. Bn nên
tham kho tài liu cho phn mm máy ch ca mình để tìm hiu thêm v xác thc.
<p>
Trong ng dng mu <a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">
Trình điu hp Đồng b Mu</a>, trình xác thc được định nghĩa trong lp
<code>com.example.android.samplesync.authenticator.Authenticator</code>.
</p>
</dd>
<dt>
Các tp XML để định nghĩa trình điu hp đồng b và trình xác thc cho h thng.
</dt>
<dd>
Các thành phn dch v trình điu hp đồng b và trình xác thc đã nêu được
định nghĩa trong các phn t
<code>&lt;<a href="{@docRoot}guide/topics/manifest/service-element.html">service</a>&gt;</code>
bn kê khai ca ng dng. Nhng phn t này
cha các phn t con
<code>&lt;<a href="{@docRoot}guide/topics/manifest/meta-data-element.html">meta-data</a>&gt;</code>
mà cung cp d liu c th cho
h thng:
<ul>
<li>
Phn t
<code>&lt;<a href="{@docRoot}guide/topics/manifest/meta-data-element.html">meta-data</a>&gt;</code>
cho dch v trình điu hp đồng b s tr v
tp XML <code>res/xml/syncadapter.xml</code>. Đến lượt mình, tp này quy định
mt URI cho dch v web mà s được đồng b hóa vi Trình cung cp Danh bạ,
và mt loi tài khon cho dch v web.
</li>
<li>
<strong>Tùy chn:</strong> Phn t
<code>&lt;<a href="{@docRoot}guide/topics/manifest/meta-data-element.html">meta-data</a>&gt;</code>
cho trình xác thc s tr v tp XML
<code>res/xml/authenticator.xml</code>. Đến lượt mình, tp này quy định
loi tài khon mà trình xác thc này h trợ, cũng như các tài nguyên UI mà
xut hin trong tiến trình xác thc. Loi tài khon được quy định trong phn t
này phi ging như loi tài khon được quy định cho trình điu hp
đồng bộ.
</li>
</ul>
</dd>
</dl>
<h2 id="SocialStream">D liu t Lung Xã hi</h2>
<p>
Các bng {@code android.provider.ContactsContract.StreamItems} và
{@code android.provider.ContactsContract.StreamItemPhotos} qun lý
d liu đến t các mng xã hi. Bn có th ghi mt trình điu hp đồng b mà thêm d liu lung t
mng ca chính mình vào nhng bng này, hoc bn có th đọc d liu lung t nhng bng này và
hin th nó trong ng dng ca chính mình, hoc c hai. Vi nhng tính năng này, các dch v và ng dng
mng xã hi ca bn có th được tích hp vào tri nghim mng xã hi ca Android.
</p>
<h3 id="StreamText">Văn bn t lung xã hi</h3>
<p>
Các mc dòng d liu luôn được liên kết vi mt liên lc thô.
{@code android.provider.ContactsContract.StreamItemsColumns#RAW_CONTACT_ID} liên kết với giá trị
<code>_ID</code> ca liên lc thô mi. Loi tài khon và tên tài khon ca liên lc thô
cũng được lưu gi trong hàng mc dòng.
</p>
<p>
Lưu gi d liu t lung ca bn vào nhng ct sau:
</p>
<dl>
<dt>
{@code android.provider.ContactsContract.StreamItemsColumns#ACCOUNT_TYPE}
</dt>
<dd>
<strong>Bt buc.</strong> Loi tài khon ca người dùng đối vi liên lc thô được liên kết vi mc dòng
này. Nh đặt giá tr này khi bn chèn mt mc dòng.
</dd>
<dt>
{@code android.provider.ContactsContract.StreamItemsColumns#ACCOUNT_NAME}
</dt>
<dd>
<strong>Bt buc.</strong> Tên tài khon ca người dùng đối vi liên lc thô được liên kết vi mc dòng
này. Nh đặt giá tr này khi bn chèn mt mc dòng.
</dd>
<dt>
Ct mã định danh
</dt>
<dd>
<strong>Bt buc.</strong> Bn phi chèn các ct mã định danh sau khi chèn
mt mc dòng:
<ul>
<li>
{@code android.provider.ContactsContract.StreamItemsColumns#CONTACT_ID}: Giá trị
{@code android.provider.BaseColumns#_ID} của liên lạc mà mục dòng
này được liên kết vi.
</li>
<li>
{@code android.provider.ContactsContract.StreamItemsColumns#CONTACT_LOOKUP_KEY}: Giá trị
{@code android.provider.ContactsContract.ContactsColumns#LOOKUP_KEY} của liên lạc
mà mc dòng này được liên kết vi.
</li>
<li>
{@code android.provider.ContactsContract.StreamItemsColumns#RAW_CONTACT_ID}: Giá trị
{@code android.provider.BaseColumns#_ID} của liên lạc thô mà mục dòng này
được liên kết vi.
</li>
</ul>
</dd>
<dt>
{@code android.provider.ContactsContract.StreamItemsColumns#COMMENTS}
</dt>
<dd>
Tùy chn. Lưu gi thông tin tóm tt mà bn có th hin th phn đầu ca mt mc dòng.
</dd>
<dt>
{@code android.provider.ContactsContract.StreamItemsColumns#TEXT}
</dt>
<dd>
Văn bn ca mc dòng, hoc là ni dung đã được đăng bi ngun ca mc đó,
hoc là mô t v mt s hành động đã khi to mc dòng. Ct này có th cha
bt k hình nh tài nguyên định dng và được nhúng nào mà có th được kết xut bi
{@link android.text.Html#fromHtml(String) fromHtml()}. Trình cung cấp có thể cắt bớt hoặc
ct ngn bng du ba chm các ni dung dài, nhưng s c gng tránh làm hng các tag.
</dd>
<dt>
{@code android.provider.ContactsContract.StreamItemsColumns#TIMESTAMP}
</dt>
<dd>
Xâu văn bn cha thi gian mà mc dòng được chèn hoc cp nht, có
dng <em>mili giây</em> trôi qua k t gi epoch. Nhng ng dng chèn hoc cp nht mc dòng s chu
trách nhim duy trì ct này; nó không được t động duy trì bi
Trình cung cp Danh bạ.
</dd>
</dl>
<p>
Để hin th thông tin nhn dng cho các mc dòng ca bn, hãy s dng
{@code android.provider.ContactsContract.StreamItemsColumns#RES_ICON},
{@code android.provider.ContactsContract.StreamItemsColumns#RES_LABEL}, và
{@code android.provider.ContactsContract.StreamItemsColumns#RES_PACKAGE} để liên kết với các tài nguyên
trong ng dng ca mình.
</p>
<p>
Bng {@code android.provider.ContactsContract.StreamItems} cha các ct
{@code android.provider.ContactsContract.StreamItemsColumns#SYNC1} thông qua
{@code android.provider.ContactsContract.StreamItemsColumns#SYNC4} dành riêng để sử dụng
trình điu hp đồng bộ.
</p>
<h3 id="StreamPhotos">Ảnh t lung xã hi</h3>
<p>
Bng {@code android.provider.ContactsContract.StreamItemPhotos} lưu gi nh được liên kết
vi mt mc dòng. Ct
{@code android.provider.ContactsContract.StreamItemPhotosColumns#STREAM_ITEM_ID} của bảng
liên kết vi các giá tr trong {@code android.provider.BaseColumns#_ID} của bảng
{@code android.provider.ContactsContract.StreamItems}. Các tham chiếu nh được lưu gi trong
bng nhng ct này:
</p>
<dl>
<dt>
Ct {@code android.provider.ContactsContract.StreamItemPhotos#PHOTO} (một BLOB).
</dt>
<dd>
Biu din dng nh phân ca nh, được trình cung cp đổi kích c để lưu gi và hin thị.
Ct này có sn để tương thích ngược vi các phiên bn trước ca Trình cung cp
Danh b mà đã s dng nó để lưu gi nh. Tuy nhiên, trong phiên bn hin ti
bn không nên s dng ct này để lưu gi nh. Thay vào đó, hãy s dng
hoc {@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_FILE_ID} hoặc
{@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_URI} (cả hai
đều được mô t trong các đim sau) để lưu gi nh trong mt tp. Lúc này, ct này
cha mt hình thu nh ca nh sn sàng để đọc.
</dd>
<dt>
{@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_FILE_ID}
</dt>
<dd>
Mt mã định danh dng s ca nh cho mt liên lc thô. Ni giá tr này vi hng s
{@link android.provider.ContactsContract.DisplayPhoto#CONTENT_URI DisplayPhoto.CONTENT_URI}
để nhn mt URI ni dung tr v mt tp nh đơn, ri gi
{@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)
openAssetFileDescriptor()} để nhn mt điu khin (handle) cho tp nh.
</dd>
<dt>
{@code android.provider.ContactsContract.StreamItemPhotosColumns#PHOTO_URI}
</dt>
<dd>
Mt URI ni dung tr trc tiếp ti tp nh cho nh được đại din bi hàng này.
Gi {@link android.content.ContentResolver#openAssetFileDescriptor(Uri, String)
openAssetFileDescriptor()} bng URI này để nhn mt điu khin (handle) cho tp nh.
</dd>
</dl>
<h3 id="SocialStreamTables">S dng các bng lung xã hi</h3>
<p>
Nhng bng này hot động ging như các bng chính khác trong Trình cung cp Danh bạ, ngoi trừ:
</p>
<ul>
<li>
Nhng bng này yêu cu quyn truy cp b sung. Để đọc t chúng, ng dng ca bn
phi có quyn {@code android.Manifest.permission#READ_SOCIAL_STREAM}. Để
sa đổi chúng, ng dng ca bn phi có quyn
{@code android.Manifest.permission#WRITE_SOCIAL_STREAM}.
</li>
<li>
Đối vi bng {@code android.provider.ContactsContract.StreamItems}, s hàng
được lưu gi cho mi liên lc thô s b gii hn. Sau khi đạt đến gii hn này,
Trình cung cp Danh b s to khong trng cho các hàng mc dòng mi bng cách t động xóa
nhng hàng có
{@code android.provider.ContactsContract.StreamItemsColumns#TIMESTAMP} lâu nhất. Để nhận
gii hn, hãy phát hành mt truy vn ti URI ni dung
{@code android.provider.ContactsContract.StreamItems#CONTENT_LIMIT_URI}. Bạn có thể để
tt c các tham đối khác ngoài URI ni dung được đặt v <code>null</code>. Truy vn
tr v mt Con chy cha mt hàng đơn, vi ct đơn
{@code android.provider.ContactsContract.StreamItems#MAX_ITEMS}.
</li>
</ul>
<p>
Lp {@code android.provider.ContactsContract.StreamItems.StreamItemPhotos} định nghĩa mt
bng con {@code android.provider.ContactsContract.StreamItemPhotos} cha các hàng nh
cho mt mc dòng đơn.
</p>
<h3 id="SocialStreamInteraction">Tương tác t lung xã hi</h3>
<p>
D liu t lung xã hi được qun lý bi Trình cung cp Danh bạ, kết hp vi
ng dng danh b ca thiết bị, cung cp mt cách hiu qu để kết ni h thng mng xã hi ca bn
vi các liên lc hin ti. Có sn nhng tính năng sau:
</p>
<ul>
<li>
Bng cách đồng b dch v mng xã hi ca bn vi Trình cung cp Danh b bng mt trình điu hp
đồng bộ, bn có th truy xut hot động gần đây đối vi danh b ca mt người dùng và lưu gi nó trong
các bng {@code android.provider.ContactsContract.StreamItems} và
{@code android.provider.ContactsContract.StreamItemPhotos} để s dng sau.
</li>
<li>
Bên cnh vic đồng b hoá thường xuyên, bn có th kích khi trình điu hp đồng b ca mình để truy xut
d liu b sung khi người dùng chn mt liên lc để xem. Điu này cho phép trình điu hp đồng b ca bn
truy xut nh độ phân gii cao và các mc dòng gn đây nht cho liên lc đó.
</li>
<li>
Bng cách đăng ký mt thông báo vi ng dng danh b ca thiết b và Trình cung cp
Danh bạ, bn có th <em>nhn</em> mt ý định khi mt liên lc được xem, và ti thi đim đó,
cp nht trng thái ca liên lc đó t dch v ca bn. Phương pháp này có th nhanh hơn và s dng ít
băng thông hơn vic thc hin đồng b đầy đủ vi mt trình điu hp đồng bộ.
</li>
<li>
Người dùng có th thêm mt liên lc vào dch v mng xã hi ca mình trong khi đang xem liên lc đó
trong ng dng danh b ca thiết bị. Bn kích hot điu này bng tính năng "mời liên lạc",
theo đó cho phép kết hp mt hot động để thêm mt liên lc hin có vào mng
ca bn, và mt tp XML để cung cp cho ng dng danh b ca thiết b và
Trình cung cp Danh b thông tin chi tiết v ng dng ca bn.
</li>
</ul>
<p>
Đồng b hóa thường xuyên các mc dòng vi Trình cung cp Danh b ging như
các trường hp đồng b hoá khác. Để tìm hiu thêm v đồng b hoá, hãy xem phn
<a href="#SyncAdapters">Trình điu hp Đồng b Trình cung cp Danh bạ</a>. Vic đăng ký thông tin và
mi liên lc được đề cp trong hai phn tiếp theo.
</p>
<h4>Đăng ký để x lý các lượt xem mng xã hi</h4>
<p>
Để đăng ký để trình điu hp đồng b ca bn nhn thông báo khi người dùng xem mt liên lc do
trình điu hp đồng b ca bn qun lý:
</p>
<ol>
<li>
To mt tp có tên <code>contacts.xml</code> trong thư mục <code>res/xml/</code>
ca d án ca bn. Nếu đã có tp này, bn có th b qua bước này.
</li>
<li>
Trong tp này, hãy thêm phn t
<code>&lt;ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"&gt;</code>.
Nếu phn t này đã tn ti, bn có th b qua bước này.
</li>
<li>
Để đăng ký mt dch v được thông báo khi người dùng m trang chi tiết ca mt liên lc trong
ng dng danh b ca thiết bị, hãy thêm thuc tính
<code>viewContactNotifyService="<em>serviceclass</em>"</code> vào phn tử, trong đó
<code><em>serviceclass</em></code> là tên lp được đáp ng đầy đủ ca dch v
mà s nhn ý định t ng dng danh b ca thiết bị. Đối vi dch v
trình thông báo, hãy s dng mt lp m rng {@link android.app.IntentService}, để cho phép dch v
nhn các ý định. D liu trong ý định đến cha URI ni dung ca liên lc
thô mà người dùng đã nhp vào. T dch v trình thông báo, bn có th gn kết vi ri gi trình điu hp đồng b
ca bn để cp nht d liu cho liên lc thô.
</li>
</ol>
<p>
Để đăng ký mt hot động s được gi khi người dùng nhp vào mt mc dòng hay nh hoc c hai:
</p>
<ol>
<li>
To mt tp có tên <code>contacts.xml</code> trong thư mục <code>res/xml/</code>
ca d án ca bn. Nếu đã có tp này, bn có th b qua bước này.
</li>
<li>
Trong tp này, hãy thêm phn t
<code>&lt;ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"&gt;</code>.
Nếu phn t này đã tn ti, bn có th b qua bước này.
</li>
<li>
Để đăng ký mt trong các hot động ca bn s x lý khi người dùng nhp vào mt mc dòng trong
ng dng danh b ca thiết bị, hãy thêm thuc tính
<code>viewStreamItemActivity="<em>activityclass</em>"</code> vào phn t đó, trong đó
<code><em>activityclass</em></code> là tên lp được xác định đầy đủ ca hot động
mà s nhn ý định t ng dng danh b ca thiết bị.
</li>
<li>
Để đăng ký mt trong các hot động ca bn s x lý khi người dùng nhp vào mt nh lung trong
ng dng danh b ca thiết bị, hãy thêm thuc tính
<code>viewStreamItemPhotoActivity="<em>activityclass</em>"</code> vào phn t đó, trong đó
<code><em>activityclass</em></code> là tên lp được xác định đầy đủ ca hot động
mà s nhn ý định t ng dng danh b ca thiết bị.
</li>
</ol>
<p>
Phn t <code>&lt;ContactsAccountType&gt;</code> được mô t chi tiết hơn trong mc
phn t <a href="#SocialStreamAcctType">&lt;ContactsAccountType&gt;</a>.
</p>
<p>
Ý định đến cha URI ni dung ca mc hoc nh mà người dùng đã nhp vào.
Để có các hot động riêng cho các mc văn bn và nh, hãy s dng c hai thuc tính trong cùng tp.
</p>
<h4>Tương tác vi dch v mng xã hi ca bn</h4>
<p>
Người dùng không phi ri ng dng danh b ca thiết b để mi mt liên lc ti trang mng xã hi
ca bn. Thay vào đó, bn có th thiết đặt để ng dng danh b ca thiết b gi mt ý định để mi
liên lc đó ti mt trong các hot động ca mình. Để thiết đặt điu này:
</p>
<ol>
<li>
To mt tp có tên <code>contacts.xml</code> trong thư mục <code>res/xml/</code>
ca d án ca bn. Nếu đã có tp này, bn có th b qua bước này.
</li>
<li>
Trong tp này, hãy thêm phn t
<code>&lt;ContactsAccountType xmlns:android="http://schemas.android.com/apk/res/android"&gt;</code>.
Nếu phn t này đã tn ti, bn có th b qua bước này.
</li>
<li>
Thêm các thuc tính sau:
<ul>
<li><code>inviteContactActivity="<em>activityclass</em>"</code></li>
<li>
<code>inviteContactActionLabel="&#64;string/<em>invite_action_label</em>"</code>
</li>
</ul>
Giá tr <code><em>activityclass</em></code> là tên lp được xác định đầy đủ ca hot động
mà s nhn được ý định. Giá tr <code><em>invite_action_label</em></code>
là mt xâu văn bn được hin th trong menu <strong>Thêm Kết ni</strong> trong ng dng danh b
ca thiết bị.
</li>
</ol>
<p class="note">
<strong>Lưu ý:</strong> <code>ContactsSource</code> là mt tên tag không được chp nhn đối vi
<code>ContactsAccountType</code>.
</p>
<h3 id="ContactsFile">Tham chiếu contacts.xml</h3>
<p>
Tp <code>contacts.xml</code> cha các phn t XML có chc năng kim soát tương tác gia
trình điu hp đồng b và ng dng ca bn vi ng dng danh b và Trình cung cp Danh bạ. Nhng
phn t này được mô t trong các mc sau.
</p>
<h4 id="SocialStreamAcctType">Thành phn &lt;ContactsAccountType&gt;</h4>
<p>
Phn t <code>&lt;ContactsAccountType&gt;</code> kim soát tương tác gia
ng dng ca bn vi ng dng danh bạ. Nó có nhng cú pháp sau:
</p>
<pre>
&lt;ContactsAccountType
xmlns:android="http://schemas.android.com/apk/res/android"
inviteContactActivity="<em>activity_name</em>"
inviteContactActionLabel="<em>invite_command_text</em>"
viewContactNotifyService="<em>view_notify_service</em>"
viewGroupActivity="<em>group_view_activity</em>"
viewGroupActionLabel="<em>group_action_text</em>"
viewStreamItemActivity="<em>viewstream_activity_name</em>"
viewStreamItemPhotoActivity="<em>viewphotostream_activity_name</em>"&gt;
</pre>
<p>
<strong>cha trong:</strong>
</p>
<p>
<code>res/xml/contacts.xml</code>
</p>
<p>
<strong>có th cha:</strong>
</p>
<p>
<strong><code>&lt;ContactsDataKind&gt;</code></strong>
</p>
<p>
<strong>Mô tả:</strong>
</p>
<p>
Khai báo các thành phn Android và nhãn UI mà cho phép người dùng mi mt trong các liên lc ca mình đến
mt mng xã hi, thông báo người dùng khi mt trong các lung mng xã hi ca h được cp nht,
v.v.
</p>
<p>
Để ý rng tin t thuc tính <code>android:</code> không nht thiết áp dng cho các thuc tính
ca <code>&lt;ContactsAccountType&gt;</code>.
</p>
<p>
<strong>Thuc tính:</strong>
</p>
<dl>
<dt>{@code inviteContactActivity}</dt>
<dd>
Tên lp được xác định đầy đủ ca hot động trong ng dng ca bn mà bn mun
kích hot khi người dùng chn <strong>Thêm kết ni</strong> t ng dng danh b
ca thiết bị.
</dd>
<dt>{@code inviteContactActionLabel}</dt>
<dd>
Mt xâu văn bn được hin th cho hot động được quy định trong
{@code inviteContactActivity}, trong menu <strong>Thêm kết ni</strong>.
Ví dụ, bn có th s dng xâu "Follow in my network". Bn có th s dng mã định danh
tài nguyên xâu cho nhãn này.
</dd>
<dt>{@code viewContactNotifyService}</dt>
<dd>
Tên lp được xác định đầy đủ ca mt dch v trong ng dng ca bn mà s nhn được
thông báo khi người dùng xem mt liên lc. Thông báo này được gi t ng dng danh b
ca thiết bị; nó cho phép ng dng ca bn tm hoãn các thao tác dùng nhiu d liu ti
khi cn. Ví dụ, ng dng ca bn có th hi đáp li thông báo này
bng cách đọc và hin th nh độ phân gii cao ca danh b và các mc dòng mng xã hi
gn đây nht. Tính năng này được mô t chi tiết hơn trong phn
<a href="#SocialStreamInteraction">Tương tác vi lung xã hi</a>. Bn có th thy mt
ví d v dch v thông báo trong tp <code>NotifierService.java</code> trong ng dng mu
<a href="{@docRoot}resources/samples/SampleSyncAdapter/index.html">SampleSyncAdapter</a>
.
</dd>
<dt>{@code viewGroupActivity}</dt>
<dd>
Tên lp được xác định đầy đủ ca mt hot động trong ng dng ca bn mà có th
hin th thông tin nhóm. Khi người dùng nhp vào nhãn nhóm trong ng dng danh b
ca thiết bị, UI cho hot động này s được hin thị.
</dd>
<dt>{@code viewGroupActionLabel}</dt>
<dd>
Nhãn mà ng dng danh b hin th cho mt điu khin UI có cho phép
người dùng xem các nhóm trong ng dng ca bn.
<p>
Ví dụ, nếu bn cài đặt ng dng Google+ trên thiết b ca mình và bn đồng b
Google+ vi ng dng danh bạ, bn s thy các vòng tròn Google+ được lit kê thành các nhóm
trong tab <strong>Nhóm</strong> ca ng dng danh b ca bn. Nếu bn nhp vào mt vòng tròn
Google+, bn s thy nhng người trong vòng tròn đó được lit kê thành mt "nhóm". Phía bên trên ca
hin thị, bn s thy mt biu tượng Google+; nếu bn nhp vào đó, điu khin s chuyn sang ng dng
Google+. ng dng danh b làm điu này bng
{@code viewGroupActivity}, bng cách s dng biu tượng Google+ làm giá tr ca
{@code viewGroupActionLabel}.
</p>
<p>
Mt mã định danh tài nguyên xâu được cho phép cho thuc tính này.
</p>
</dd>
<dt>{@code viewStreamItemActivity}</dt>
<dd>
Tên lp được xác định đầy đủ ca mt hot động trong ng dng ca bn mà
ng dng danh b ca thiết b khi chy khi người dùng nhp vào mt mc dòng đối vi mt liên lc thô.
</dd>
<dt>{@code viewStreamItemPhotoActivity}</dt>
<dd>
Tên lp được xác định đầy đủ ca mt hot động trong ng dng ca bn mà
ng dng danh b ca thiết b khi chy khi người dùng nhp vào mt nh trong mc dòng
đối vi mt liên lc thô.
</dd>
</dl>
<h4 id="SocialStreamDataKind">Phn t &lt;ContactsDataKind&gt;</h4>
<p>
Phn t <code>&lt;ContactsDataKind&gt;</code> kim soát vic hin th các hàng
d liu tùy chnh ca ng dng ca bn trong UI ca ng dng danh bạ. Nó có nhng cú pháp sau:
</p>
<pre>
&lt;ContactsDataKind
android:mimeType="<em>MIMEtype</em>"
android:icon="<em>icon_resources</em>"
android:summaryColumn="<em>column_name</em>"
android:detailColumn="<em>column_name</em>"&gt;
</pre>
<p>
<strong>cha trong:</strong>
</p>
<code>&lt;ContactsAccountType&gt;</code>
<p>
<strong>Mô tả:</strong>
</p>
<p>
S dng phn t này để ng dng danh b hin th các ni dung trong mt hàng d liu tùy chnh như
mt phn chi tiết ca mt liên lc thô. Mi phn t con <code>&lt;ContactsDataKind&gt;</code>
ca <code>&lt;ContactsAccountType&gt;</code> đại din cho mt kiu hàng d liu tùy chnh mà trình điu hp
đồng b ca bn thêm vào bng {@link android.provider.ContactsContract.Data}. Thêm mt phn t
<code>&lt;ContactsDataKind&gt;</code> cho mi kiu MIME tùy chnh mà bn s dng. Bn không phi
thêm phn t nếu có mt hàng d liu tùy chnh mà bn không mun hin th d liu.
</p>
<p>
<strong>Thuc tính:</strong>
</p>
<dl>
<dt>{@code android:mimeType}</dt>
<dd>
Kiu MIME tùy chnh mà bn đã định nghĩa cho mt trong các kiu hàng d liu tùy chnh ca bn trong bng
{@link android.provider.ContactsContract.Data}. Ví dụ, giá tr
<code>vnd.android.cursor.item/vnd.example.locationstatus</code> có th là mt kiu
MIME tùy chnh cho mt hàng d liu có chc năng ghi li v trí được biết đến cui cùng ca mt liên lc.
</dd>
<dt>{@code android:icon}</dt>
<dd>
Mt tài nguyên
<a href="{@docRoot}guide/topics/resources/drawable-resource.html">có th v ca Android</a>
mà ng dng danh b hin th bên cnh d liu ca bn. S dng nó để th hin vi
người dùng rng d liu xut phát t dch v ca bn.
</dd>
<dt>{@code android:summaryColumn}</dt>
<dd>
Tên ct ca giá tr th nht trong hai giá tr được truy xut t hàng d liu. Giá tr
được hin th là dòng th nht ca mc nhp cho hàng d liu này. Dòng th nht có
mc đích s dng làm bn tóm tt d liu, nhưng điu đó là tùy chn. Xem thêm
<a href="#detailColumn">android:detailColumn</a>.
</dd>
<dt>{@code android:detailColumn}</dt>
<dd>
Tên ct ca giá tr th hai trong hai giá tr được truy xut t hàng d liu. Giá tr
được hin th là dòng th hai ca mc nhp cho hàng d liu này. Xem thêm
{@code android:summaryColumn}.
</dd>
</dl>
<h2 id="AdditionalFeatures">Các Tính năng B sung ca Trình cung cp Danh bạ</h2>
<p>
Bên cnh các tính năng chính được mô t trong các phn trước, Trình cung cp Danh b còn cung cp
nhng tính năng hu ích sau khi làm vic vi d liu danh bạ:
</p>
<ul>
<li>Nhóm liên lc</li>
<li>Tính năng nh</li>
</ul>
<h3 id="Groups">Nhóm liên lc</h3>
<p>
Trình cung cp Danh b có th tùy chn đánh nhãn các bộ sưu tp liên lc có liên quan bng d liu
<strong>nhóm</strong>. Nếu máy ch liên kết vi mt tài khon người dùng
mun duy trì nhóm, trình điu hp đồng b cho loi tài khon ca tài khon đó s chuyn
d liu nhóm gia Trình cung cp Danh b và máy chủ. Khi người dùng thêm mt liên lc mi vào
máy chủ, trình điu hp đồng b phi thêm nhóm mi
vào bng {@link android.provider.ContactsContract.Groups}. Nhóm hoc các nhóm mà mt liên lc
thô thuc v được lưu gi trong bng {@link android.provider.ContactsContract.Data}, bng cách s dng
kiu MIME {@link android.provider.ContactsContract.CommonDataKinds.GroupMembership}.
</p>
<p>
Nếu bn đang thiết kế mt trình điu hp đồng b mà s thêm d liu liên lc thô t
máy ch ti Trình cung cp Danh bạ, và bn không s dng các nhóm, khi đó bn cn báo cho
Trình cung cp làm các d liu ca bn thy được. Trong đon mã được thc hin khi mt người dùng thêm mt tài khon
vào thiết bị, hãy cp nht hàng {@link android.provider.ContactsContract.Settings}
mà Trình cung cp Danh b thêm cho tài khon. Trong hàng này, đặt giá tr ca ct
{@link android.provider.ContactsContract.SettingsColumns#UNGROUPED_VISIBLE
Settings.UNGROUPED_VISIBLE} thành 1. Khi bn làm vy, Trình cung cp Danh b s luôn
làm cho d liu danh b ca bn thy được, ngay c khi bn không s dng nhóm.
</p>
<h3 id="Photos">Ảnh liên lc</h3>
<p>
Bng {@link android.provider.ContactsContract.Data} lưu gi nh thành hàng vi kiu MIME
{@link android.provider.ContactsContract.CommonDataKinds.Photo#CONTENT_ITEM_TYPE
Photo.CONTENT_ITEM_TYPE}. Ct
{@link android.provider.ContactsContract.RawContactsColumns#CONTACT_ID} của hàng được liên kết với cột
{@code android.provider.BaseColumns#_ID} của liên lạc thô mà nó thuộc về.
Lp {@link android.provider.ContactsContract.Contacts.Photo} định nghĩa mt bng con ca
{@link android.provider.ContactsContract.Contacts} cha thông tin nh v nh chính
ca mt liên lc, đây là nh chính ca liên lc thô chính ca liên lc. Tương tự,
lp {@link android.provider.ContactsContract.RawContacts.DisplayPhoto} định nghĩa mt bng con
ca {@link android.provider.ContactsContract.RawContacts} cha thông tin nh đối vi nh chính
ca mt liên lc thô.
</p>
<p>
Tài liu tham kho cho {@link android.provider.ContactsContract.Contacts.Photo} và
{@link android.provider.ContactsContract.RawContacts.DisplayPhoto} có các ví d v
vic truy xut thông tin nh. Không có lp thun tin cho vic truy xut hình thu nh
chính đối vi mt liên lc thô, nhưng bn có th gi mt truy vn ti bng
{@link android.provider.ContactsContract.Data}, chn
{@code android.provider.BaseColumns#_ID} của liên lạc thô,
{@link android.provider.ContactsContract.CommonDataKinds.Photo#CONTENT_ITEM_TYPE
Photo.CONTENT_ITEM_TYPE}, và ct {@link android.provider.ContactsContract.Data#IS_PRIMARY}
để tìm hàng nh chính ca liên lc thô.
</p>
<p>
D liu t lung xã hi đối vi mt người cũng có th bao gm nh. Nhng nh này được lưu gi trong bng
{@code android.provider.ContactsContract.StreamItemPhotos}, được mô t chi tiết hơn
trong phn <a href="#StreamPhotos">Ảnh t lung xã hi</a>.
</p>