日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

安卓学习 之 ContentResolver内容提供者(七)

發(fā)布時間:2024/2/28 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 安卓学习 之 ContentResolver内容提供者(七) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

簡介

Android持久化技術一章中所保存的數(shù)據(jù)都只能在當前應用程序中訪問,但跨程序數(shù)據(jù)共享是由Content Provider提供的,譬如說:電話薄、短信、媒體庫中的信息。

一、基本用法

  • 構建內(nèi)容URI對象,com.example.app是包名,table是表名,將內(nèi)容URI字符串解析成URI對象.
  • Uri uri = Uri.parse("content://com.example.app.provider/table1")
  • 利用如下的方法進行查詢,查詢完之后為cursor對象.
  • Cursor cursor = getContentResolver().query( uri, projection, selection, selectionArgs, sortOrder); query()方法參數(shù)對應SQL 部分描述
    urifrom table_name指定查詢某個應用程序下的某一張表
    projectionselect column1, column2指定查詢的列名
    selectionwhere column = value指定 where 的約束條件
    selectionArgs-為 where 中的占位符提供具體的值
    orderByorder by column1, column2指定查詢結果的排序方式
  • 利用如下代碼將cursor對象的值一條條讀出來。
  • if (cursor != null) {while (cursor.moveToNext()) {String column1 = cursor.getString(cursor.getColumnIndex("column1")); int column2 = cursor.getInt(cursor.getColumnIndex("column2"));}cursor.close(); }
  • 增刪改(本質(zhì)一樣,就是用法稍微有點區(qū)別)
  • //添加一條("text",1)的數(shù)據(jù) ContentValues values = new ContentValues(); values.put("column1", "text"); values.put("column2", 1); getContentResolver().insert(uri, values);//將("text",1)數(shù)據(jù)的第一列設置為 ContentValues values = new ContentValues(); values.put("column1", ""); getContentResolver().update(uri, values, "column1 = ? and column2 = ?", new String[] {"text", "1"});//將第二列為1的數(shù)據(jù)刪除 getContentResolver().delete(uri, "column2 = ?", new String[] { "1" });

    應用(讀取系統(tǒng)聯(lián)系人)

    private void readContacts() { Cursor cursor = null;try {// 查詢聯(lián)系人數(shù)據(jù)cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);while (cursor.moveToNext()) {// 獲取聯(lián)系人姓名String displayName = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));// 獲取聯(lián)系人手機號String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));contactsList.add(displayName + "\n" + number);}} catch (Exception e) { e.printStackTrace();} finally {if (cursor != null) { cursor.close();} }

    然后設置ArrayAdapter把數(shù)據(jù)渲染到ListView中,這里就不展示了。

    二、創(chuàng)建內(nèi)容提供者

    1.新建類繼承自ContentProvider類,該類中有6個抽象方法,復寫六個方法。

    • OnCreate():初始化內(nèi)容提供器、完成數(shù)據(jù)庫創(chuàng)建和升級等,存在Content Resolver時調(diào)用;
    • query():在內(nèi)容提供器中查詢數(shù)據(jù),使用uri參數(shù)來確定是那張表,每個參數(shù)代表不同意思;
    • insert()項內(nèi)容提供器添加一條數(shù)據(jù),根據(jù)uri和values來完成添加;
    • update()更新數(shù)據(jù);
    • delete()刪除數(shù)據(jù);
    • getType()根據(jù)傳入URI來返回相應的MIME類型。

    URI具體可以這樣寫:

  • *:表示匹配任意長度的任意字符
  • #:表示匹配任意長度的數(shù)字
  • 2.借助URIMatcher來實現(xiàn)匹配內(nèi)容URI的功能,而且URIMatcher提供了一個addURI方法,并將authority、path和自定義代碼傳入。

    static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR); uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM); uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM); uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM); }

    3.復寫query方法,利用UriMathcer的match()方法對傳入URI進行匹配,得到相應的數(shù)據(jù)。UriMathcer的match()的輸出是2步的自定義代碼,代表的是表中的哪一列。

    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {switch (uriMatcher.match(uri)) { case TABLE1_DIR:// 查詢table1表中的所有數(shù)據(jù)break;case TABLE1_ITEM:// 查詢table1表中的單條數(shù)據(jù)break;case TABLE2_DIR:// 查詢table2表中的所有數(shù)據(jù)break;case TABLE2_ITEM:// 查詢table2表中的單條數(shù)據(jù)break; default:break;} }

    4.getType()方法用于獲取Uri對象所對應的MIME類型。它是所有的內(nèi)容提供器都必須提供的一個方法,用于獲取 Uri 對象所對應的 MIME 類型。MIME格式如下:

  • 必須以 vnd 開頭。
  • 如果內(nèi)容 URI 以路徑結尾,則后接 android.cursor.dir/,如果內(nèi)容 URI 以 id 結尾, 則后接 android.cursor.item/。
  • 最后接上 vnd..。
  • #對于content://com.example.app.provider/table1 vnd.android.cursor.dir/vnd.com.example.app.provider.table1#對于 content://com.example.app.provider/table1/1 vnd.android.cursor.item/vnd. com.example.app.provider.table1

    應用(創(chuàng)建Book和Category的內(nèi)容提供者)

    public class DatabaseProvider extends ContentProvider {public static final int BOOK_DIR = 0;public static final int BOOK_ITEM = 1;public static final int CATEGORY_DIR = 2;public static final int CATEGORY_ITEM = 3;public static final String AUTHORITY = "com.example.databasetest.provider";private static UriMatcher uriMatcher;private MyDatabaseHelper dbHelper;static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(AUTHORITY, "book", BOOK_DIR);uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM);uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR);uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM);}@Overridepublic boolean onCreate() {dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {// 查詢數(shù)據(jù)SQLiteDatabase db = dbHelper.getReadableDatabase();Cursor cursor = null;switch (uriMatcher.match(uri)) {case BOOK_DIR:cursor = db.query("Book", projection, selection, selectionArgs, null, null, sortOrder);break;case BOOK_ITEM:String bookId = uri.getPathSegments().get(1);cursor = db.query("Book", projection, "id = ?", new String[] { bookId }, null, null, sortOrder);break;case CATEGORY_DIR:cursor = db.query("Category", projection, selection, selectionArgs, null, null, sortOrder);break;case CATEGORY_ITEM:String categoryId = uri.getPathSegments().get(1);cursor = db.query("Category", projection, "id = ?", new String[] { categoryId }, null, null, sortOrder);break;default:break;}return cursor;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// 添加數(shù)據(jù)SQLiteDatabase db = dbHelper.getWritableDatabase();Uri uriReturn = null;switch (uriMatcher.match(uri)) {case BOOK_DIR:case BOOK_ITEM:long newBookId = db.insert("Book", null, values);uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);break;case CATEGORY_DIR:case CATEGORY_ITEM:long newCategoryId = db.insert("Category", null, values);uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);break;default:break;}return uriReturn;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {// 更新數(shù)據(jù)SQLiteDatabase db = dbHelper.getWritableDatabase();int updatedRows = 0;switch (uriMatcher.match(uri)) {case BOOK_DIR:updatedRows = db.update("Book", values, selection, selectionArgs);break;case BOOK_ITEM:String bookId = uri.getPathSegments().get(1);updatedRows = db.update("Book", values, "id = ?", new String[] { bookId });break;case CATEGORY_DIR:updatedRows = db.update("Category", values, selection, selectionArgs);break;case CATEGORY_ITEM:String categoryId = uri.getPathSegments().get(1);updatedRows = db.update("Category", values, "id = ?", new String[] { categoryId });break;default:break;}return updatedRows;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// 刪除數(shù)據(jù)SQLiteDatabase db = dbHelper.getWritableDatabase();int deletedRows = 0;switch (uriMatcher.match(uri)) {case BOOK_DIR:deletedRows = db.delete("Book", selection, selectionArgs);break;case BOOK_ITEM:String bookId = uri.getPathSegments().get(1);deletedRows = db.delete("Book", "id = ?", new String[] { bookId });break;case CATEGORY_DIR:deletedRows = db.delete("Category", selection, selectionArgs);break;case CATEGORY_ITEM:String categoryId = uri.getPathSegments().get(1);deletedRows = db.delete("Category", "id = ?", new String[] { categoryId });break;default:break;}return deletedRows;}@Overridepublic String getType(Uri uri) {switch (uriMatcher.match(uri)) {case BOOK_DIR:return "vnd.android.cursor.dir/vnd.com.example.databasetest. provider.book";case BOOK_ITEM:return "vnd.android.cursor.item/vnd.com.example.databasetest. provider.book";case CATEGORY_DIR:return "vnd.android.cursor.dir/vnd.com.example.databasetest. provider.category";case CATEGORY_ITEM:return "vnd.android.cursor.item/vnd.com.example.databasetest. provider.category";}return null;}}

    總結

    以上是生活随笔為你收集整理的安卓学习 之 ContentResolver内容提供者(七)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 超碰xxx | 亚洲国产一区二区三区在线观看 | 黄色男人的天堂 | 永久免费的网站入口 | 亚洲综合色婷婷 | 久久精品视频一区 | 国产suv精品一区二区四 | 少妇日皮视频 | 亚洲最大av | 欧美日韩激情一区 | 久久偷看各类女兵18女厕嘘嘘 | 国产91免费看 | 欧美综合色 | 日韩国产精品一区 | 日韩精品乱码久久久久久 | 国产一级在线免费观看 | youjizz欧美| 欧美无极品 | 九九热只有精品 | 天天天天色 | 91国产一区 | 国产免费不卡视频 | 国产国语亲子伦亲子 | 中文字幕乱码人妻二区三区 | 亚洲天堂中文字幕在线观看 | 看特级黄色片 | 精品在线91 | 午夜在线免费观看视频 | av在线播放地址 | 美女扒开腿让男生桶 | 99精品99 | 奇米888一区二区三区 | 午夜嘿嘿嘿 | 亚洲中文字幕一区二区在线观看 | 欧美人xxxx | 欧美性白人极品1819hd | 妖精视频在线观看免费 | 国产66页 | 在线欧美a| 我会温柔一点的日剧 | 韩日精品在线 | 好色先生tv官网 | 欧美做爰猛烈床戏大尺度 | 男女无遮挡免费视频 | 欧美一级特黄视频 | 国产www | 日本特级黄色大片 | 天码人妻一区二区三区在线看 | 精品人伦一区二区三区 | 国产欧美日韩久久 | 女人高潮娇喘1分47秒 | 波多野av在线 | 日韩成人精品一区二区三区 | 丰满人妻翻云覆雨呻吟视频 | www.av777| 福利一二三区 | 青青青在线免费观看 | 在线看av的网址 | 日本少妇b| ass东方小嫩模pics | 日韩一区二区毛片 | 精品视频在线免费观看 | 精品人妻互换一区二区三区 | 久久久久久久久久影视 | 97蜜桃网| 动漫一区二区三区 | 成年人视频在线播放 | ww久久| 91网站在线看 | 亚洲网站免费观看 | 樱桃视频一区二区三区 | 日韩网站视频 | 亚洲色偷偷综合亚洲av伊人 | 亚洲xx站| 亚洲另类春色 | 俺也去在线视频 | 日本久久视频 | 日韩黄色片在线观看 | 日本美女啪啪 | 日韩精品一区在线视频 | 国内自拍第二页 | 欧美三级免费观看 | 免费中文字幕在线观看 | 亚洲国产电影在线观看 | 日韩欧美中出 | 卡通动漫av | 中文黄色片 | 国产真实老熟女无套内射 | 嫩草嫩草嫩草嫩草嫩草 | 黄色小视频链接 | 操操av| 欧美日韩国产综合网 | 国产二区三区视频 | 亚洲精品一区二区三区影院忠贞 | 麻豆小视频 | 黑人毛片网站 | 不卡中文字幕在线观看 | 欧美一区免费观看 | av大片免费在线观看 |