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