日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

访问其他程序中的数据(ContentResolver的CRUD操作)

發(fā)布時間:2025/4/5 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 访问其他程序中的数据(ContentResolver的CRUD操作) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

內(nèi)容提供器的用法一般有兩種:

1.使用現(xiàn)有的內(nèi)容提供器來讀取和操作相應(yīng)程序中的數(shù)據(jù)

2.創(chuàng)建自己的內(nèi)容提供器給我們程序的數(shù)據(jù)提供外部訪問接口。

如果一個應(yīng)用程序通過內(nèi)容提供器對其數(shù)據(jù)提供了外部訪問接口,那么任何其他的應(yīng)用程序既可以對這部分?jǐn)?shù)據(jù)進(jìn)行訪問。Android系統(tǒng)中自帶的電話薄、短信、媒體庫等程序都提供了類似的訪問接口,這就使得第三方應(yīng)用程序可以充分地利用這部分?jǐn)?shù)據(jù)來實(shí)現(xiàn)更好的功能。

?

ContentResolver的基本用法

對于每一個應(yīng)用程序來說,如果想要訪問內(nèi)容提供器中共享的數(shù)據(jù),就一定要借助ContentResolver類,可以通過Context中的getContentResolver()方法獲取到該類的實(shí)例。ContentResolver中提供了一系列的方法用于對數(shù)據(jù)進(jìn)行CRUD操作,其中insert()方法用于添加數(shù)據(jù),update()方法用于更新數(shù)據(jù),delete()方法用于刪除數(shù)據(jù),query()方法用于查詢數(shù)據(jù)。這和SQLiteDatabase中的CRUD操作還是有點(diǎn)區(qū)別的。

不同于SQLiteDatabase,ContentResolver中的增刪改查方法都是不接收表名參數(shù)的,而是使用一個Uri參數(shù)代替,這個參數(shù)被稱為內(nèi)容URI。內(nèi)容URI給內(nèi)容提供器中的數(shù)據(jù)建立了唯一標(biāo)識符,它主要由兩部分組成:authority和path。

authority:用于對不同的應(yīng)用程序做區(qū)分的,一般為了避免沖突,都會采用程序包名的方式來進(jìn)行命名。比如某個程序的包名com.example.app,那么該程序?qū)?yīng)的authority就可以命名為com.example.app.provider。

path:用于對同一應(yīng)用程序中不同的表做區(qū)分的,通常都會添加到authority的后面。比如某個程序的數(shù)據(jù)庫里存在兩張表table1和table2,這時就可以將path分別命名為/table1和/table2,然后把a(bǔ)uthority和path進(jìn)行組合,內(nèi)容URI就變成了com.example.app.provider/table1和com.example.app.provider/table2。

不過,目前還很難辨別出這兩個字符串就是兩個內(nèi)容URI,我們還需要在字符串的頭部加上協(xié)議聲明。因此,內(nèi)容URI最標(biāo)準(zhǔn)的格式寫法如下:

協(xié)議名://包名.provider/表名

例:

content://com.example.app.provider/table1

content://com.example.app.provider/table2

有沒有發(fā)現(xiàn),內(nèi)容URI可以非常清楚地表達(dá)出我們想要訪問哪個程序中的哪張表里的數(shù)據(jù)。也正因此,ContentResolver中的增刪改查方法才都接收Uri對象作為參數(shù),因?yàn)槿绻褂帽砻脑?#xff0c;系統(tǒng)將無法得知我們期望訪問的是哪個應(yīng)用程序里的表。

在得到了URI字符串之后,我們還需要將它解析成Uri對象才可以作為傳入。

解析方法:

Uri uri=Uri.pare("content://com.example.app.provider/table1");

只需要調(diào)用Uri.parse()方法,就可以將內(nèi)容URI字符串解析成Uri對象了。

現(xiàn)在我們就可以使用這個Uri對象來查詢table1表中的數(shù)據(jù)了,代碼如下所示:

Cursor cursor=getContentResolver().query(uri,projection,selection,selectionArgs,sortOrder);

uri:指定查詢某個應(yīng)用程序下的某一張表

projection:指定查詢的列名(select column1,column2)

selection:指定where的約束條件(where column = value)

selectionArgs:為where中的占位符提供具體的值

sortOrder:指定查詢結(jié)果的排序方式(order by column1,column2)

查詢完成后返回的仍然是一個Cursor對象,這時我們就可以將數(shù)據(jù)從Cursor對象中逐個讀取出來了。讀取的思路仍然是通過移動游標(biāo)的位置來遍歷Cursor的所有行,然后再取出每一行中相應(yīng)列的數(shù)據(jù),代碼如下所示:

if(cursor != null){while(cursor.moveToNext()){String column1=cursor.getString(cursor.getColumnIndext("column1"));int column2=cursor.getInt(cursor.getColumnIndext("column2"));}cursor.close();}

掌握了最難的查詢操作,剩下的增刪改操作就比較容易了。

增加數(shù)據(jù):

ContentValues cv=new ContentValues();cv.put("column1","text);cv.put("column2",1);getContentResolver().insert(uri,cv);

?

更新數(shù)據(jù):

ContentValues cv=new ContentValues();cv.put("column1","");getContentResolver().update(uri,cv,"column1 = ? and column2 = ?",new String[]{"text","1"});

注意上述代碼使用了selection和selectionArgs參數(shù)來對想要更新的數(shù)據(jù)進(jìn)行約束,以防止所有的行都會受影響。

?

刪除數(shù)據(jù):

getContentResolver().delete(uri,"column2 = ?",new String[] {"1"});

這句話的意思是將column2列中,值為1的這一行數(shù)據(jù)給刪除。

總結(jié)

以上是生活随笔為你收集整理的访问其他程序中的数据(ContentResolver的CRUD操作)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。