剛好接觸到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); }新聞熱點
疑難解答