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

public boolean onCreate()
public String getType(Uri uri)
//返回当前Uri的MIME类型,如果该Uri对应的数据可能包括多条记录
//那么MIME类型字符串,就是以vnd.android.dir/开头
//如果该Uri对应的数据只有一条记录,该MIME类型字符串,就是以vnd.android.cursor.item/开头
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
//根据Uri查询出selection指定的条件所匹配的全部记录,同时可以指定查询哪些列,并且以什么方式排列(sortOrder)
public int delete(Uri uri,String selection,String[] selectionArgs)//根据Uri删除selection指定的条件所匹配的全部记录
public Uri insert(Uri uri,ContentValues values)//根据Uri插入Values对应的数据
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)//根据Uri插入Values对应的数据

3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中

开始动手:

首先android四大组件都需要注册,在AndroidManifest.xml进行注册

<provider
android:name=".DateProvider"
android:authorities="se_content_provider"//唯一
android:exported="true"
> contentprovider匹配涉及到Uri 先记录下什么是Uri 图片来源于网络:

ContentProvider(内容提供者)的scheme已经由Android所规定, scheme为:content://
主机名(或叫Authority)用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。
路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:

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

如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:
Uri uri = Uri.parse("content://com.ljq.provider.personprovider/person")//person表名

注意点:

访问另一个程序的数据时,要保证另一个程序是运行的。

package se08.edu.com.example.hxdn.softwareengineeringdate;

import android.content.*;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.util.Log; /**
* Created by hxdn on 2015/10/28.
*/
public class DateProvider extends ContentProvider {
public static final int NOTES=1;
public static final int NOTE_ID=2;
public static final String AUTHORITY="se_content_provider";
public static final String TABLE_NAME="txl";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME);
public static UriMatcher sUriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
private DatabaseHelper databaseHelper;
private SQLiteDatabase db;
static
{
sUriMatcher.addURI(AUTHORITY,TABLE_NAME,NOTES);
sUriMatcher.addURI(AUTHORITY,TABLE_NAME+"/#",NOTE_ID);
}
@Override
public boolean onCreate()//在ContentProvider创建后被调用
{
databaseHelper=new DatabaseHelper(getContext());
return true;
}
@Override
public String getType(Uri uri)
//返回当前Uri的MIME类型,如果该Uri对应的数据可能包括多条记录
//那么MIME类型字符串,就是以vnd.android.dir/开头
//如果该Uri对应的数据只有一条记录,该MIME类型字符串,就是以vnd.android.cursor.item/开头
{
return null;
}
@Override
public Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder)
//根据Uri查询出selection指定的条件所匹配的全部记录,同时可以指定查询哪些列,并且以什么方式排列(sortOrder)
{
Log.i("AAA","sada");
db=databaseHelper.getReadableDatabase();
Cursor cursor=null;
switch (sUriMatcher.match(uri))
{
case NOTES:
break;
case NOTE_ID:
Log.i("AAA","草2");
cursor=db.rawQuery("select * from txl",null);
break;
default:
Log.i("AAA","无匹配");
}
return cursor;
}
@Override
public int delete(Uri uri,String selection,String[] selectionArgs)//根据Uri删除selection指定的条件所匹配的全部记录
{
return 0;
} @Override
public Uri insert(Uri uri,ContentValues values)//根据Uri插入Values对应的数据
{
return null;
} @Override//根据Uri插入Values对应的数据
public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs)
{
return 0;
}
}

另一个程序:

package edu.se08.duan_xin;

import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri uri=Uri.parse("content://se_content_provider/txl/20");
Cursor cursor=getContentResolver().query(uri, null, null, null, null);
Log.i("AAA", cursor.getCount() + "记录数");
while (cursor!=null&&cursor.moveToNext())
{
Log.i("AAA",cursor.getCount()+"记录数");
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
}
}

初学android:四大组件之contentprovider的更多相关文章

  1. Android 四大组件之" ContentProvider "

    前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...

  2. Android四大组件之——ContentProvider(一)

    Android四大组件之--ContentProvider(一) 本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblog ...

  3. 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider

    数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供 ...

  4. Android四大组件之contentProvider

    Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...

  5. android四大组件之ContentProvider(一)

    ContentProvider学习笔记 1. ContentProvider基本概念 ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,虽然采用文件和SharedPref ...

  6. Android 四大组件之四(ContentProvider)

    ContentProvider调用关系: ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法. ContentProvider可以指定需要共 ...

  7. android四大组件之ContentProvider(二)

    ContentProvider学习笔记 上一章节我们编写了自定义的一个StudentProvider,他提供了两种供外界访问数据的方式,content://come.demo.sqlite.stude ...

  8. Android四大组件之contentProvider(续)

    1.content provider与网页有何相似之处? contentProvider使用authority 同网站的域名类似 contentProvider还可以提供类似于网站的索引方式      ...

  9. [Android]Android四大组件之ContentProvider

    URI简介 URI(Universal Resource Identifier),又被称为"通用资源标志符". URI由许多部分所组成,示例及解说如下: Content URIs介 ...

随机推荐

  1. Bzoj-2005 能量采集 gcd,递推

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题意:题目转换后的模型就是求Σ(gcd(x,y)), 1<=x<=n, ...

  2. [Objective-c 基础 - 3.3] block数据类型

    A.概念 1.block类似函数 (1)可以保存代码 (2)有返回值 (3)有形参  2.block的标志:^ // 没有参数和返回值的block void (^myblock)() = ^{ // ...

  3. [html]HTML <form> 标签的 enctype 属性

  4. 有return的情况下try catch finally的执行顺序(最有说服力的总结)

    结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...

  5. 【Stage3D学习笔记续】真正的3D世界(六):空间大战

    这就是书上的最终效果了,一个完整的空间大战游戏: 点击查看源码 这里并没有太多的新知识,所涉及的东西更多的是游戏开发方面的优化和技巧,下面我们大家一起来看看: 飞船: 类似粒子效果中的粒子创建方法,我 ...

  6. POJ 3130 How I Mathematician Wonder What You Are! /POJ 3335 Rotating Scoreboard 初涉半平面交

    题意:逆时针给出N个点,求这个多边形是否有核. 思路:半平面交求多边形是否有核.模板题. 定义: 多边形核:多边形的核可以只是一个点,一条直线,但大多数情况下是一个区域(如果是一个区域则必为 ).核内 ...

  7. LINUX下的简单线程池

    前言 任何一种设计方式的引入都会带来额外的开支,是否使用,取决于能带来多大的好处和能带来多大的坏处,好处与坏处包括程序的性能.代码的可读性.代码的可维护性.程序的开发效率等. 线程池适用场合:任务比较 ...

  8. eclispe搭建android平台

    1.不推荐在线安装android ADT,因为需要FQ.可以在网上下载ADT,然后离线安装. 离线安装方式:help->Install ->点击add然后选择你的安装包(不需要解压),一直 ...

  9. Spring + iBatis 的多库横向切分简易解决思路

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  10. 项目androidAnt编译打包Android项目

    时间紧张,先记一笔,后续优化与完善. Ant编译打包Android项目 在Eclipse中对Android项目停止编译和打包如果项目比较大的话会比较慢,所以改为Ant工具来停止编译和打包 Ant环境配 ...