ContentProvider与ContentResolver

2023-10-27

在这里插入图片描述

1.理解ContentProvider与ContentResolver,看下面这个图就行了
这里写图片描述
2.ContentProvider可以直接理解为一个public的servlet类,里面
封装了一些public 的函数,这个函数可以操作数据库,文件,具体怎么操作,由这些函数去执行,这个类呢,无论在哪都能被使用,所以无论ContentProvider只要写了,配置了,那么ContentResolver就能调用这些函数,就像这些函数是写在自己的应用程序中一样。
3.ContentProvider就是服务器的一个真正操作数据的管家,ContentResolver就相当于客户端的你,想干嘛,对URi说就行了。
4.这次写的是主要大概框架,看懂这个,再去看看别的人说的细节,很容易理解。看下面实验:运行一下就更清楚了文件结构如下,先运行ContentProvider,部署到手机上,然后在运行ContentResolver

这里写图片描述

ContentProvider

/**
 *
 */
package org.crazyit.content;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.util.Log;

/**
 * Description:
 * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a>
 * <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
 * <br/>This program is protected by copyright laws.
 * <br/>Program Name:
 * <br/>Date:
 * @author  Yeeku.H.Lee kongyeeku@163.com
 * @version  1.0
 */
public class FirstProvider extends ContentProvider
{
	// 第一次创建该ContentProvider时调用该方法
	@Override
	public boolean onCreate()
	{
		System.out.println("===onCreate方法被调用===");
		Log.v("aa", "onCreate方法被调用");
		return true;
	}

	// 该方法的返回值代表了该ContentProvider所提供数据的MIME类型
	@Override
	public String getType(Uri uri)
	{
		System.out.println("~~getType方法被调用~~");
		Log.v("aa", "getType方法被调用");
		return null;
	}

	// 实现查询方法,该方法应该返回查询得到的Cursor
	@Override
	public Cursor query(Uri uri, String[] projection, String where,
		String[] whereArgs, String sortOrder)
	{
		System.out.println(uri + "===query方法被调用===");
		System.out.println("where参数为:" + where);
		Log.v("aa", "===query方法被调用===");
		return null;
	}

	// 实现插入的方法,该方法应该新插入的记录的Uri
	@Override
	public Uri insert(Uri uri, ContentValues values)
	{
		System.out.println(uri + "===insert方法被调用===");
		System.out.println("values参数为:" + values);
		Log.v("aa", "===insert方法被调用===");
		return null;
	}

	// 实现删除方法,该方法应该返回被删除的记录条数
	@Override
	public int delete(Uri uri, String where, String[] whereArgs)
	{
		System.out.println(uri + "===delete方法被调用===");
		System.out.println("where参数为:" + where);
		Log.v("aa", "===delete方法被调用====");
		return 0;
	}

	// 实现删除方法,该方法应该返回被更新的记录条数
	@Override
	public int update(Uri uri, ContentValues values, String where,
		String[] whereArgs)
	{
		System.out.println(uri + "===update方法被调用===");
		System.out.println("where参数为:"
			+ where + ",values参数为:" + values);
		Log.v("aa", "==update方法被调用====");
		return 0;
	}
}

这里需要配置一下

<?xml version="1.0" encoding="utf-8"?>









ContentResolver**重点内容**

package org.crazyit.resolver;

import org.crazyit.resolver.R;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

/**

  • Description:


  • site: crazyit.org


  • Copyright ©, 2001-2014, Yeeku.H.Lee


  • This program is protected by copyright laws.


  • Program Name:


  • Date:

  • @author Yeeku.H.Lee kongyeeku@163.com

  • @version 1.0
    */
    public class FirstResolver extends Activity
    {
    ContentResolver contentResolver;
    Uri uri = Uri.parse(“content://org.crazyit.providers.firstprovider/”);

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    // 获取系统的ContentResolver对象
    contentResolver = getContentResolver();
    }

    public void query(View source)
    {
    // 调用ContentResolver的query()方法。
    // 实际返回的是该Uri对应的ContentProvider的query()的返回值
    Cursor c = contentResolver.query(uri, null
    , “query_where”, null, null);
    Toast.makeText(this, “远程ContentProvide返回的Cursor为:” + c,
    Toast.LENGTH_LONG).show();
    }

    public void insert(View source)
    {
    ContentValues values = new ContentValues();
    values.put(“name”, “fkjava”);
    // 调用ContentResolver的insert()方法。
    // 实际返回的是该Uri对应的ContentProvider的insert()的返回值
    Uri newUri = contentResolver.insert(uri, values);
    Toast.makeText(this, “远程ContentProvide新插入记录的Uri为:”
    + newUri, Toast.LENGTH_LONG).show();
    }

    public void update(View source)
    {
    ContentValues values = new ContentValues();
    values.put(“name”, “fkjava”);
    // 调用ContentResolver的update()方法。
    // 实际返回的是该Uri对应的ContentProvider的update()的返回值
    int count = contentResolver.update(uri, values
    , “update_where”, null);
    Toast.makeText(this, “远程ContentProvide更新记录数为:”
    + count, Toast.LENGTH_LONG).show();
    }

    public void delete(View source)
    {
    // 调用ContentResolver的delete()方法。
    // 实际返回的是该Uri对应的ContentProvider的delete()的返回值
    int count = contentResolver.delete(uri
    , “delete_where”, null);
    Toast.makeText(this, “远程ContentProvide删除记录数为:”
    + count, Toast.LENGTH_LONG).show();
    }
    }


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical"
	android:layout_width="match_parent"
	android:layout_height="match_parent">
	<Button
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:onClick="query"
		android:text="查询" />
	<Button
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:onClick="insert"
		android:text="插入" />
	<Button
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:onClick="update"
		android:text="更新" />
	<Button
		android:layout_width="match_parent"
		android:layout_height="wrap_content"
		android:onClick="delete"
		android:text="删除" />
</LinearLayout>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ContentProvider与ContentResolver 的相关文章

随机推荐

  • 内核态do_gettimeofday()、用户态gettimeofday()获取指令执行时间

    背景 芯片开发阶段 有个硬件有个配置一直无法生效 后面发现是软件写入使能还未能生效 硬件就开始配置了 导致不成功 加个延时就可解决 只是知道应该在纳秒级别 但具体十位还是百位级别 不太清楚了 所以就让我搞个代码测试下 写入一次寄存器需要的时
  • 瞎写

    1 小时候爱情就是一切 长大了 爱情变成可有可无的东西 就如同饭菜 有它 饭更香 没有它 饭还是饭 饿了也得吃下去 2 我想滚蛋 在这儿真的是学无所学 我都想自己开始创业 真的对不起老板给的这份工资 整天无所事事 3 不是合适不合适的问题
  • C语言图书馆管理系统

    C语言图书馆管理系统 全部代码如下 include
  • 异步Windows Socket包装,包括TCP与UDP,可处理粘包

    头文件 struct IPAddress union struct IPV4Address ULONG host USHORT port address UINT64 64 static IPAddress Zero ULONG GetHo
  • SteamVr、VRTK配置

    版本 SteamVr 1 2 3 VRTK 3 3 0 Unity 2019 4 28f1c1 VRTK配置 新建空对象 命名为SDKManager 添加VRTK SDK Manager 脚本 作用 管理各种VRSDk 在SDKManage
  • Android高德地图marker自定义弹框窗口

    最终效果 1 gradle里添加高德地图依赖 implementation com amap api map2d latest integration 2d地图功能 implementation com amap api location
  • 前端基础篇之 CSS 世界

    前端基础篇之 CSS 世界 基本概念 这些基本概念有些可能不易理解但却都很重要 如果看完还是很不理解的话需要自己谷歌或百度 网上关于这些概念的文章不少 流 流 又叫文档流 是 css 的一种基本定位和布局机制 流是 html 的一种抽象概念
  • 【pandas】to_datetime函数简单使用

    该函数将给定参数args转换为日期格式 需要传入参数format指定args的格式 注意format中年用Y表示 月和天用小写的m和d表示 pd to datetime 20220517 format Y m d gt gt gt Time
  • sweetalert2中ajax用法,SweetAlert2 使用教程

    SweetAlert2是一款功能强大的纯Js模态消息对话框插件 SweetAlert2用于替代浏览器默认的弹出对话框 它提供各种参数和方法 支持嵌入图片 背景 HTML标签等 并提供5种内置的情景类 功能非常强大 SweetAlert2是S
  • ChatGPT 全面解析

    ChatGPT问世 12月1日 美国人工智能公司OpenAI在网页上推出自然语言处理领域 NLP 的模型ChatGPT 它能够通过对话方式进行交互 并根据用户输入的自然语言文本内容 自动生成新的文本内容 一周内 ChatGPT的用户已突破1
  • 写每个程序员的第一个代码--Hello World程序

    1 首先创建一个文本文档 并输入以下代码 public class HelloWorld public static void main String args System out println Hello World 2 然后对程序重
  • 五子棋游戏(Java编写)双人对赛

    目录 1 游戏准则 2 游戏细节 代码如下 运行结果 bug测试 棋子重复 棋子越界 1 游戏准则 黑子白子依次下棋 不能重复 也不能越界 若违规 则重新下棋 判断输赢 判断各方向是否五个棋子连在一起 若有则胜 若无 则败 2 游戏细节 白
  • Docker 进行 apt 等操作时无法连接源

    Docker 进行 apt 等操作时无法连接源 重启 Docker 参考文章 sudo service docker restart or sudo etc init d docker restart
  • 【网络安全】一段小笑话学习 加密算法+盐

    催生这篇文章的一个原因是一位讲了半天听不懂原理还不虚心学习的群友 小笑话 群友 为啥两个一样的密码一个可以登录一个不可以 群友 不同用户名 群友 A账号 B密码 C账号 B密码 居然a能登陆c提示密码错误 群友 没有改东西 想必大部分人肯定
  • Python110道常见面试题

    干货 110 道 Python 面试笔试题超强汇总 这几天好多留言问有没有Python面试题 今天统一给大家分享一遍 希望能帮助此时仍在找工作的同学 尽快找到工作 希望对基本知识不熟悉的同学 能认真做一遍 肯定会有不少收获 1 一行代码实现
  • DB2时间戳查看

    1 打开日志 确定错误是那个数据库操作造成 2 查看bnd文件的时间戳信息 db2bfd b Card bnd grep Timestamp 显示时间戳 Timestamp tA5MPfMZ 2009 12 31 15 12 56 45 3
  • linux服务器下手动删除memcache中的key对应的value

    假设服务器ip是 10 0 0 1 端口是 1234 首先连上服务器 telnet 10 0 0 1 1234 查看某个key对应的值 假设key的名称为 type get type 获取值 delete type 删除
  • Anaconda下pip离线安装Pytorch(亲测可用)

    win10 Anaconda3 python3 7 CUDA10 进入pytorch官网https pytorch org 根据自己情况选择安装 注意 我并没有在Anaconda Prompt下直接输入Run this Comman的内容
  • 2023年十大最佳自动化测试工具

    Best Automation Testing Tools for 2023 对更快交付高质量软件 或 快速质量 的需求要求组织以敏捷 持续集成 CI 和DevOps方法论来寻找解决方案 测试自动化是这些方面的重要组成部分 最新的 2018
  • ContentProvider与ContentResolver

    1 理解ContentProvider与ContentResolver 看下面这个图就行了 2 ContentProvider可以直接理解为一个public的servlet类 里面 封装了一些public 的函数 这个函数可以操作数据库 文