本博客内容
- 简介ContentProvider所需要用到的技术的个人理解
- 示例:B应用取A应用的数据,然后将数据显示在B应用的控制台
更多参考:
第一部分 个人理解
ContentProvider
作用 ,实现对A应用的数据库的操作
ContentResolver
是 A应用 和 B应用 之间的沟通桥梁
UriMatcher类
通过这个来找到对应的操作对象(表)
ContentUris类(作用就是加id,具体干嘛,暂时不晓得)
操作Uri字符串的工具类,主要是拼接Uri字符串用
例如:
Uri uri = Uri.parse("content://com.lzb.provide.myContentProvide:200/students");
Uri newUri = ContentUris.withAppendedId(uri,2);
// newUri = content://com.lzb.provide.myContentProvide:200/students/2。
long id = ContentUris.parseId(newUri); //用于从指定的Uri中解析出所包含的id
// 解析出来的ID为2
第二部分实践操作
A 应用内:
AndroidManifest.xml
<provider
android:name=".NoteBookProvider"
android:authorities="com.example.tnt.contentproviderdemo.NoteBookProvider"
android:enabled="true"
android:exported="true"></provider>
DBOpenHelper.java (创建数据库,以及表)
package com.example.tnt.contentproviderdemo;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBOpenHelper extends SQLiteOpenHelper {
//数据库名
private static final String DATA_BASE_NAME = "note.db";
//数据库版本号
private static final int DATE_BASE_VERSION = 1;
public DBOpenHelper(Context context) {
super(context, DATA_BASE_NAME, null, DATE_BASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 初始化表信息 无主键 只有 标题,日期
String createTableNoteBookSQL = "create table "+NoteBook.NB_tableName+" ("+NoteBook.NB_title+" text ,"+NoteBook.NB_date+" text)";
db.execSQL(createTableNoteBookSQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
NoteBook.java (表的信息)
package com.example.tnt.contentproviderdemo;
public class NoteBook {
// 表 NOTEBOOK_TABLE_NAME 的信息
public static String NB_tableName = "NOTEBOOK_TABLE_NAME";
public static String NB_title = "NOTEBOOK_TITLE";
public static String NB_date = "NOTEBOOK_DATE";
}
NoteBookProvider.java (处理A数据库内容)
package com.example.tnt.contentproviderdemo;
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;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
public class NoteBookProvider extends ContentProvider {
private Context context;
private SQLiteDatabase sqLiteDatabase;
public static final String AUTHORITY = "com.example.tnt.contentproviderdemo.NoteBookProvider";
public static final int NOTEBOOK_URI_CODE = 0;
private static final UriMatcher URI_MATCHER = new UriMatcher(UriMatcher.NO_MATCH);
// 初始注册 uri
static {
URI_MATCHER.addURI(AUTHORITY, NoteBook.NB_tableName, NOTEBOOK_URI_CODE);
}
// 确定操作哪个表
private String getTableName(Uri uri) {
String tableName = null;
switch (URI_MATCHER.match(uri)) {
case NOTEBOOK_URI_CODE:
tableName = NoteBook.NB_tableName;
break;
}
return tableName;
}
public NoteBookProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
String tableName = getTableName(uri);
if (tableName == null) {
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
int count = sqLiteDatabase.delete(tableName, selection, selectionArgs);
if (count > 0) {
context.getContentResolver().notifyChange(uri, null);
}
return count;
}
@Override
public String getType(Uri uri) {
// TODO: Implement this to handle requests for the MIME type of the data
// at the given URI.
throw new UnsupportedOperationException("Not yet implemented");
}
@Override
public Uri insert(Uri uri, ContentValues values) {
String tableName = getTableName(uri);
if (tableName == null) {
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
//执行自己的插入操作代码块
sqLiteDatabase.insert(tableName,null,values);
context.getContentResolver().notifyChange(uri,null);
return uri;
}
@Override
public boolean onCreate() {
// TODO: Implement this to initialize your content provider on startup.
context = getContext();
initProviderData();
return false;
}
// 初始内容数据
private void initProviderData() {
sqLiteDatabase = new DBOpenHelper(context).getWritableDatabase();
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
String tableName = getTableName(uri);
if (tableName == null) {
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
return sqLiteDatabase.query(tableName, projection, selection, selectionArgs, null, null, sortOrder, null);
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
String tableName = getTableName(uri);
if (tableName == null) {
throw new IllegalArgumentException("Unsupported URI:" + uri);
}
int row = sqLiteDatabase.update(tableName, values, selection, selectionArgs);
if (row > 0) {
context.getContentResolver().notifyChange(uri, null);
}
return row;
}
}
MainActivity.java (插入操作和查询操作)
package com.example.tnt.contentproviderdemo;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity";
public static final String AUTHORITY = "com.example.tnt.contentproviderdemo.NoteBookProvider";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri noteBookUri = Uri.parse("content://"+AUTHORITY+"/"+NoteBook.NB_tableName);
//
ContentValues contentValues = new ContentValues();
contentValues.put(NoteBook.NB_title,"特朗普连任");
contentValues.put(NoteBook.NB_date,"20220401");
//
//// 调用中间者 携带 数据过去
getContentResolver().insert(noteBookUri,contentValues);
//
// 调用中间者 查询 数据
Cursor noteBookCursor = getContentResolver().query(noteBookUri,new String[]{NoteBook.NB_title,NoteBook.NB_date},null,null,null);
if(noteBookCursor!=null)
{
while(noteBookCursor.moveToNext())
{
Log.e(TAG,"信息如下:"+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_title))+" "+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_date)));
}
noteBookCursor.close();
}
}
}
B应用
NoteBook.java(表的信息)
package com.example.getappdata;
public class NoteBook {
// 表 NOTEBOOK_TABLE_NAME 的信息
public static String NB_tableName = "NOTEBOOK_TABLE_NAME";
public static String NB_title = "NOTEBOOK_TITLE";
public static String NB_date = "NOTEBOOK_DATE";
}
MainActivity.java
package com.example.getappdata;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private final String TAG = "MainActivity";
public static final String AUTHORITY = "com.example.tnt.contentproviderdemo.NoteBookProvider";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Uri noteBookUri = Uri.parse("content://"+AUTHORITY+"/"+NoteBook.NB_tableName);
// 调用中间者 查询 数据
Cursor noteBookCursor = getContentResolver().query(noteBookUri,new String[]{NoteBook.NB_title,NoteBook.NB_date},null,null,null);
if(noteBookCursor!=null)
{
while(noteBookCursor.moveToNext())
{
Log.e(TAG,"信息如下:"+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_title))+" "+noteBookCursor.getString(noteBookCursor.getColumnIndex(NoteBook.NB_date)));
}
noteBookCursor.close();
}
}
}
B控制台输出: