Android ContentProvider实现两个程序间数据共享demo,跨进程通讯
生活随笔
收集整理的這篇文章主要介紹了
Android ContentProvider实现两个程序间数据共享demo,跨进程通讯
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、客戶端代碼:
先實現服務端
SQL創建:
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);}@Overridepublic 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)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {} } ContentProvider類代碼:?
public class MyProvider extends ContentProvider {private Context mContext;DBHelper mDbHelper = null;SQLiteDatabase db = null;public static final String AUTOHORITY = "scut.carson_ho.myprovider";// 設置ContentProvider的唯一標識public static final int User_Code = 1;public static final int Job_Code = 2;// UriMatcher類使用:在ContentProvider 中注冊URIprivate static final UriMatcher mMatcher;static{mMatcher = new UriMatcher(UriMatcher.NO_MATCH);// 初始化mMatcher.addURI(AUTOHORITY,"user", User_Code);mMatcher.addURI(AUTOHORITY, "job", Job_Code);// 若URI資源路徑 = content://cn.scu.myprovider/user ,則返回注冊碼User_Code// 若URI資源路徑 = content://cn.scu.myprovider/job ,則返回注冊碼Job_Code}// 以下是ContentProvider的6個方法/*** 初始化ContentProvider*/@Overridepublic 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;}/*** 添加數據*/@Overridepublic 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;}/*** 查詢數據*/@Overridepublic 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);}/*** 更新數據*/@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// 由于不展示,此處不作展開return 0;}/*** 刪除數據*/@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// 由于不展示,此處不作展開return 0;}@Overridepublic 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;}}服務端源碼:https://download.csdn.net/download/meixi_android/10698025
?
?
?
客戶端通過uri鏈接到服務端:
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*** 對user表進行操作*/// 設置URIUri uri_user = Uri.parse("content://scut.carson_ho.myprovider/user"); // Uri uri_user = Uri.parse("content://cn.scu.myprovider/user");// 插入表中數據ContentValues values = new ContentValues();values.put("_id", 4);values.put("name", "Jordan");// 獲取ContentResolverContentResolver 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("query11111 book:" + cursor.getInt(0) +" "+ cursor.getString(1));// 將表中數據全部輸出}cursor.close();// 關閉游標/*** 對job表進行操作*/// 和上述類似,只是URI需要更改,從而匹配不同的URI CODE,從而找到不同的數據資源Uri uri_job = Uri.parse("content://scut.carson_ho.myprovider/job"); // Uri uri_job = Uri.parse("content://cn.scu.myprovider/job");// 插入表中數據ContentValues values2 = new ContentValues();values2.put("_id", 4);values2.put("job", "NBA Player");// 獲取ContentResolverContentResolver 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("query11111 job:" + cursor2.getInt(0) +" "+ cursor2.getString(1));// 將表中數據全部輸出}cursor2.close();// 關閉游標} }客戶端源碼:https://download.csdn.net/download/meixi_android/10698034
BroadcastReceiver實現跨進程通訊:https://blog.csdn.net/meixi_android/article/details/83615930
總結
以上是生活随笔為你收集整理的Android ContentProvider实现两个程序间数据共享demo,跨进程通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vite:15个插件推荐
- 下一篇: YII2 随笔 视图最佳实践