首页 > 学院 > 开发设计 > 正文

ContentProvider内容提供者与ContentResolver内容访问者

2019-11-08 18:47:36
字体:
来源:转载
供稿:网友

刚好接触到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); }
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表