1、ContentProvider的基本概念
1> ContentProvider为存储和读取数据提供了统一的接口
2> 使用ContentProvider,应用程序可以实现数据共享
3> android内置的许多数据都是使用ContentProvider形式,供开发者调用的(如视频,音频,图片,通讯录等)
2、Uri
1> 每一个ContentProvider都拥有一个公共的Uri,这个Uri用于表示这个ContentProvider提供的数据
2> Android所提供的ContentProvider都存放在andriod.provider这个包里面
3、ContentProvider提供的函数
1> query() 查询
2> insert() 插入
3> update() 更新
4> delete() 删除
  5> getType() 得到数据类型
6> onCreate() 创建时的回调函数
4、实现ContentProvider的过程
1> 定义一个COTENT_URI常量
2> 定义一个类,继承ContentProvider
3> 实现query(),delete(),update(),insert(),onCreate(),getType()方法
4> 在AndroidMainfest.xml中申明
下面以两个实例(一个是ContentProvider所在的应用,另一个是使用ContentProvider的应用),说明如何使用ContentProvider
5、ContentProvider所在的应用
1>定义一个类,里面定义一些常量


package com.yyl.android;
import android.net.Uri;
import android.provider.BaseColumns;
public class MyUsers {

public static final String AUTHORITY = "com.yyl.android.MyContentProvider";

//BaseColumn类中已经包含了_id字段
public static final class User implements BaseColumns
{
//定义Uri
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
//定义数据表列
public static final String USER_NAME = "USER_NAME";
}
}
2>定义一个继承ContentProvider的子类,实现其方法
package com.yyl.android;
import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteQueryBuilder;
import android.net.Uri;

/*
* MyContentProvider继承ContentProvider类,实现其insert,update,delete,getType,onCreate等方法
*/
public class MyContentProvider extends ContentProvider {
//定义一个SQLiteDatabase变量
private SQLiteDatabase sqlDB;
//定义一个DatabaseHelper变量
private DatabaseHelper dbHelper;
//数据库名
private static final String DATABASE_NAME = "Users.db";
//数据库版本
private static final int DATABASE_VERSION = 1;
//表名
private static final String TABLE_NAME = "User";
//标签
private static final String TAG = "MyContentProvider";
/*
* 定义一个内部类
*
* 这个内部类继承SQLiteOpenHelper类,重写其方法
*/
public static class DatabaseHelper extends SQLiteOpenHelper {
//构造方法
public DatabaseHelper(Context context) {
//父类构造方法
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
//当第一次创建数据库的时候调用该方法,可以为数据库增加一些表,和初始化一些数据
@Override
public void onCreate(SQLiteDatabase db) {
//在数据库里生成一张表
db.execSQL("Create table "
+ TABLE_NAME
+ "( _id INTEGER PRIMARY KEY AUTOINCREMENT, USER_NAME TEXT);");
}
//当更新数据库版本的时候,调用该方法。可以删除,修改表的一些信息
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
}
//这是一个回调函数,当生成所在类的对象时,这个方法被调用,创建一个数据库
@Override
public boolean onCreate() {
dbHelper = new DatabaseHelper(getContext());
return (dbHelper == null) ? false : true;
}
//查询
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
SQLiteDatabase db = dbHelper.getReadableDatabase();
qb.setTables(TABLE_NAME);
Cursor c = qb.query(db, projection, selection, null, null, null,
sortOrder);
c.setNotificationUri(getContext().getContentResolver(), uri);
return c;
}
//取得类型
@Override
public String getType(Uri uri) {
return null;
}
//插入数据
@Override
public Uri insert(Uri uri, ContentValues contentvalues) {
sqlDB = dbHelper.getWritableDatabase();
long rowId = sqlDB.insert(TABLE_NAME, "", contentvalues);
if (rowId > 0) {
Uri rowUri = ContentUris.appendId(
MyUsers.User.CONTENT_URI.buildUpon(), rowId).build();
getContext().getContentResolver().notifyChange(rowUri, null);
return rowUri;
}
throw new SQLException("Failed to insert row into" + uri);
}
//删除数据
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
//更新数据
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
}

3>定义一个默认加载的Activity,里面对ContentProvider进行数据加载
package com.yyl;
import com.yyl.android.MyUsers;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.Toast;
public class MyContentDemo extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
insertRecord("MyUser");
insertRecord("YangYuLin");
displayRecords();
}
private void insertRecord(String userName) {
ContentValues values = new ContentValues();
values.put(MyUsers.User.USER_NAME, userName);
getContentResolver().insert(MyUsers.User.CONTENT_URI, values);
}
private void displayRecords() {
String columns[] = new String[] { MyUsers.User._ID,
MyUsers.User.USER_NAME };
Uri myUri = MyUsers.User.CONTENT_URI;
Cursor cur = managedQuery(myUri, columns, null, null, null);
if (cur.moveToFirst()) {
String id = null;
String userName = null;
do {
id = cur.getString(cur.getColumnIndex(MyUsers.User._ID));
userName = cur.getString(cur
.getColumnIndex(MyUsers.User.USER_NAME));
Toast.makeText(this, id + " " + userName, Toast.LENGTH_LONG)
.show();
} while (cur.moveToNext());
}
}
}


4>在AndroidMainfest.xml里注册
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yyl"
android:versionCode="1"
android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="@string/app_name">
<provider android:name=".android.MyContentProvider" android:authorities="com.yyl.android.MyContentProvider" />
<activity android:name=".MyContentDemo"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-sdk android:minSdkVersion="7" />

</manifest>


6、做另一个App.使用上面ContentProvider提供的数据
package yyl.client;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class CPClientActitity extends Activity {

public static final String AUTHORITY = "com.yyl.android.MyContentProvider";
private Button insertButton = null;
//访问ContentProvider的Uri
Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

//得到ContentProvider对于表的所有数据,以游标格式保存
Cursor c = managedQuery(CONTENT_URI,new String[]{"_id","USER_NAME"},null,null,null);

//循环打印ContentProvider的数据
if(c.moveToFirst())
{
String _id = null;
String user_name = null;

do
{
//得到_id列,USER_NAME列
_id = c.getString(c.getColumnIndex("_id"));
user_name = c.getString(c.getColumnIndex("USER_NAME"));

System.out.println("_id = " + _id +", user_name = " + user_name);

}while(c.moveToNext());
}

//根据Id得到控件对象
insertButton = (Button)findViewById(R.id.Insert);
//给按钮绑定事件监听器
insertButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {

//得到EditText输入的数据
String username = ((EditText)findViewById(R.id.userName)).getText().toString();
//生成一个ContentResolver对象
ContentResolver cr = getContentResolver();
//生成一个ContentValues对象
ContentValues values = new ContentValues();
//将EditText输入的值,保存到ContentValues对象中
values.put("USER_NAME", username);
//插入数据
cr.insert(CONTENT_URI, values);
}
});
}
}

更多相关文章

  1. Android(安卓)四大组件,五大存储,六大布局
  2. Android之Adapter用法总结
  3. Android(安卓)studio连接Bmob云数据库教程
  4. android 简单的上拉加载实现
  5. (收集)ListView中常用属性
  6. 浅谈Java中Collections.sort对List排序的两种方法
  7. mybatisplus的坑 insert标签insert into select无参数问题的解决
  8. python起点网月票榜字体反爬案例
  9. Python list sort方法的具体使用

随机推荐

  1. php设计模式之组合模式——处理树形结构
  2. 使用注册树及工厂模式来替代使用单例模式
  3. 了解php-fpm中max_children的配置
  4. php in_array函数用法(实例)
  5. php设计模式:桥接模式学习心得(附案例代码)
  6. 直击PHP进程管理器php-fpm
  7. 什么是适配器模式,它有哪些应用场景
  8. 掌握PHP 爬取网页的主要方法
  9. PHP设计模式之简单工厂模式
  10. 什么是装饰者模式,它与桥接模式有什么不同