九、内容提供者详解

内容提供者(ContentProvider) 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的 阅读详情

1. 使用ContentProvider(内容提供者)共享数据

ContentProvider 在android中的作用是对外共享数据,也就是说你可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider 对你应用中的数据进行添删改查。

关于数据共享,以前我们学习过文件操作模式,知道通过指定文件的操作模式为Context.MODE_WORLD_READABLE 或Context.MODE_WORLD_WRITEABLE同样也可以对外共享数据。那么,这里为何要使用ContentProvider对外共享数据呢?是这样的,如果采用文件操作模式对外共享数据,数据的访问方式会因数据存储的方式而不同,导致数据的访问方式无法统一,如:采用xml文件对外共享数据,需要进行xml解析才能读取数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读取数据。

使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

应用需要通过ContentProvider对外共享数据的步骤:

第一步需要继承ContentProvider并重写下面方法:

public class PersonContentProvider extends ContentProvider{
    public boolean onCreate()
    public Uri insert(Uri uri, ContentValues values)
    public int delete(Uri uri, String selection, String[] selectionArgs)
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
    public String getType(Uri uri)
}

第二步需要在AndroidManifest.xml使用对该ContentProvider进行配置,为了能让其他应用找到该ContentProvider , ContentProvider 采用了authorities(主机名/域名)对它进行唯一标识,你可以把 ContentProvider看作是一个网站(想想,网站也是提供数据者),authorities 就是他的域名:

<manifest .... >
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".PersonContentProvider" android:authorities="cn.lile.providers.personprovider"/>
    </application>
</manifest>

代码:

package cn.lile.db;

import cn.lile.service.DBOpenHelper;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

public class PersonContentProvider extends ContentProvider {
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int PERSONS = 1;
    private static final int PERSON = 2;
    private DBOpenHelper dbOpenHelper;
    static{
        matcher.addURI("cn.lile.providers.personprovider", "person", PERSONS);
        matcher.addURI("cn.lile.providers.personprovider", "person/#", PERSON);
    }

    @Override
    public boolean onCreate() {
        dbOpenHelper = new DBOpenHelper(this.getContext());
        return true;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        int num = 0 ; // 已经删除的记录数量
        switch (matcher.match(uri)) {
        case PERSONS:
            num = db.delete("person", selection, selectionArgs);
            break;          
        case PERSON:
            long id = ContentUris.parseId(uri);
            String where = "personid="+ id;
            if(selection!=null && !"".equals(selection)){ // personid=12 and name=?
                where = where + " and "+ selection;
            }
            num = db.delete("person", where, selectionArgs);
            break;
        default:
            throw new IllegalArgumentException("Unkown Uri:"+ uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);
        return num;
    }

    @Override
    public String getType(Uri uri) { // 返回当前操作的数据类型
        switch (matcher.match(uri)) {
        case PERSONS: // 操作的是集合类型数据
            return "vnd.android.cursor.dir/person";
        case PERSON:
            return "vnd.android.cursor.item/person";
        default:
            throw new IllegalArgumentException("Unkown Uri:"+ uri);
        }
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        long id = 0 ;
        switch (matcher.match(uri)) {
        case PERSONS:
            id = db.insert("person", "personid", values); // 得到记录的id
            getContext().getContentResolver().notifyChange(uri, null);
            return ContentUris.withAppendedId(uri, id); // 返回代表新增记录的Uri
        case PERSON:
            id = db.insert("person", "personid", values); // 得到记录的id
            String strUri = uri.toString();
            Uri personUri = Uri.parse(strUri.substring(0, strUri.lastIndexOf("/")));
            getContext().getContentResolver().notifyChange(personUri, null);
            return ContentUris.withAppendedId(personUri, id);
        default:
            throw new IllegalArgumentException("Unkown Uri:"+ uri);
        }
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
        switch (matcher.match(uri)) {
        case PERSONS:
            return db.query("person", projection, selection, selectionArgs, null, null, sortOrder);

        case PERSON:
            long id = ContentUris.parseId(uri);
            String where = "personid="+ id;
            if(selection!=null && !"".equals(selection)){ // personid=12 and name=?
                where = where + " and "+ selection;
            }
            return db.query("person", projection, where, selectionArgs, null, null, sortOrder);

        default:
            throw new IllegalArgumentException("Unkown Uri:"+ uri);
        }
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        int num = 0 ; // 已经修改的记录数量
        switch (matcher.match(uri)) {
        case PERSONS:
            num = db.update("person", values, selection, selectionArgs);
            break;          
        case PERSON:
            long id = ContentUris.parseId(uri);
            String where = "personid="+ id;
            if(selection!=null && !"".equals(selection)){ 
                where = where + " and "+ selection;
            }
            num = db.update("person", values, where, selectionArgs);
            break;
        default:
            throw new IllegalArgumentException("Unkown Uri:"+ uri);
        }
        getContext().getContentResolver().notifyChange(uri, null); // 通知数据发生变化
        return num;
    }

}

2. Uri介绍

Uri代表了要操作的数据,Uri主要包含了两部分信息:1> 需要操作的ContentProvider ,2> 对ContentProvider中的什么数据进行操作

一个Uri由以下几部分组成:

(1)ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://

(2)主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。

(3)路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

要操作person表中id为10的记录,可以构建这样的路径:/person/10
要操作person表中id为10的记录的name字段, person/10/name
要操作person表中的所有记录,可以构建这样的路径:/person
要操作xxx表中的记录,可以构建这样的路径:/xxx

(4)当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:

要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:

Uri uri = Uri.parse("content://cn.lile.provider.personprovider/person")

3. UriMatcher类使用介绍

因为Uri代表了要操作的数据,所以我们经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris 。掌握它们的使用,会便于我们的开发工作。

UriMatcher类用于匹配Uri,它的用法如下:

(1)首先第一步把你需要匹配Uri路径全部给注册上,如下:

// 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码
    UriMatcher sMatcher = new UriMatcher(UriMatcher.NO_MATCH);

// 如果match()方法匹配content://cn.lile.provider.personprovider/person路径,返回匹配码为1
sMatcher.addURI(“cn.lile.provider.personprovider”, “person”, 1); // 添加需要匹配uri,如果匹配就会返回匹配码

// 如果match()方法匹配content://cn.lile.provider.personprovider/person/230路径,返回匹配码为2
sMatcher.addURI(“cn.itcast.provider.personprovider”, “person/#”, 2); // #号为通配符

switch (sMatcher.match(Uri.parse("content://cn.lile.provider.personprovider/person/10"))) { 
    case 1
    break;
    case 2
    break;
    default://不匹配
    break;
}

(2)注册完需要匹配的Uri后,就可以使用sMatcher.match(uri)方法对输入的Uri进行匹配,如果匹配就返回匹配码,匹配码是调用addURI()方法传入的第三个参数,假设匹配content://cn.lile.provider.personprovider/person路径,返回的匹配码为1

4. 使用ContentProvider共享数据

ContentProvider类主要方法的作用:

(1)public boolean onCreate()

该方法在ContentProvider创建后就会被调用, Android开机后, ContentProvider在其它应用第一次访问它时才会被创建。

(2)public Uri insert(Uri uri, ContentValues values)

该方法用于供外部应用往ContentProvider添加数据。

(3)public int delete(Uri uri, String selection, String[] selectionArgs)

该方法用于供外部应用从ContentProvider删除数据。

(4)public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

该方法用于供外部应用更新ContentProvider中的数据。

(5)public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

该方法用于供外部应用从ContentProvider中获取数据。

(6)public String getType(Uri uri)

该方法用于返回当前Url所代表数据的MIME类型。如果操作的数据属于集合类型,那么MIME类型字符串应该以vnd.android.cursor.dir/开头,例如:要得到所有person记录的Uri为content://cn.lile.provider.personprovider/person,那么返回的MIME类型字符串应该为:“vnd.android.cursor.dir/person”。如果要操作的数据属于非集合类型数据,那么MIME类型字符串应该以vnd.android.cursor.item/开头,例如:得到id为10的person记录,Uri为content://cn.lile.provider.personprovider/person/10,那么返回的MIME类型字符串应该为:“vnd.android.cursor.item/person”。

5. 使用ContentResolver操作ContentProvider中的数据

当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成,要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver 类提供了与ContentProvider类相同签名的四个方法:

// 该方法用于往ContentProvider添加数据。
public Uri insert(Uri uri, ContentValues values)

// 该方法用于从ContentProvider删除数据。
public int delete(Uri uri, String selection, String[] selectionArgs)

// 该方法用于更新ContentProvider中的数据。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)

// 该方法用于从ContentProvider中获取数据。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)

这些方法的第一个参数为Uri,代表要操作的ContentProvider和对其中的什么数据进行操作,假设给定的是: Uri.parse(“content://cn.lile.providers.personprovider/person/10”),那么将会对主机名为cn.lile.providers.personprovider的ContentProvider进行操作,操作的数据为person表中id为10的记录。

使用ContentResolver对ContentProvider中的数据进行添加、删除、修改和查询操作:

ContentResolver resolver =  getContentResolver();
Uri uri = Uri.parse("content://cn.lile.provider.personprovider/person");

// 添加一条记录
ContentValues values = new ContentValues();
values.put("name", "itcast");
values.put("age", 25);
resolver.insert(uri, values);       

// 获取person表中所有记录
Cursor cursor = resolver.query(uri, null, null, null, "personid desc");
while(cursor.moveToNext()){
    Log.i("ContentTest", "personid="+ cursor.getInt(0)+ ",name="+ cursor.getString(1));
}

//把id为1的记录的name字段值更改新为liming
ContentValues updateValues = new ContentValues();
updateValues.put("name", "liming");
resolver.update(updateIdUri, updateValues, null, null);

6. 监听ContentProvider中数据的变化

如果ContentProvider的访问者需要知道ContentProvider中的数据发生变化,可以在ContentProvider发生数据变化时调用getContentResolver().notifyChange(uri, null)来通知注册在此URI上的访问者,例子如下:

public class PersonContentProvider extends ContentProvider {
    public Uri insert(Uri uri, ContentValues values) {
        db.insert("person", "personid", values);
        getContext().getContentResolver().notifyChange(uri, null);
    }
}

如果ContentProvider的访问者需要得到数据变化通知,必须使用ContentObserver对数据(数据采用uri描述)进行监听,当监听到数据变化通知时,系统就会调用ContentObserver的onChange()方法:

// true表示只要发出通知的Uri以方法第一个参数开头都能被监听到,否侧监听uri必须与发出通知的uri完全匹配才能被监听到
getContentResolver().registerContentObserver(Uri.parse("content://cn.lile.providers.personprovider/person"), true, new PersonObserver(new Handler()));

public class PersonObserver extends ContentObserver{
    public PersonObserver(Handler handler) {
        super(handler);
    }
    public void onChange(boolean selfChange) {
        // 此处可以进行相应的业务处理
    }
}

7. 读取联系人数据

public class ContactUtils {

    // 给调用者返回一个集合
    public static List<ContactInfo> getContacts(Context context) {

        List<ContactInfo> contactInfos = new ArrayList<ContactInfo>();

        // 1 查询raw_contacts 表 查询 contact_id 列
        // 定义 查询raw_contacts 表的 uri
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        // 拿到内容提供者的解析器
        ContentResolver resolver = context.getContentResolver();
        Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
                null, null, null);
        while (cursor.moveToNext()) {
            ContactInfo info = new ContactInfo();
            String id = cursor.getString(0);
            if (id != null) {
                System.out.println("raw_contact-id~~~~" + id);
                info.setId(id);

                // 2 根据这个id 去查询 data 表
                Uri datauri = Uri.parse("content://com.android.contacts/data"); // 定义
                                                                                // data表的uri
                // 查询实际上 是data表和 mimetype 表的视图 视图中 定义mimetype_id 叫 mimetype
                Cursor dataCursor = resolver.query(datauri, new String[] {"mimetype", "data1" }, "raw_contact_id=?", new String[] { id }, null);
                while (dataCursor.moveToNext()) {
                    String mimetype = dataCursor.getString(0); // 获取mimetype_id
                    String data = dataCursor.getString(1); // 获取data1 列的内容

                    // 3 根据 mimetype 类型 区分数据
                    if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {
                        // 说明是data 是email 数据
                        System.out.println("email~" + data);
                        info.setEmail(data);

                    } else if ("vnd.android.cursor.item/name".equals(mimetype)) {
                        System.out.println("name~" + data);
                        info.setName(data);

                    } else if ("vnd.android.cursor.item/phone_v2"
                            .equals(mimetype)) {
                        System.out.println("phone~" + data);
                        info.setPhone(data);
                    }

                }
                dataCursor.close();
                contactInfos.add(info);
            }
        }
        cursor.close();
        return contactInfos;
    }
}

8. 窃听用户发出的短信

用户使用系统自带的短信程序发送短信,程序会通过ContentProvider把短信保存进数据库,并且发出一个数据变化通知,使用ContentObserver对数据变化进行监听,在用户发送短信时,就会被ContentObserver窃听到短信:
注册监听:

getContentResolver().registerContentObserver(Uri.parse("content://sms"),  true, new SmsObserver(new Handler()));

监听类:

private final class SmsObserver extends ContentObserver{
    public SmsObserver(Handler handler) {
        super(handler);
    }

    public void onChange(boolean selfChange) { // 查询发送箱中的短信(处于正在发送状态的短信放在发送箱)
        Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"),null, null, null, null); 
        while(cursor.moveToNext()){
            StringBuilder sb = new StringBuilder();
            sb.append("_id=").append(cursor.getInt(cursor.getColumnIndex("_id")));
            sb.append(",address=").append(cursor.getString(cursor.getColumnIndex("address")));
            sb.append(";body=").append(cursor.getString(cursor.getColumnIndex("body")));
            sb.append(";time=").append(cursor.getLong(cursor.getColumnIndex("date")));
            Log.i("ReceiveSendSMS", sb.toString());
        } 
    }       
}
Android之内容提供者(ContentProvider) 内容提供者(ContentProvider)是Android四大组件之一,用于在不同应用之间共享数据。内容提供者通过统一资源标识符(URI)来标识数据,并使用一套标准的接口来访问和操作数据。它是Android系统中实现跨应用数据共享的主要方式。 阅读详情

相关推荐

彻底解决Win11 Android模拟器驱动权限问题:手动修改silent_install.bat的保姆级教程

本文提供了一份详细的Win11 Android模拟器驱动权限问题解决方案,重点介绍了手动修改silent_install.bat脚本的两种方法。通过分析问题根源并给出具体代码修改方案,帮助开发者彻底解决Android Studio在Windows 11上安装时遇到的UAC循环弹窗问题,确保android-emulator-hypervisor-driver顺利安装。

dengliugong3918的博客 461

Android中跨程序共享数据-ContentProvider

Android中跨程序共享数据-ContentProvider 之前介绍的持久化技术保存的数据只能在当前应用程序中访问,虽然也提供了操作模式如MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE,但由于安全性问题被弃用。现在Android官方更推荐使用ContentProvider技术。 8.1 ContentProvider简介 ContentProvider主要用于不同应用程序之间实现数据共享功能。它提供了一套完整的机制,允许一个程序访问另一个程序的数据,且能保证安全性。不同

m0_56348460的博客 7318

维护测试监控LLM应用

LangFuse: 开源 + SaaS(免费/付费),LangSmith 平替,可集成 LangChain 也可直接对接 OpenAI API;LangSmith: LangChain 的官方平台,SaaS 服务(免费/付费),非开源,企业版支持私有部署;调试 Prompt 的 Playground测试/验证系统的相关指标数据集管理各种指标监控与统计:访问量、响应时长、Token 费等等。

SunnyRivers 1782

Android 开发 - 数据共享(数据共享、内容提供者实现、动态权限申请)

Android 开发 - 数据共享(数据共享、内容提供者实现、动态权限申请)

weixin_52173250的博客 1116

tcmalloc(高并发内存池)简化版讲解-项目

高清发不上去,私我发高清,项目完整代码@我。

2201_75352618的博客 910

最新版电子发票样式html+css--普通发票+增值发票

【代码】最新版电子发票样式html+css--普通发票+增值发票。

weixin_44110923的博客 3684

【Android】安卓四大组件之内容提供者

【Android】安卓四大组件之内容提供者 1、关于内容提供者 1.1 什么是内容提供者 内容提供者就是contentProvider,作用有如下: 给多个应用提供数据 类似一个接口 可以和多个应用分享数据 1.2 为什么要有内容提供者 作为一个APP,自己的数据会在某些条件下提供给其他APP,但是,APP的数据是私有的。 例如,APP A的数据库内容是不可以被APP B进行读取的 这个时候,我们就需要一个内容提供者,将APP A中的数据信息提供给APP B。 1.3 使用场景 就贴近生活一些吧,拿某宝

woodwhale的博客 8950

基于大模型的肾结石诊疗全流程风险预测与方案制定研究报告

目录一、引言1.1 研究背景与意义1.2 国内外研究现状1.3 研究目标与内容二、大模型技术原理与应用概述2.1 大模型的基本原理2.2 大模型在医疗领域的应用进展2.3 适用于肾结石预测的大模型选择与依据三、术前风险预测与准备3.1 患者身体状况评估3.2 结石情况分析3.3 术前准备方案制定四、术中风险预测与应对4.1 出血风险预测与处理4.2 脏器损伤风险预测与预防4.3 实时监测与决策支持五、术后恢复预测与护理5.1 恢复时间预测5.2 护理要点与措施5.3 并发症预防与处理六、并发症风险预测与管理

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1148

Android 第5讲:内容提供者ContentProvider

Android内容提供者

weixin_47323733的博客 2939

C++动态规划详解

动态规划思想 一、动态规划概念: 动态规划(dp)是研究多步决策过程最优化问题的一种数学方法。在动态规划中,为了寻找一个问题的最优解(即最优决策过程),将整个问题划分成若干个相应的阶段,并在每个阶段都根据先前所作出的决策作出当前阶段最优决策,进而得出整个问题的最优解。即记住已知问题的答案,在已知的答案的基础上解决未知的问题。 在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后

weixin_51951103的博客 2万+

SAP S/4 FICO科目辅助余额表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

SAP S/4 FICO科目辅助余额表开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

我好像病了的博客 329

内容提供者

Android工程搭建一.ContentProvider介绍:二.原理图三.一系列权限四.动态获取权限五.自定义内容提供者自定义内容提供者思路创建提供者代码内容索要方代码 一.ContentProvider介绍: 1.ContentProvider内容提供者(四大组件之一)主要用于在不同的应用程序之间实现数据共享的功能。 2.技能get点: (1)访问系统自带的内容提供者(******) 手机联系...

XinHao_Sir的博客 1595

YOLOv8自定义训练:车牌识别全流程(从标注到推理,附可视化代码)

车牌检测全流程实践指南 摘要:本文详细介绍了基于YOLOv8的车牌检测完整实现方案。针对车牌检测中的三大难点(小目标、多角度、光照变化),提供了从数据准备到模型部署的全流程解决方案。重点包括:1)数据采集与标注规范;2)针对小目标的YOLOv8模型优化配置;3)K-means锚框聚类方法;4)训练参数调优策略。通过实际验证,该方法可获得95%以上的检测准确率,并附有完整的代码实现和可视化工具,便于开发者快速复现应用。 (字数:149字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 851

Android内容提供者

是 Android 调试桥(ADB)中用于直接调用内容提供者(Content Provider)定义的方法的命令。在不确定有哪些特殊字符时,可以使用单引号将整个值括起来,这样可以避免大部分特殊字符的干扰。在不确定哪些特殊字符会出现的情况下,可以通过将值用双引号括起来,并对常见特殊字符(如反斜杠。:将值进行URL编码或Base64编码处理,传递时无需担心特殊字符的影响。:例如,使用正则表达式或脚本扫描并转义可能会引发问题的字符。指定的 URI 找到对应的内容提供者。参数指定的方法,并传递。

酌沧 2070

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android - 内容提供者

内容提供者组件根据请求将数据从一个应用程序提供给其他应用程序。 此类请求由 ContentResolver 类的方法处理。 内容提供者可以使用不同的方式来存储其数据,并且数据可以存储在数据库、文件甚至网络上。内容提供者有时需要跨应用程序共享数据。 这就是内容提供者变得非常有用的地方。内容提供商让您可以将内容集中在一个地方,...

小屁孩大帅-保密的博客 1078

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

android之内容提供者解析

该系统有两个应用,比较繁琐。但是内容提供者是android里非常非常重要的一个内容,我们得好好学习下哦。先看效果图,我们提供了四个按钮,点击按钮便会进行相应的操作。我们先看内容提供者所在的应用,代码结构:activity代码:package cn.com.contentProvider; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; public class Con

梦中一夜下江南 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

内容提供者的使用

#内容提供者 #01_为什么需要内容提供者 内容提供者:提供了统一的访问数据库的方式,可以让其他应用程序来调用。 #02_编写内容提供者 步骤: 1、在工程中添加一个内容提供者的类,继承了ContentProvider类型,实现了增删改查的方法; 2、在清单文件中配置一个provider节点,指定authorities(相当于网站的域名,用来唯一标示一个内容提供者)、exported为true(...

wdx_1136346879的博客 1394

Android中的内容提供者

安卓中的内容提供者ContentProvider,案例:读取手机通信录

. 1330

18、内容提供者

Android - 内容提供者(Content Provider) 什么是内容提供者? 首先我们必须要明白的是ContentProvider(内容提供者)是android中的四大组件之一,但是在一般的开发中,可能使用比较少。ContentProvider为不同的软件之间数据共享,提供统一的接口。而且ContentProvider是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI

weixin_45808711的博客 1151

Android——内容提供者

Android 基础中最重要的就四大组件,四大组件是Android学习的开始。 activity ——算作Android界面 service——服务 Broadcast Receiver——广播 Content Provider——内容提供者 这四大组件开始对我来说内容提供者是最难理解的,但是慢慢接触之后感觉也不是很难。相对于基础来说吧。 这两天我又看了这一章的

weixin_36545772的博客 4366

内容提供者总结

内容提供者 应用的数据库是不允许其他应用访问的 内容提供者的作用:把私有数据暴露给其他应用,通常,是把私有数据库的数据暴露给其他应用 内容提供者的作用就是让别的应用访问到你的数据库,相当于一个应用的接口,用来被其他应用来访问,内容提供者可以访问本应用的所有的数据,内容提供者对外只提供本应用可以暴露的数据。 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数

开源创新 819

android内容提供者优点,Android 内容提供者简介

在Android应用中,我们可以使用显式意图(Explicit Intent)来直接访问其他应用的Activity,但是这仅限于Activity的范畴;如果需要使用其他应用的数据,还需要用到另外一种组件,这就是所谓的内容提供者(Content Provider)。1、内容提供者(Content Porviders)简介内容提供者主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制...

weixin_32516271的博客 534

Android开发学习(内容提供者)

安卓学习(内容提供者)

m0_55686284的博客 1407

android 内容提供者

android中的四大组件之一----内容提供者 用于不同app之间的数据共享,比如我在A应用程序中有个数据库,而应用B需要用到这个数据库的某个表信息,我们就可以在A应用中用ContentProvider来提供这个表的查询接口,这样也就做到了app之间的数据共享,还能让用户自定义接口提高安全性,避免了进程间调用,权限和开发成本问题。 先来复习一下Uri Uri 通用资源标志符,Web上可用的每种资源 -HTML文档、图像、视频片段、程序等可由一个Uri进行定位 构由以下几个部分组成 scheme、autho

Eliza白的博客 1550
上一篇: 八、服务详解
下一篇: 十、多媒体编程
CoderLiLe
博客等级 码龄11年 2粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值