数据库里面使用ContentProvider

ContentProvider数据库共享之——实例讲解 前言:现在这段时间没这么忙了,要抓紧时间把要总结的知识沉淀下来,今年重新分了项目组,在新项目中应该不会那么忙了,看来有时间来学一些自己的东西了。现在而言,我需要的是时间。只要不断的努力,总有一天,你会与从不同。加油。 相关文章:1、《ContentProvider数据库共享之——概述》2、《ContentProvider数据库共享之——实例讲解》3、《ContentProvider数据库共... 阅读详情
原文地址:http://www.cnblogs.com/WangWeiDa/archive/2011/09/13/2174532.html

一、ContentProvider的概念
  ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
  1、ContentProvider使用表的形式来组织数据
   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
  2、ContentProvider提供的方法
   query:查询
   insert:插入
   update:更新
   delete:删除
   getType:得到数据类型
   onCreate:创建数据时调用的回调函数
  3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中
  二、ContentProvider的内部原理
  自定义一个ContentProvider,来实现内部原理
  步骤:
  1、定义一个CONTENT_URI常量(里面的字符串必须是唯一)
  Public static final Uri CONTENT_URI = Uri.parse("content://com.WangWeiDa.MyContentprovider");
  如果有子表,URI为:
  Public static final Uri CONTENT_URI = Uri.parse("content://com.WangWeiDa.MyContentProvider/users");
  2、定义一个类,继承ContentProvider
  Public class MyContentProvider extends ContentProvider
  3、实现ContentProvider的所有方法(query、insert、update、delete、getType、onCreate)
  package com.WangWeiDa.cp;
  
  import java.util.HashMap;
  
  import com.WangWeiDa.cp.MyContentProviderMetaData.UserTableMetaData;
  import com.WangWeiDa.data.DatabaseHelp;
  
  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.database.sqlite.SQLiteQueryBuilder;
  import android.net.Uri;
  import android.text.TextUtils;
  
  public class MyContentProvider extends ContentProvider {
   //访问表的所有列
   public static final int INCOMING_USER_COLLECTION = 1;
   //访问单独的列
   public static final int INCOMING_USER_SINGLE = 2;
   //操作URI的类
   public static final UriMatcher uriMatcher;
   //为UriMatcher添加自定义的URI
   static{
   uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
   uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user",
   INCOMING_USER_COLLECTION);
   uriMatcher.addURI(MyContentProviderMetaData.AUTHORITIES,"/user/#",
   INCOMING_USER_SINGLE);
  
   }
   private DatabaseHelp dh;
   //为数据库表字段起别名
   public static HashMap userProjectionMap;
   static
   {
   userProjectionMap = new HashMap();
   userProjectionMap.put(UserTableMetaData._ID,UserTableMetaData._ID);
   userProjectionMap.put(UserTableMetaData.USER_NAME, UserTableMetaData.USER_NAME);
   }
   /**
   * 删除表数据
   */
   @Override
   public int delete(Uri uri, String selection, String[] selectionArgs) {
   System.out.println("delete");
   //得到一个可写的数据库
   SQLiteDatabase db = dh.getWritableDatabase();
   //执行删除,得到删除的行数
   int count = db.delete(UserTableMetaData.TABLE_NAME, selection, selectionArgs);
   return count;
   }
   /**
   * 数据库访问类型
   */
   @Override
   public String getType(Uri uri) {
   System.out.println("getType");
   //根据用户请求,得到数据类型
   switch (uriMatcher.match(uri)) {
   case INCOMING_USER_COLLECTION:
   return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE;
   case INCOMING_USER_SINGLE:
   return MyContentProviderMetaData.UserTableMetaData.CONTENT_TYPE_ITEM;
   default:
   throw new IllegalArgumentException("UnKnown URI"+uri);
   }
   }
   /**
   * 插入数据
   */
   @Override
   public Uri insert(Uri uri, ContentValues values) {
   //得到一个可写的数据库
   SQLiteDatabase db = dh.getWritableDatabase();
   //向指定的表插入数据,得到返回的Id
   long rowId = db.insert(UserTableMetaData.TABLE_NAME, null, values);
   if(rowId > 0){//判断插入是否执行成功
   //如果添加成功,利用新添加的Id和
   Uri insertedUserUri = ContentUris.withAppendedId(UserTableMetaData.CONTENT_URI, rowId);
   //通知监听器,数据已经改变
   getContext().getContentResolver().notifyChange(insertedUserUri, null);
   return insertedUserUri;
   }
   return uri;
   }
   /**
   * 创建ContentProvider时调用的回调函数
   */
   @Override
   public boolean onCreate() {
   System.out.println("onCreate");
   //得到数据库帮助类
   dh = new DatabaseHelp(getContext(),MyContentProviderMetaData.DATABASE_NAME);
   return false;
   }
   /**
   * 查询数据库
   */
   @Override
   public Cursor query(Uri uri, String[] projection, String selection,
   String[] selectionArgs, String sortOrder) {
   //创建一个执行查询的Sqlite
   SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
   //判断用户请求,查询所有还是单个
   switch(uriMatcher.match(uri)){
   case INCOMING_USER_COLLECTION:
   //设置要查询的表名
   qb.setTables(UserTableMetaData.TABLE_NAME);
   //设置表字段的别名
   qb.setProjectionMap(userProjectionMap);
   break;
   case INCOMING_USER_SINGLE:
   qb.setTables(UserTableMetaData.TABLE_NAME);
   qb.setProjectionMap(userProjectionMap);
   //追加条件,getPathSegments()得到用户请求的Uri地址截取的数组,get(1)得到去掉地址中/以后的第二个元素
   qb.appendWhere(UserTableMetaData._ID + "=" + uri.getPathSegments().get(1));
   break;
   }
   //设置排序
   String orderBy;
   if(TextUtils.isEmpty(sortOrder)){
   orderBy = UserTableMetaData.DEFAULT_SORT_ORDER;
   }
   else{
   orderBy = sortOrder;
   }
   //得到一个可读的数据库
   SQLiteDatabase db = dh.getReadableDatabase();
   //执行查询,把输入传入
   Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
   //设置监听
   c.setNotificationUri(getContext().getContentResolver(), uri);
   return c;
  
   }
   /**
   * 更新数据库
   */
   @Override
   public int update(Uri uri, ContentValues values, String selection,
   String[] selectionArgs) {
   System.out.println("update");
   //得到一个可写的数据库
   SQLiteDatabase db = dh.getWritableDatabase();
   //执行更新语句,得到更新的条数
   int count = db.update(UserTableMetaData.TABLE_NAME, values, selection, selectionArgs);
   return count;
   }
  
  }
  
  4、在AndroidMinifest.xml中进行声明

   android:name=".cp.MyContentProvider"

   android:authorities="com.WangWeiDa.cp.MyContentProvider"
   />
  **为ContentProvider提供一个常量类MyContentProviderMetaData.java
  package com.WangWeiDa.cp;
  
  import android.net.Uri;
  import android.provider.BaseColumns;
  
  public class MyContentProviderMetaData {
   //URI的指定,此处的字符串必须和声明的authorities一致
   public static final String AUTHORITIES = "com.wangweida.cp.MyContentProvider";
   //数据库名称
   public static final String DATABASE_NAME = "myContentProvider.db";
   //数据库的版本
   public static final int DATABASE_VERSION = 1;
   //表名
   public static final String USERS_TABLE_NAME = "user";
  
   public static final class UserTableMetaData implements BaseColumns{
   //表名
   public static final String TABLE_NAME = "user";
   //访问该ContentProvider的URI
   public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/user");
   //该ContentProvider所返回的数据类型的定义
   public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.myprovider.user";
   public static final String CONTENT_TYPE_ITEM = "vnd.android.cursor.item/vnd.myprovider.user";
   //列名
   public static final String USER_NAME = "name";
   //默认的排序方法
   public static final String DEFAULT_SORT_ORDER = "_id desc";
   }
  
  }

基于ContentProvider的Android数据库操作实战 要创建一个可用的,必须继承抽象类并重写其五个抽象方法。尽管该类提供了默认实现,但只有显式重写才能真正响应外部请求。系统在启动时会根据中注册的信息实例化 Provider,并调用其生命周期相关方法。良好的命名习惯能显著提升代码可读性和维护效率。建议采用大写加下划线的形式命名匹配码,并体现其对应的数据语义。匹配码常量含义示例 URIUSERS所有用户记录USER_BY_ID指定ID的用户SETTINGS应用设置项特定设置项。 阅读详情

相关推荐

Virbox Protector:全方位守护 Android 应用安全

在数字化浪潮中,Android 应用面临着诸多安全挑战,如破解、篡改、盗版、数据窃取和钓鱼欺诈等。为了应对这些复杂的安全问题,Virbox Protector 应运而生,为 Android 应用提供高强度的专业化安全保护,支持对 APK 和 AAB 文件的加固保护,并兼容 Google Play,助力应用顺利出海。

VBP_2025的博客 997

Android ContentProvider的介绍

 一、ContentProvider的概念  ContentProvider:为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider  1、ContentProvider使用表的形式来组织数据   无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格  2、ContentP...

weixin_30251829的博客 200

Proteus+汇编+8086电子时钟实战:从框架搭建到中断驱动的核心实现

本文详细介绍了使用Proteus仿真软件和8086汇编语言实现电子时钟的完整过程。从程序框架搭建、内存分段模型理解,到核心的8259中断控制器配置与编程,再到中断服务程序编写和数码管动态扫描显示驱动,系统阐述了底层软硬件协同开发的核心原理与实战步骤。该项目是深入理解计算机中断机制和汇编语言编程的绝佳实践。

weixin_29189381的博客 413

Android-ContentProvider数据库操作

在实际的开发过程中,Android提供了5种方式存储数据:    1.文件存储数据     2.使用 Sharedpreferences 存储数据     3.SQLite数据库存储数据     4.使用ContentProvider存储数据     5.网络存储数据 首先我们先简单了解下文件、SharedPreferred如何进行数据存储 1.文件存储操作    

u011202334的专栏 1310

CTF-MISC:BUUCTF练习汇总(1-25题,不包括签到题)

解题思路:该题比较基础,wireshark打开过滤HTTP流量包,追踪HTTP流后可以看到base64密文,解密后得到jpg图片,打开图片即可看到flag,在线OCR识别即可提取出flag值。解题思路:zip压缩包解压需要密码,图片中的盲文为解压的密码,解压后得到MP3音频文件,内容为典型的摩斯密码;解题思路:由题目可以为LSB隐写,使用StegSolve打开图片查看最低有效位得到PNG信息,另存为图片后发现是二维码,扫描后即可得到flag。对应摩斯电码为:-.-. - …-. .-- .–. . …

燕麦葡萄干的博客 1万+

ROS Noetic + Realsense ROS 2.3.2 在鲁班猫4上的完整工作空间搭建与相机启动调试

本文详细介绍了在鲁班猫4(RK3588S)开发板上搭建ROS Noetic与Realsense ROS 2.3.2开发环境的完整流程,包括Realsense SDK安装、工作空间配置、D435i深度相机驱动调试等关键步骤,为机器人视觉系统开发提供实用指南。

weixin_33217202的博客 237

ContentProvider

一、什么是ContentProvider?       ContentProvider是一个抽象类,可以理解为一个特殊的存储数据的类型,它提供了一套标准的接口来获取和操作数据。可以把数据封装到ContentProvider 中,从而是这些数据可以被其他的应用程序所共享。搭建起了所有应用程序之间数据交换的桥梁! 二、ContentProvider的创建过程 1.创建一个类继承Content

刘永祥的专栏 1046

墨刀原型设计工具操作使用指南及实践操作

该指南通过异常场景处理、像素级参数说明、复杂交互示例,覆盖了墨刀操作的全细节,适合从新手到资深用户的进阶学习。结合 PlantUML 思维导图的层级化展示,可快速定位具体功能的操作要点与问题解决方法,真正实现 “照指南即可操作” 的实用价值。

hy行者勇哥的博客 4951

ContentProvider介绍

1. 什么是ContentProvider android系统中数据都是私有的,通过ContentProvider进行程序间数据的交换.一个Content Provider类实现了一组标准的方法接口,从而能够让其他的应用保存货读取此Content Provider的各种数据类型. 也就是说,一个程序可以通过实现一个Content Provider的抽象接口将自己的数据暴露出去,外界可以通过Co

liwei405499的专栏 794

从SOMEIP看SOA,汽车电子电器架构的转变

从SOMEIP看SOA,汽车电子电器架构的转变

天赐好车的博客 242

基于阿里云物联网平台设计的实时图传系统_采用MQTT协议传输图像

当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。 在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,设备B负责接收设备A上传的数据然后解析显示出来。在阿里云服务器上需要配置云产品流转,让设备A的数据上传后自动发送给设备B。这样就完成了视频画面数据的流转。不过因为阿里云的最大数据限制,每次最大发送10240字节的数据。

1万+

【Android数据存储】ContentProvider详细介绍(附实例源码)

1.ContentProvider是什么?     ContentProvider——内容提供者。它是一个类,这个类主要是对Android系统中进行共享的数据进行包装,并提供了一组统一的访问接口供其他程序调用。这些被共享的数据,可以使系统自己的也可以使我们个人应用程序中的数据,ContentProvider使用表的形式来组织数据. 2.为什么要有ContentPro

毕小烦的学习笔记 6707

Playwright MCP:开启浏览器自动化的新篇章

在当今数字化时代,浏览器自动化技术在众多领域发挥着至关重要的作用,从简单的网页爬取到复杂的自动化测试,再到智能代理与网页的交互等场景,都离不开高效、可靠的浏览器自动化工具。而微软推出的项目,正是在这一领域的一次创新性探索,它为开发者带来了全新的视角和强大的功能支持。本文将深入探讨的概念、架构、代码示例、应用场景、注意事项以及未来发展方向,帮助读者全面了解这一前沿技术。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 5266

Android Debug Database跨应用数据共享:使用ContentProvider

在Android应用开发中,跨应用数据共享一直是开发者面临的一大挑战。传统的文件共享方式安全性低,而手动编写接口又耗时费力。Android Debug Database作为一款强大的数据库调试工具,不仅能帮助开发者查看和编辑SQLite数据库文件,还能通过ContentProvider实现安全高效的数据共享。本文将详细介绍如何利用Android Debug Database实现跨应用数据共享,解决...

gitblog_01197的博客 2047

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

contentProvider 和database 和sqllite

frameworks\base\core\java\android\database\sqlite\SQLiteOpenHelper.java 数据库的创建与版本更新管理辅助类,这个辅助类使得对ContentProvider控制更容易,这个辅助类创建的时候并不会创建数据库或者升级数据库,而只有在使用数据库的时候才会第一次创建数据库或者升级数据库,从而延迟数据库创建与升级,避免在应用启动的时候阻塞...

lei7143的专栏 475

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

android uri db,Android ContentProvider封装数据库和文件读写总结

本文是我各处东拼西凑加上自己实现一个ContentProvider的使用总结,留做后用,主要介绍ContentProvider的集成方法。一、综述ContentProvider是Android四大组件之一,其核心功能是提供应用间的统一的数据访问方式,当然也可以用于应用内的数据封装。ContentProvider类似C/S结构,应用A实现ContentProvider向外提供应用内的数据访问,应用B...

weixin_30413765的博客 391

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Room数据库结合ContentProvider的使用

在Android开发中,要使用数据存储时,第一想到的就是room数据库。

yangke5958的博客 1667

android 玩转ContentProvider之一--实现ContentProvider操作数据库

本人原创作品,谢绝转载! 作为android四大组件之一,今天总结一下它的用法。 ContentProvider官方有很多地方提到,其中一个是在API文档上(http://developer.android.com/guide/topics/providers/content-providers.html)面有介绍,有兴趣去看一下,虽然是英文的,对了解ContentProvider很有用;还有

jacpy的专栏 1万+

android sqlite provider,Android使用ContentProvider共享sqlite数据库

我们要做的是这么个东西保存用户基本信息到手机sd卡中的ssss.db sqlite数据库中,而数据库的读写是通过ContentProvider共享的1.先在自己电脑上新建名称为ssss.db的sqlite数据,里面新建表userinfo,列有int _id,textname,int age, float height_id为主键,设置为自动增长,2.数据新建完成后,把数据库导入android虚拟机...

weixin_35976825的博客 560

ContentProvider,Database生成工具

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34061042的博客 126

Android数据库 contentprovider

SQLite SQLite介绍:小型关系数据库,占用空间很小。 我们可以使用SQLiteOpenHelper类来创建数据库对象。这个类有以下方法: getReadableDatabase():获得一个可读的数据库。 getWritableDatabase():获得一个可写的数据库。 下面是三个回调函数: onCreate(SQLiteDatabase db):当创建数据库的时候会自动调

Coder_android 1153

ContentProvider的使用以及操作数据库

由于APP开发很少需要把自己的数据暴露出来,所以contentProvider不经常使用,下边就详细的记录一下怎么使用。 首先需要在自己的应用中重写SQLiteOpenHelper public class DBHelper extends SQLiteOpenHelper { // 数据库名 private static final String DATABASE_NAME = "finch.db"; // 表名 public static final Strin

GLOD_FISH的博客 1276

ContentProvider数据库共享之——概述

前言:项目终于结束了,终于有自己的时间了,感觉几个月没什么进展了,毕业的时间越长,反而觉得学到的知识越少。努力吧。 相关文章:1、《ContentProvider数据库共享之——概述》2、《ContentProvider数据库共享之——实例讲解》3、《ContentProvider数据库共享之——MIME类型与getType()》4、《ContentProvider数据库共享之——读写权限...

启舰 7767

实验六、contentprovider实验+SQLite数据库的实现

实验六、contentprovider实验+SQLite数据库的实现 【实验名称】实验六、contentprovider实验+SQLite数据库的实现 【实验目的】 1、掌握如何在Android 开发中使用 SQLite 数据库 2、熟悉设计数据库表结构的方法与步骤 3、理解contentprovider的使用方法及流程,理解ContentProvider、Resolver、Uri、Urimatcher等的原理。 【实验内容】 1、实现contentprovider和contentresolver通过uri

qq_45888242的博客 5256

Android实验:contentprovider 实验+SQLite 数据库的实现

contentprovider 实验+SQLite 数据库的实现

m0_72471315的博客 1862

ContentProvider和数据库的区别

大家好,今天我们来讲解ContentProvider和数据库的区别是他们之间的联系. 四大组件之一 1.ContentProvider是如何实现数据共享的? 1.在Android中,为了把自己程序的数据(一般是数据库)提供给其他应用程序,就通过ContentProvider提供的...

测试0901-1 580
上一篇: jpct-ae的相对坐标与世界坐标及一些相关的小问题
下一篇: SQLiteOpenHelper(创建或打开数据库)
itde1
博客等级 码龄16年 16粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值