数据库里面使用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应用设置项特定设置项。 阅读详情

相关推荐

基于PID算法的循迹小车

这一期为创客们带来基于PID算法的循迹小车制作 1.标准赛道示意图: (该赛道包含了:左直角、右直角、十字路口等路况) 2.灰度传感器安装示意图: (可根据实际情况调节各传感器之间的间距) 3.硬件原理图: 4.控制逻辑: 5.程序如下: #define leftA_PIN 7 #define leftB_PIN 6 #define left_Pwm_PIN 5 #define STBY...

qq_44343584的博客 4万+

Android ContentProvider的介绍

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

weixin_30251829的博客 200

Signoff Criteria --- ocv/aocv/pocv之AOCV介绍

Advanced on chip variation,相比较于OCV来说,对于悲观度的去除很有效。相比较与ocv对于整个design中的lauch/capture path设置统一的derate值,aocv通过将cell derate值与cell的逻辑深度以及实际的位置结合起来进行derate值的设定。那么这种derate如何能够设置到具体的cell呢,其实是我们在跑STA时候会读入相关的aocv lib file,里面有专门对相关的cell进行的aocv derate值的描述。> table: \

sinat_27691203的博客 7854

Android-ContentProvider数据库操作

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

u011202334的专栏 1310

Fleury算法寻找欧拉回路(mtlab代码详解)

【代码】Fleury算法寻找欧拉回路(mtlab代码详解)

m0_63449998的博客 1296

从JTAG到AS模式:一文搞懂EP4CE10E22C8N所有配置引脚(MSEL, nCONFIG, DATA0)的用法

本文深入解析EP4CE10E22C8N FPGA的配置引脚(MSEL, nCONFIG, DATA0)在不同模式下的使用方法,特别关注从JTAG到AS模式的切换要点。通过详细的配置模式对比、状态机分析和PCB布局建议,帮助开发者避免常见陷阱,提升FPGA配置成功率。

weixin_33713350的博客 320

ContentProvider

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

刘永祥的专栏 1046

保姆级避坑指南:用Docker在Ubuntu 22.04上部署Isaac Sim 5.1.0,搞定宇树G1仿真环境

本文提供了一份详细的保姆级避坑指南,帮助用户在Ubuntu 22.04上通过Docker部署Isaac Sim 5.1.0,并成功搭建宇树G1仿真环境。文章涵盖了环境准备、Docker与NVIDIA容器工具包的配置、Isaac Sim镜像的定制化拉取与配置,以及宇树G1仿真环境的实战调试,旨在帮助开发者高效解决部署过程中的常见问题。

weixin_33728268的博客 207

ContentProvider介绍

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

liwei405499的专栏 794

EDF Browser使用说明和技巧

edf browser使用说明和一些小技巧

Erhu_666的博客 8329

【对比学习+分割】CRIS:CLIP驱动RIS图像分割(CVPR 2022)

CRIS: CLIP-Driven Referring Image Segmentation

这个博客太懒了什么都没说 3325

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

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

毕小烦的学习笔记 6707

《QT+PCL》点云的点选与框选

【代码】《QT+PCL》点云的点选与框选。

阁楼 3602

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

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

gitblog_01197的博客 2046

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

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

contentProvider 和database 和sqllite

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

lei7143的专栏 475

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

weixin_30413765的博客 391

廖雪峰Python教程[完整版]

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

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、付费专栏及课程。

余额充值