初学android:四大组件之contentprovider
一、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的更多相关文章
- Android 四大组件之" ContentProvider "
前言 ContentProvider作为Android的四大组件之一,是属于需要掌握的基础知识,可能在我们的应用中,对于Activity和Service这两个组件用的很常见,了解的也很多,但是对Con ...
- Android四大组件之——ContentProvider(一)
Android四大组件之--ContentProvider(一) 本人邮箱:JohnTsai.Work@gmail.com,欢迎交流讨论. 欢迎转载,转载请注明网址:http://www.cnblog ...
- 【Android开发日记】之入门篇(九)——Android四大组件之ContentProvider
数据源组件ContentProvider与其他组件不同,数据源组件并不包括特定的功能逻辑.它只是负责为应用提供数据访问的接口.Android内置的许多数据都是使用ContentProvider形式,供 ...
- Android四大组件之contentProvider
Activity,Service,broadcast and Contentprovider android 4 大组件. ContentProvider:使用: public class Image ...
- android四大组件之ContentProvider(一)
ContentProvider学习笔记 1. ContentProvider基本概念 ContentProvider向我们提供了我们在应用程序之间共享数据的一种机制,虽然采用文件和SharedPref ...
- Android 四大组件之四(ContentProvider)
ContentProvider调用关系: ContentProvider(数据提供者)是应用程序之间共享数据的一种接口机制,是一种更为高级的数据共享方法. ContentProvider可以指定需要共 ...
- android四大组件之ContentProvider(二)
ContentProvider学习笔记 上一章节我们编写了自定义的一个StudentProvider,他提供了两种供外界访问数据的方式,content://come.demo.sqlite.stude ...
- Android四大组件之contentProvider(续)
1.content provider与网页有何相似之处? contentProvider使用authority 同网站的域名类似 contentProvider还可以提供类似于网站的索引方式 ...
- [Android]Android四大组件之ContentProvider
URI简介 URI(Universal Resource Identifier),又被称为"通用资源标志符". URI由许多部分所组成,示例及解说如下: Content URIs介 ...
随机推荐
- [OC Foundation框架 - 23] 文件管理
A. 目录管理 NSFileManager*manager = [NSFileManagerdefaultManager];//单例模式 // 1.获取文件属性 NSString *path = @& ...
- ORA-01078, LRM-00123错误处理
创建spfile时, 或者在nomount时, 出现下面的问题: SQL> create spfile from pfile; create spfile from pfile * ERROR ...
- 高性能javascript
高性能javascript开发 标签(空格分隔): javascript DOM访问与修改 访问DOM元素是具有代价的,修改元素代价较为昂贵,会导致浏览器重新计算页面的几何变化. 尽量减少DOM访问, ...
- js-弹出一个新窗口 新窗口自动转接到一个页面然后自动关闭
这个问题.好. 在百度问问找到的:他的做法是打开一个后通过实例对象,再进行一将跳转,最后再将JS里定时将实例对象关闭... 这个问题其实不需要两个页面,只要三行JS代码就能实现,除非你在2.php里面 ...
- iOS 限制textField输入的长度
1.电话号码(带3-3-4效果) //指定代理 self.phoneTextField.delegate = self; //当编辑改变的时候,进行字符校验 [self.phoneTextField ...
- 46 关于Linux的I/O重定向
I/O重定向是一个过程,这个过程捕捉一个文件.或命令.或程序.或脚本.甚至代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件.或命令.或程序.或脚本. 1.I/O重定 ...
- OC语言--NSFileManager& NSFileHandle
1.关于文件的介绍 ->什么是文件: 文件概念, 广义文件. 狭义文件(磁盘文件). 文件常见的使用操作(可用命令行演示文件操作的使用场景). ->什么是路径: 简单来说就是,在系统中,要 ...
- joa-framework 工作流高速开发框架(jeecg官方工作流版本号) 公布
-------------------------------------- version: joa-framework1.0.0.beta 版本号: JOA 工作流高速开发框架 Date: ...
- 访谈将源代码的函数 strcpy/memcpy/atoi/kmp/quicksort
一.社论 继上一次发表了一片关于參加秋招的学弟学妹们怎样准备找工作的博客之后,反响非常大.顾在此整理一下,以便大家复习.好多源自july的这篇博客,也有非常多是我自己整理的.希望大家可以一遍一遍的写. ...
- 学习笔记之Java程序设计实用教程
Java程序设计实用教程 by 朱战立 & 沈伟 学习笔记之JAVA多线程(http://www.cnblogs.com/pegasus923/p/3995855.html) 国庆休假前学习了 ...