按照网上的方法做了一个ContenProvider的小例子,代码如下:
服务端
ContentProvider
public class CourseContentProvider extends ContentProvider { private DatabaseHelper mSqliteHelper; private SQLiteDatabase mDatabase; private UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); private final String AUTHORITIES = "com.test"; private final String COURSE_PATH = "heihei"; private final Uri BASE_URI = Uri.parse("content://" + AUTHORITIES); private final Uri COURSE_URI = Uri.withAppendedPath(BASE_URI, COURSE_PATH); private static final int PROVIDE_COURSE = 1; @Override public boolean onCreate() { mSqliteHelper = new DatabaseHelper(getContext(),DatabaseHelper.USERTABLE); mDatabase = mSqliteHelper.getWritableDatabase(); mUriMatcher.addURI(AUTHORITIES, COURSE_PATH, PROVIDE_COURSE); return true; } @Nullable @Override public Cursor query(@NonNull Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //这里是原封不动的粘贴过来,其实判断一下path就行。 switch (mUriMatcher.match(uri)) { case PROVIDE_COURSE: return mDatabase.query(DatabaseHelper.USERTABLE, projection, selection, selectionArgs, null, null, sortOrder); default: break; } return null; } @Nullable @Override public String getType(@NonNull Uri uri) { return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, ContentValues values) { Uri result = null; switch (mUriMatcher.match(uri)) { case PROVIDE_COURSE: long rowId = mDatabase.insert( DatabaseHelper.USERTABLE, null, values); result = ContentUris.withAppendedId(uri, rowId); break; default: break; } return result; } @Override public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) { switch (mUriMatcher.match(uri)) { case PROVIDE_COURSE: return mDatabase.delete(DatabaseHelper.USERTABLE, selection, selectionArgs); default: break; } return 0; } @Override public int update(@NonNull Uri uri, ContentValues values, String selection, String[] selectionArgs) { switch (mUriMatcher.match(uri)) { case PROVIDE_COURSE: return mDatabase.update(DatabaseHelper.USERTABLE, values, selection, selectionArgs); default: break; } return 0; }
DataBaseHelper
public class DatabaseHelper extends SQLiteOpenHelper { public static final String USERTABLE = "user"; public DatabaseHelper(Context context, String name) { super(context, name, null, 6); } @Override public void onCreate(SQLiteDatabase db) { // 创建存储用户的表 db.execSQL("create table " + USERTABLE + "(id integer primary key autoincrement," + "userId varchar(20)," + "username varchar(20));"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
清单文件
<permission android:name="com.straw.providerhost.course.read" android:protectionLevel="normal"/> <permission android:name="com.straw.providerhost.course.write" android:protectionLevel="normal"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 指定 authorieties(类似包名的格式,如 com.xx.xx),访问者通过 content://authorities/path 的形式访问 这个 Provider 对应的 Java 类名 为 true 则表示导出。不设置或设置为 false 时,其他应用如果使用这个 Provider,则会出现 java.lang.SecurityException: Permission Denial 错误 readPermission读数据者所需声明权限,数据访问者不声明权限则会出现 java.lang.SecurityException: Permission Denial 错误 writePermission写数据者所需声明权限,数据访问者不声明权限则会出现 java.lang.SecurityException: Permission Denial 错误 --> <provider android:authorities="com.test" android:name=".CourseContentProvider" android:exported="true" android:readPermission="com.straw.providerhost.course.read" android:writePermission="com.straw.providerhost.course.write" /> </application>
访问端代码
访问
//地址 private final Uri BASE_URI = Uri.parse("content://com.test"); //uri private final Uri COURSE_URI = Uri.withAppendedPath(BASE_URI, "heihei"); private static int userId = 3; public void insert(View view) { ContentResolver contentResolver = getContentResolver(); ContentValues cv = new ContentValues(); cv.put("userId", userId++ + ""); cv.put("username", "aaa" + userId + "bbb"); contentResolver.insert(COURSE_URI, cv); Cursor cursor = contentResolver.query(COURSE_URI, null, null, null, null); if (cursor == null) { return; } while (cursor.moveToNext()) { int id = cursor.getInt(cursor.getColumnIndex("id")); String userId = cursor.getString(cursor.getColumnIndex("userId")); String username = cursor.getString(cursor.getColumnIndex("username")); LogUtils.i(id + "\t" + userId + "\t" + username); } cursor.close(); }
清单文件 (加上权限即可)
<uses-permission android:name="com.straw.providerhost.course.read"/> <uses-permission android:name="com.straw.providerhost.course.write"/>
注意事项:
1、服务端和访问端都需要权限。
2、BASE_URI两端要匹配,COURSE_URI只是判断用,不影响连通性