1ContentProvider相关知识
1.1在安卓应用中,通过文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据。可以看出虽然它们 可以对外共享数据,但数据访问方式会因数据存储的方式而不同。
在安卓中使用ContentProvider共享数据在不同的应用程序之间共享数据,底层的操作是透明的,对外提供统一接口,并可以让其它应用轻松访问该数据。

1.2ContentProvider使用表的形式来组织数据,无论数据的来源是什么,都会认为是一种表,然后把数据组织成表格。并且提供了查询(query)、插入(insert)、更新(update)、删除(delete)、获取数据类型(getType)以及创建数据时调用的回调函数(onCreate)等操作。另外每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中。

2代码

2.1访问系统中的联系人

public class MainActivity extends Activity {
private ListView listView = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); listView = (ListView) this.findViewById(R.id.listView);
// 查询系统中的所有联系人
Uri uri = Uri.parse("content://com.android.contacts/contacts");
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
// 根据Cursor创建SimpleCursorAdapter对象
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, cursor,
new String[] { ContactsContract.Contacts.DISPLAY_NAME },
new int[] { android.R.id.text1 },
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
// 在ListVIew中显示联系人列表
listView.setAdapter(simpleCursorAdapter);
}
}

  同时需要在清单文件加入访问通讯许可请求

<uses-permission android:name="android.permission.READ_CONTACTS" />

  2.2程序的Content Provider

这个例子是对数据库实现的操作,数据库的操作是上一篇中的内容

数据库操作类

public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(Context context) {
/**
* postgrade.db 数据库的名字 ;null 表示使用默认的游标工厂 ;1 表示一开始的版本,建议设置为1
*/
super(context, "postgrade.db", null, 1);
} @Override
public void onCreate(SQLiteDatabase db) {
// 该方法在第一次创建数据库的时候被调用
// 因此可以在这个地方创建表之类的操作
db.execSQL("CREATE TABLE student(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(20))");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 修改数据库的版本会触发此函数
// 在这里可以添加新的表或者修改表的字段
}
}

  自定义的content provider

public class StuProvider extends ContentProvider {
private DBOpenHelper dbOpenHelper = null; private static final UriMatcher MATCHER;
private static final int STU = 0;// 匹配成功后的返回值
private static final String AUTHORITY;// 域名[主机名]
private static final String STUDENT;// 路径名 static {
// 在不匹配的时候,返回-1,即UriMatcher.NO_MATCH
MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
AUTHORITY = "org.tonny.providers.stuprovider";
STUDENT = "student";
MATCHER.addURI(AUTHORITY, STUDENT, STU);
} @Override
public boolean onCreate() {
// 在创建实例的时候调用,只会被调用一次;用作数据的初始化操作
dbOpenHelper = new DBOpenHelper(getContext());
return false;
} @Override
public String getType(Uri uri) {
// 返回当前要操作的数据的内容类型如txt-->plain/text html -->html/text
return null;
} @Override
public Uri insert(Uri uri, ContentValues values) {
// 允许外部的应用向内容提供者插入数据
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
switch (MATCHER.match(uri)) {
case STU:
// 調用自身的方法,第二個參數爲插入空值时候的列名
long rowId = db.insert("student", null, values);
Uri insertUri = ContentUris.withAppendedId(uri, rowId); // 也可以使用这种方式
// Uri insertUri =
// Uri.parse("content://org.tonny.test.providers.stuprovider/student/"+
// rowId);
return insertUri;
default:
throw new IllegalArgumentException("This is an unknown Uri:" + uri);
}
} @Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
} @Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO Auto-generated method stub
return 0;
} @Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO Auto-generated method stub
return null;
} }

  model层

package org.tonny.domain;

public class Student {
private int id;
private String name; public Student() { } public Student(int id, String name) {
this.id = id;
this.name = name;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

  表相关操作

public class StudentService {

	private DBOpenHelper dbHelper = null;

	public StudentService(Context context) {
this.dbHelper = new DBOpenHelper(context);
} public void insert(Student stu) {
// 内部有緩存功能,使用的是同一個句柄,如果数据库满了,则返回一个只读的句柄
SQLiteDatabase db = dbHelper.getWritableDatabase();
// 使用占位符號‘?’,防止特殊字符
db.execSQL("INSERT INTO student VALUES(?,?)",
new Object[] { stu.getId(), stu.getName() });
} public void delete(Integer id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
db.execSQL("DELETE FROM student WHERE id = ?",
new String[] { String.valueOf(id) });
} public void update(Student stu) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL("UPDATE student SET name = ? WHERE id = ?", new String[] {
stu.getName(), String.valueOf(stu.getId()) });
} public Student query(Integer id) {
SQLiteDatabase db = dbHelper.getReadableDatabase();
String sql = "SELECT * FROM student WHERE id = ?";
Cursor cursor = db.rawQuery(sql, new String[] { String.valueOf(id) });
if (cursor.moveToFirst()) {
int stuId = cursor.getInt(cursor.getColumnIndex("id"));
String stuName = cursor.getString(cursor.getColumnIndex("name"));
return new Student(stuId, stuName);
}
return null;
}
}

  activity操作

public class MainActivity extends Activity {
private EditText _txtId = null;
private EditText _txtName = null;
private StudentService _service = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_txtId = (EditText) this.findViewById(R.id.txtId);
_txtName = (EditText) this.findViewById(R.id.txtName);
_service = new StudentService(getApplicationContext());
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} public void onBtnOK(View v) {
int id = Integer.valueOf(_txtId.getText().toString());
String name = _txtName.getText().toString();
Student stu = new Student(id, name);
_service.insert(stu);
} }

  清单文件中对uri的说明

<provider
android:name="org.tonny.db.StuProvider"
android:authorities="org.tonny.providers.stuprovider"
android:exported="true"
tools:ignore="ExportedContentProvider" />

  3.总结

到今天,已经感觉是时候去找些业务研究研究了

Android学习五:Content Provider 使用的更多相关文章

  1. Android学习总结——Content Provider

    原文地址:http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html Content Provider内容提供者 : and ...

  2. Android学习笔记——Content Provider(一)

    Content Provider是Android系统四大组件之一: 官方的定义是:A Content Provider manages access to a central repository o ...

  3. Android Contacts (android通讯录读取)-content provider

    Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据 ...

  4. Android四大组件-Content Provider

    http://www.jianshu.com/p/c3ce81b638bd 一.基础回顾. 简介ContentProvider(数据提供者)是在应用程序间共享数据的一种接口机制,虽然我们可以采用文件存 ...

  5. android学习五 Intent

    1.Intent是组件间调用的桥梁. 2.Android系统定义了很多Intent    http://developer.android.com/guide/components/intents-c ...

  6. android学习五---OpenCV for android环境搭建

    学习android的目的是想在手机上实现计算机视觉的算法.一般算法的研究都是在Matlab上进行,但是手机平台没有那么多的计算资源,用matlab显然是不太现实的.而OpenCV是基于C++语言编写的 ...

  7. openfire Android学习(五)------连接断开重连

    首先要创建连接监听器,用来监听连接状态,这里我写了一个类 继承了ConnectionListener,重写了里面5个方法,最重要的两个方法connectionClosed()和connectionCl ...

  8. (转载)Android content provider基础与使用

    android有一个独特之处就是,数据库只能被它的创建者所使用,其他的应用是不能访问到的,所以如果你想实现不同应用之间的数据共享,就不得不用content provider了.在Android中,co ...

  9. 【转】 Pro Android学习笔记(九一):了解Handler(5):组件生命

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 对于activity,消息是在OnCrea ...

随机推荐

  1. Codeforces Round #262 (Div. 2)

    A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  2. HttpHelper类登录淘宝联盟并下载淘宝客订单xls

    本次开发环境与工具如下:IE9.0浏览器 + IE抓包插件HttpWatch +WIN7 64位系统 + VS2005 IDE + .NET 2.0框架本想上传HttpWatch抓包插件,但由于文件超 ...

  3. Android 广播机制概论

    Android 中的每一个应用程序都可以对自己感兴趣的广播进行注册,这样,该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序. 广播分为2种: 1.标准广播 ...

  4. 在centos7上作用mongodb

    安装服务端 yum install mongodb-server 安装客户端 yum install mongodb 版本 mongo --version 是否安装了mongodbwhich mong ...

  5. 【nginx】利用yum源安装nginx

    先安装nginx的yum源 http://nginx.org/en/linux_packages.html#stable 找到链接,安装: rpm -ivh http://nginx.org/pack ...

  6. 使用ueditor中的setContent() 时经常报innerHtml错误(笔记)

    1)今天遇到个问题,使用ueditor中的setContent() 时经常报innerHtml错误:网上找了下解决方案:发现这个可以用: 不能创建editor之后马上使用ueditor.setCont ...

  7. Icon资源详解[2]

    本文分享&备忘最近了解到的icon资源在windows平台下相关的一部分知识.所有测试代码都尽可能的依赖win32 API实现.通过源码可以了解其结构,同时它们也是可复用的代码积累.     ...

  8. iOS开发UI篇—popoverController简单介绍

    iOS开发UI篇—popoverController简单介绍 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制 ...

  9. 【62测试】【状压dp】【dfs序】【线段树】

    第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...

  10. const 放在函数后

    const 放在函数后表示这个函数是常成员函数, 常成员函数是不能改变成员变量值的函数.const 限定符,它把一个对象转换成一个常量.举例:为了使成员函数的意义更加清楚,我们可在不改变对象的成员函数 ...