1. 程式人生 > >四大元件之一ContentProvider

四大元件之一ContentProvider

內容提供者:提供資料給別的程式的訪問介面 內容解析者:通過內容提供器來讀取或操作對應程式的資料

內容提供者步驟: 新建一個類繼承ContentProvider建立一個內容提供器,實現他裡面的方法 或者在包下面new–Other–Content Provider建立

建立一個靜態程式碼塊,建立UriMatcher路徑匹配器, 並呼叫addURI()方法去新增匹配規則 一個完整的uri是 content://com.example.aap.provider/query uri是由authority和path組成的 第三個引數是一個匹配碼

 static {
        //建立UriMatcher路徑匹配器
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        
        //呼叫addURI()方法去新增匹配規則
        uriMatcher.addURI("com.example.mycontent.provider", "query", QUERYTABLE);
        uriMatcher.addURI("com.example.mycontent.provider", "insert", INSERTTABLE);
        uriMatcher.addURI("com.example.mycontent.provider", "delete", DELETETABLE);
        uriMatcher.addURI("com.example.mycontent.provider", "update", UPDATETABLE);
    }

初始化內容提供器,在這個方法對資料庫的建立和升級的呼叫

    //
    @Override
    public boolean onCreate() {
        myDatabase = new MyDatabase(getContext());
        db = myDatabase.getReadableDatabase();
        return true;
    }

由於是提供資料給別的程式的訪問介面使用,所以直接返回

新增資料


    @Override
    public Uri insert(Uri uri, ContentValues values) {
        int code = uriMatcher.match(uri);
        //判斷傳過來的uri是否與匹配碼對應
        if (code == INSERTTABLE) {
            long insert = db.insert("meno", null, values);
            Uri uri1 = Uri.parse(String.valueOf(insert));
            
            //返回值代表新新增資料的id
            return uri1;
        } else {
            throw new UnsupportedOperationException("路徑不匹配");
        }
    }

更新資料

   @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        int code = uriMatcher.match(uri);
        if (code == UPDATETABLE) {
            int update = db.update("meno", values, selection, selectionArgs);
            //返回值代表影響的行數
            return update;
        }
        throw new UnsupportedOperationException("路徑不匹配");
    }

刪除資料

   @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        int code = uriMatcher.match(uri);
        if (code == DELETETABLE) {
            int delete = db.delete("meno", selection, selectionArgs);
            //返回值代表被刪除的行數
            return delete;
        }
        throw new UnsupportedOperationException("路徑不匹配");
    }

查詢資料

  @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        int code = uriMatcher.match(uri);
        if (code == QUERYTABLE) {
            //路徑匹配成功
            Cursor cursor = db.query("meno", projection, selection, selectionArgs, null, null, sortOrder);
            return cursor;
        } else {
            throw new UnsupportedOperationException("路徑不匹配");
        }
    }

內容解析者

內容解析者新增

 Uri uri1 = Uri.parse("content://com.example.mycontent.provider/insert");
 ContentValues values = new ContentValues();
 values.put("name","狐狸");
 values.put("age",21);
 Uri insert = getContentResolver().insert(uri1, values);
 Toast.makeText(this,"添加了"+insert+"行",Toast.LENGTH_SHORT).show();

內容解析者更新

 Uri uri2 = Uri.parse("content://com.example.mycontent.provider/update");
 ContentValues values1 = new ContentValues();
 values1.put("name","熊貓");
 int update = getContentResolver().update(uri2, values1, "name=?", new String[]{"狐狸"});
 Toast.makeText(this,"更新了"+update+"行",Toast.LENGTH_SHORT).show();

內容解析者刪除

 Uri uri3 = Uri.parse("content://com.example.mycontent.provider/delete");
 int delete = getContentResolver().delete(uri3,null,null);
 Toast.makeText(this,"刪除了"+delete+"行",Toast.LENGTH_SHORT).show();

內容解析者查詢

Uri uri4 = Uri.parse("content://com.example.mycontent.provider/query");
                Cursor cursor = getContentResolver().query(uri4, null, null, null, null);
                if (cursor != null && cursor.getCount() > 0) {
                    while (cursor.moveToNext()) {
                        String name = cursor.getString(1);
                        int age = cursor.getInt(2);
                        Toast.makeText(this,name+age,Toast.LENGTH_SHORT).show();
                    }
                }