[1]定义内容提供者 定义一个类继承contentProvider
[2]在清单文件里面配置一下 学霸 定义一些规则 a呀 d
[3] 定义一个urimatcher
[4]写一个静态代码块 添加匹配规则
[5]按照我们添加的匹配规则 暴露想暴露的方法
[6]如果你发现如下log日志 就说明内容提供者写的没有问题
09-1102:02:31.142:/ActivityThread(16636):Pub.itheima.provider:.itheima.db.AccountProvider
[7]只要是通过内容提供者暴露出来的数据 其他应用访问的方式都是一样的 就是通过内容解析者
1_创建一个私有的数据库
public class AccountProvider extends ContentProvider {
//[1]定一个一个uri路径匹配器
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int QUERYSUCESS = 0; //ctrl+shift+X 变大写 小写加y
private static final int INSERTSUCESS = 1;
private static final int UPDATESUCESS = 2;
private static final int DELETESUCESS = 3;
private MyOpenHelper myOpenHelper;
//[2]创建一个静态代码块 在这个里面添加 uri
static{
/**
* http://www.baidu.com
* authority 注意: 和清单文件里面定义的一样 com.itheima.provider/query
*
*/
sURIMatcher.addURI("com.itheima.provider", "query", QUERYSUCESS);
sURIMatcher.addURI("com.itheima.provider", "insert", INSERTSUCESS);
sURIMatcher.addURI("com.itheima.provider", "update", UPDATESUCESS);
sURIMatcher.addURI("com.itheima.provider", "delete", DELETESUCESS);
}
//当内容提供者初始化 会执行此方法
@Override
public boolean onCreate() {
//[3]初始化 myopenHelpler 对象 就可以获取到sqlitedatabases对象 我们就可以操作数据库
myOpenHelper = new MyOpenHelper(getContext());
return false;
}
//这个方法对外暴露的
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
int code = sURIMatcher.match(uri);
if (code ==QUERYSUCESS ) {
//说明路径匹配成功
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//调用query方法
Cursor cursor = db.query("info", projection, selection, selectionArgs, null, null, sortOrder);
//发送一条消息 说明说明数据库被操作了
getContext().getContentResolver().notifyChange(uri, null);
// db.close();
//小细节 ☆ 这个cursor不能关
return cursor;
}else{
//说明路径不匹配
// return null;
throw new IllegalArgumentException("哥们 :uri路径不匹配 请检测路径");
}
}
@Override
public String getType(Uri uri) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
int code = sURIMatcher.match(uri);
if (code == INSERTSUCESS) {
//说明路径匹配成功
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
long insert = db.insert("info", null, values);
Uri uri2 = Uri.parse("com.hahaheheheihei/"+insert);
if (insert>0) {
//发送一条消息 说明说明数据库被操作了
getContext().getContentResolver().notifyChange(uri, null);
}
db.close();//关闭数据库
return uri2;
}else {
throw new IllegalArgumentException("姐们 :uri路径不匹配 请检测路径");
}
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int code = sURIMatcher.match(uri);
if (code == DELETESUCESS) {
//匹配成功
SQLiteDatabase db = myOpenHelper.getReadableDatabase();
//代表影响的行数
int delete = db.delete("info", selection, selectionArgs);
if (delete>0) {
//发送一条消息 说明说明数据库被操作了
getContext().getContentResolver().notifyChange(uri, null);
}
return delete;
}
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
int code = sURIMatcher.match(uri);
if (code == UPDATESUCESS) {
//路径匹配成功
SQLiteDatabase db = myOpenHelper.getWritableDatabase();
//代表影响的行数
int update = db.update("info", values, selection, selectionArgs);
if(update>0){
//发送一条消息 说明说明数据库被操作了
getContext().getContentResolver().notifyChange(uri, null);
}
return update;
}else{
throw new IllegalArgumentException("大爷:uri路径不匹配 请检测路径");
}
}
}
<!-- 配置内容提供者 -->
<provider
android:name="com.itheima.db.AccountProvider"
android:authorities="com.itheima.provider" >
</provider>
</application>
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
public class MyOpenHelper extends SQLiteOpenHelper {
public MyOpenHelper(Context context) {
/**
* name 数据库的名字
* factory 游标工厂
* version 版本
*/
super(context, "Account.db", null, 1);
}
/**
* Called when the database is created for the first time
* 当数据库第一次 创建的时候调用 那么这个方法特别适合做 表结构的初始化
*
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table info(_id integer primary key autoincrement,name varchar(20),money varchar(20))");
db.execSQL("insert into info(name,money) values(?,?)", new String[]{"张三","5000"});
db.execSQL("insert into info(name,money) values(?,?)", new String[]{"李四","3000"});
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2_读取第一个应用数据库的数据
package com.test.readdb;
import android.net.Uri;
import android.os.Bundle;
import android.annotation.SuppressLint;
import .Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//点击按钮 往数据库里面插入一条数据
public void click1(View v){
//因为第一个应用里面的私有的数据库 已经通过内容提供者暴露出来了 所以通过内容解析者去获取数据
Uri uri = Uri.parse("content://com.itheima.provider/insert");
ContentValues values = new ContentValues(); //实际是map
//key: 代表列名 value 对应的值
values.put("name", "zhaoliu");
values.put("money", 1000);
//插入一条数据
Uri uri2 = getContentResolver().insert(uri, values);
System.out.println("uri2:"+uri2);
}
//点击按钮删除 赵六删掉
public void click2(View v){
//[1]获取内容的解析者
Uri uri = Uri.parse("content://com.itheima.provider/delete");
//[2]代表影响的函数
int delete = getContentResolver().delete(uri, "name=?", new String[]{"zhaoliu"});
Toast.makeText(getApplicationContext(), "删除了"+delete+"行", 1).show();
}
//给赵六多点钱 1000元
public void click3(View v){
//[1] 创建uri
Uri uri = Uri.parse("content://com.itheima.provider/update");
//[2]获取内容的解析者
ContentValues values = new ContentValues();
values.put("money", "10000000");
int update = getContentResolver().update(uri, values, "name=?",new String[]{"zhaoliu"});
Toast.makeText(getApplicationContext(), "更新了"+update+"行", 1).show();
}
//点击按钮 查询第一个应用里面数据库的信息
public void click4(View v){
// 第二种 查询方式 因为第一个应用里面的私有的数据库 已经通过内容提供者暴露出来了 所以通过内容解析者去获取数据
Uri uri = Uri.parse("content://com.itheima.provider/query");
//获取内容解析者获取数据
Cursor cursor = getContentResolver().query(uri, new String[]{"name","money"}, null, null, null);
if (cursor!=null) {
while(cursor.moveToNext()){
String name = cursor.getString(0);
String money = cursor.getString(1);
System.out.println("第二个应用:"+name+"---"+money);
}
}
}
}
















