文章目录

        • 1、简介
        • 2、代码结构
        • 3、创建 privadeContent 的 AndroidManifest 文件
        • 4、创建 privadeContent 的 DbHelper 文件
        • 5、创建 privadeContent 的 MyProvider 文件
        • 5、创建 privadeContent 的 ManiActivity 文件
        • 6、在另一个app 里真正创建访问 ManiActivity (TestProvide app)
        • 7、log 输出

1、简介

Content Provider 提供支持 不同app 不同进程 都可以访问的数据库
当然在同一进程里,也就是一个app里也可用

2、代码结构

我们看到两个App:
1) privadeContent (创建provide 数据库)
(1) AndroidManifest.xml 添加权限
(2) DbHelper MyProvide 实现数据库的创建
(3)MainActivity 什么都没做

2) testProvide (添加查询访问数据库)
(1)MainActivity 数据库操作 读写

3、创建 privadeContent 的 AndroidManifest 文件

<?xml version="1.0" encoding="utf-8"?>                                                                                  //添加 provider            

4、创建 privadeContent 的 DbHelper 文件

package com.example.tssh.myprivadecontent;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DbHelper  extends SQLiteOpenHelper {    // 数据库名    private static final String DATABASE_NAME = "finch.db";    // 表名    public static final String USER_TABLE_NAME = "user";    public static final String JOB_TABLE_NAME = "job";    //数据库版本号    private static final int DATABASE_VERSION = 1;    public DbHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        // 创建两个表格:用户表 和职业表        db.execSQL("CREATE TABLE IF NOT EXISTS " + USER_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + " name TEXT)");        db.execSQL("CREATE TABLE IF NOT EXISTS " + JOB_TABLE_NAME + "(_id INTEGER PRIMARY KEY AUTOINCREMENT," + " job TEXT)");    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)   {    }}

5、创建 privadeContent 的 MyProvider 文件

package com.example.tssh.myprivadecontent;import android.content.ContentProvider;import android.content.ContentValues;import android.content.Context;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;public class MyProvider extends ContentProvider {    private Context mContext;    DbHelper mDbHelper = null;    SQLiteDatabase db = null;    // 设置ContentProvider的唯一标识    public static final String AUTOHORITY = "com.example.tssh.myprivadecontent";    public static final int User_Code = 1;    public static final int Job_Code = 2;    // UriMatcher类使用:在ContentProvider 中注册URI    private static final UriMatcher mMatcher;    static{        mMatcher = new UriMatcher(UriMatcher.NO_MATCH);        // 初始化        // 若URI资源路径 = content://com.example.tssh.mycontentprovide/user ,则返回注册码User_Code        // 若URI资源路径 = content://com.example.tssh.mycontentprovide/job ,则返回注册码Job_Code        mMatcher.addURI(AUTOHORITY,"user", User_Code);        mMatcher.addURI(AUTOHORITY, "job", Job_Code);    }    // 以下是ContentProvider的6个方法    /**     * 初始化ContentProvider     */    @Override    public boolean onCreate() {        mContext = getContext();        // 在ContentProvider创建时对数据库进行初始化        // 运行在主线程,故不能做耗时操作,此处仅作展示        mDbHelper = new DbHelper(getContext());        db = mDbHelper.getWritableDatabase();        // 初始化两个表的数据(先清空两个表,再各加入一个记录)        db.execSQL("delete from user");        db.execSQL("insert into user values(1,'Carson');");        db.execSQL("insert into user values(2,'Kobe');");        db.execSQL("delete from job");        db.execSQL("insert into job values(1,'Android');");        db.execSQL("insert into job values(2,'iOS');");        return true;    }    /**     * 添加数据     */    @Override    public Uri insert(Uri uri, ContentValues values) {        // 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名        // 该方法在最下面        String table = getTableName(uri);        // 向该表添加数据        db.insert(table, null, values);        // 当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者)        mContext.getContentResolver().notifyChange(uri, null);//        // 通过ContentUris类从URL中获取ID//        long personid = ContentUris.parseId(uri);//        System.out.println(personid);        return uri;    }    /**     * 查询数据     */    @Override    public Cursor query(Uri uri, String[] projection, String selection,                        String[] selectionArgs, String sortOrder) {        // 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名        // 该方法在最下面        String table = getTableName(uri);//        // 通过ContentUris类从URL中获取ID//        long personid = ContentUris.parseId(uri);//        System.out.println(personid);        // 查询数据        return db.query(table,projection,selection,selectionArgs,null,null,sortOrder,null);    }    /**     * 更新数据     */    @Override    public int update(Uri uri, ContentValues values, String selection,                      String[] selectionArgs) {        // 由于不展示,此处不作展开        return 0;    }    /**     * 删除数据     */    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        // 由于不展示,此处不作展开        return 0;    }    @Override    public String getType(Uri uri) {        // 由于不展示,此处不作展开        return null;    }    /**     * 根据URI匹配 URI_CODE,从而匹配ContentProvider中相应的表名     */    private String getTableName(Uri uri){        String tableName = null;        switch (mMatcher.match(uri)) {            case User_Code:                tableName = DbHelper.USER_TABLE_NAME;                break;            case Job_Code:                tableName = DbHelper.JOB_TABLE_NAME;                break;        }        return tableName;    }}

5、创建 privadeContent 的 ManiActivity 文件

package com.example.tssh.myprivadecontent;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}

6、在另一个app 里真正创建访问 ManiActivity (TestProvide app)

package com.example.tssh.mytestprovide;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        /**         * 对user表进行操作         */        // 设置URI        Uri uri_user = Uri.parse("content://com.example.tssh.myprivadecontent/user");        // 插入表中数据        ContentValues values = new ContentValues();        values.put("_id", 4);        values.put("name", "Lum");        // 获取ContentResolver        ContentResolver resolver =  getContentResolver();        // 通过ContentResolver 根据URI 向ContentProvider中插入数据        resolver.insert(uri_user,values);        // 通过ContentResolver 向ContentProvider中查询数据        Cursor cursor = resolver.query(uri_user, new String[]{"_id","name"}, null, null, null);        while (cursor.moveToNext()){            System.out.println("query book:" + cursor.getInt(0) +" "+ cursor.getString(1));            // 将表中数据全部输出        }        cursor.close();        // 关闭游标        /**         * 对job表进行操作         */        // 和上述类似,只是URI需要更改,从而匹配不同的URI CODE,从而找到不同的数据资源        Uri uri_job = Uri.parse("content://com.example.tssh.myprivadecontent/job");        // 插入表中数据        ContentValues values2 = new ContentValues();        values2.put("_id", 4);        values2.put("job", "Android IT Work");        // 获取ContentResolver        ContentResolver resolver2 =  getContentResolver();        // 通过ContentResolver 根据URI 向ContentProvider中插入数据        resolver2.insert(uri_job,values2);        // 通过ContentResolver 向ContentProvider中查询数据        Cursor cursor2 = resolver2.query(uri_job, new String[]{"_id","job"}, null, null, null);        while (cursor2.moveToNext()){            System.out.println("query job:" + cursor2.getInt(0) +" "+ cursor2.getString(1));            // 将表中数据全部输出        }        cursor2.close();        // 关闭游标    }}

7、log 输出

文献参考:
Android:关于ContentProvider的知识都在这里了!
https://blog.csdn.net/carson_ho/article/details/76101093

ContentProvider讲解与实例应用
https://blog.csdn.net/shaochen2015821426/article/details/79748487

Android ContentProvider基本用法
https://www.jianshu.com/p/601086916c8f

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android-MVVM架构-Data Binding的使用
  3. Android(安卓)Handler内存泄露分析
  4. Android之SQLiteOpenHelper
  5. android手机连接到ubuntu方法
  6. Android(安卓)ExpandableListView简单使用(一)之仿QQ添加分组功能
  7. 数据结构基础知识核心归纳(三)
  8. GreenDao3.0使用.md
  9. Android(安卓)电话涉及到的几个类备注

随机推荐

  1. 开始使用Android(安卓)Sutdio(二)配置Andro
  2. Android 使用 Simulator GSM
  3. Android:unable to start service Intent
  4. Android之服务Service---电话监听
  5. Android隐藏标题栏,全屏显示
  6. Android小应用: 继续更新uReader
  7. 制作Android Root Ramdisk
  8. Android中的AnimationSet使用
  9. Android 安装路径问题 -- 导致无法启动模
  10. Failed to fetch URL https://dl-ssl.goo