[1]定义内容提供者 定义一个类继承contentProvider
[2]在清单文件里面配置一下 学霸 定义一些规则 a呀 d
[3] 定义一个urimatcher
[4]写一个静态代码块 添加匹配规则
[5]按照我们添加的匹配规则 暴露想暴露的方法
[6]如果你发现如下log日志 就说明内容提供者写的没有问题
09-11 02:02:31.142: I/ActivityThread(16636): Pub com.itheima.provider: com.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 android.app.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); } } } }