刚好接触到ContentProvider内容提供者与ContentResolver内容访问者,对它进行了一个初步的了解,它主要用于不同的应用程序之间实现数据的共享,允许一个程序访问另一个程序,还可以保证数据的安全。
以下是我写的一个简单的ContentProvider与ContentResolver的一个列子(没有用系统内容提供者):
首先创建两个项目分别为android16_sqlite和android24_contentprovider。android16_sqlite为内容提供者,android24_contentprovider为内容访问者。
在android16_sqlite创建DBHelper
public class DBHelper extends SQLiteOpenHelper {
/**
*
* @param context 上下文
* @param name 名字(数据库名),文件名
* @param factory 游标工厂,多数情况:null
* @param version 数据库版本
*/
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
Log.i("test","构造");
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//操作:创建表的操作
sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,name,age)");
Log.i("test","创建表");
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.i("test","数据库版本,低--->高");
}
}
在android16_sqlite中创建类MyProvider继承ContentProvider实现六个方法
public class MyProvider extends ContentProvider {
private SQLiteDatabase database;
@Override
public boolean onCreate() {
DBHelper dbHelper=new DBHelper(getContext(),"G150831.db",null,2);
database = dbHelper.getReadableDatabase();
/*保存到数据库中
ContentValues values=new ContentValues();//Map
values.put("name","longdan");
values.put("age",19);
values.putNull("_id");
database.insert("person","name",values);
Toast.makeText(this, " 增加成功"+values, Toast.LENGTH_SHORT).show();*/
Log.i("test","onCreate");
return false;
}
@Nullable
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
//查询所有的数据
Log.i("test","query");
return database.query(true,"person",projection,selection,selectionArgs,null,null,sortOrder,null);
}
@Nullable
@Override
public String getType(Uri uri) {
Log.i("test","getType");
return null;
}
@Nullable
@Override
public Uri insert(Uri uri, ContentValues values) {
Log.i("test","insert");
return null;
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
Log.i("test","delete");
return 0;
}
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
Log.i("test","update");
return 0;
}
}
在android16_sqlite清单文件AndroidManifest.xml中配置
<!--配置内容提供者-->
<provider
android:authorities="com.example.android16_sqlite.person"
android:name="com.example.myprovider.MyProvider"
android:exported="true"
></provider>
在android24_contentprovider 中通过
ContentResolver contentResolver= getContentResolver();
实例化对象ContentResolver通过ContentResolver实现
以下是实现的基础的查询:
//uri中的值在需要满足content://协议后面的为你在内容提供者配置文件AndroidManifest.xml中
authorities定义的名字
Uri uri=Uri.parse("content://com.example.android16_sqlite.person");
Cursor cursor=contentResolver.query(uri,null,null,null,null);
while (cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("_id"));
String name=cursor.getString(cursor.getColumnIndex("name"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
Log.i("test",id+" "+name+" "+age);
}