android Content Provider 共享数据库
16lz
2021-01-26
文章目录
- 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
更多相关文章
- 一句话锁定MySQL数据占用元凶
- Android-MVVM架构-Data Binding的使用
- Android(安卓)Handler内存泄露分析
- Android之SQLiteOpenHelper
- android手机连接到ubuntu方法
- Android(安卓)ExpandableListView简单使用(一)之仿QQ添加分组功能
- 数据结构基础知识核心归纳(三)
- GreenDao3.0使用.md
- Android(安卓)电话涉及到的几个类备注