美文网首页
第七章--内容提供器

第七章--内容提供器

作者: dong_hui | 来源:发表于2017-03-15 00:45 被阅读11次

    1.内容提供器简介

    • Content Provider是用于不同应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时保证数据的安全性。

    2.权限处理

    • android6.0以后对一些危险权限需要请求用户允许,弹出授权对话框之类的
       if (ContextCompat.checkSelfPermission(LoginActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= 
                    PackageManager.PERMISSION_GRANTED){
                    ActivityCompat.requestPermissions(LoginActivity.this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            }
    
    
      @Override
        public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
            switch (requestCode){
                case 1:
                    Toast.makeText(LoginActivity.this,"premission  failure",Toast.LENGTH_SHORT).show();
                    break;
            }
        }
    

    3. 读取系统联系人

    • 注意添加权限
        private void readContacts() {
            Cursor  cursor=null;
            try {
                cursor=getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
                if (cursor!=null){
                    while (cursor.moveToNext()){
                        String  name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                        String  phonenumber=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        
                        //listdatas.add(name"/n"+phonenumber);
                    }
                    //adapter.notifyDataSetChanged();
                }
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                   if (cursor!=null){
                       cursor.close();
                   }
            }
            
        }
    

    4.创建自己的内容提供器实现跨程序数据共享

    • provider 在清单文件中注册
    public class DatabaseProvider extends ContentProvider {
    
        public static final int BOOK_DIR = 0;
    
        public static final int BOOK_ITEM = 1;
    
        public static final int CATEGORY_DIR = 2;
    
        public static final int CATEGORY_ITEM = 3;
    
        public static final String AUTHORITY = "com.example.databasetest.provider";
    
        private static UriMatcher uriMatcher;
    
        private MyDatabaseHelper dbHelper;
    
        static {
            uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
            uriMatcher.addURI(AUTHORITY, "book", BOOK_DIR);
            uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM);
            uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR);
            uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM);
        }
    
        @Override
        public boolean onCreate() {
            dbHelper = new MyDatabaseHelper(getContext(), "BookStore.db", null, 2);
            return true;
        }
    
        @Override
        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
            // 查询数据
            SQLiteDatabase db = dbHelper.getReadableDatabase();
            Cursor cursor = null;
            switch (uriMatcher.match(uri)) {
                case BOOK_DIR:
                    cursor = db.query("Book", projection, selection, selectionArgs, null, null, sortOrder);
                    break;
                case BOOK_ITEM:
                    String bookId = uri.getPathSegments().get(1);
                    cursor = db.query("Book", projection, "id = ?", new String[] { bookId }, null, null, sortOrder);
                    break;
                case CATEGORY_DIR:
                    cursor = db.query("Category", projection, selection, selectionArgs, null, null, sortOrder);
                    break;
                case CATEGORY_ITEM:
                    String categoryId = uri.getPathSegments().get(1);
                    cursor = db.query("Category", projection, "id = ?", new String[] { categoryId }, null, null, sortOrder);
                    break;
                default:
                    break;
            }
            return cursor;
        }
    
        @Override
        public Uri insert(Uri uri, ContentValues values) {
            // 添加数据
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            Uri uriReturn = null;
            switch (uriMatcher.match(uri)) {
                case BOOK_DIR:
                case BOOK_ITEM:
                    long newBookId = db.insert("Book", null, values);
                    uriReturn = Uri.parse("content://" + AUTHORITY + "/book/" + newBookId);
                    break;
                case CATEGORY_DIR:
                case CATEGORY_ITEM:
                    long newCategoryId = db.insert("Category", null, values);
                    uriReturn = Uri.parse("content://" + AUTHORITY + "/category/" + newCategoryId);
                    break;
                default:
                    break;
            }
            return uriReturn;
        }
    
        @Override
        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
            // 更新数据
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            int updatedRows = 0;
            switch (uriMatcher.match(uri)) {
                case BOOK_DIR:
                    updatedRows = db.update("Book", values, selection, selectionArgs);
                    break;
                case BOOK_ITEM:
                    String bookId = uri.getPathSegments().get(1);
                    updatedRows = db.update("Book", values, "id = ?", new String[] { bookId });
                    break;
                case CATEGORY_DIR:
                    updatedRows = db.update("Category", values, selection, selectionArgs);
                    break;
                case CATEGORY_ITEM:
                    String categoryId = uri.getPathSegments().get(1);
                    updatedRows = db.update("Category", values, "id = ?", new String[] { categoryId });
                    break;
                default:
                    break;
            }
            return updatedRows;
        }
    
        @Override
        public int delete(Uri uri, String selection, String[] selectionArgs) {
            // 删除数据
            SQLiteDatabase db = dbHelper.getWritableDatabase();
            int deletedRows = 0;
            switch (uriMatcher.match(uri)) {
                case BOOK_DIR:
                    deletedRows = db.delete("Book", selection, selectionArgs);
                    break;
                case BOOK_ITEM:
                    String bookId = uri.getPathSegments().get(1);
                    deletedRows = db.delete("Book", "id = ?", new String[] { bookId });
                    break;
                case CATEGORY_DIR:
                    deletedRows = db.delete("Category", selection, selectionArgs);
                    break;
                case CATEGORY_ITEM:
                    String categoryId = uri.getPathSegments().get(1);
                    deletedRows = db.delete("Category", "id = ?", new String[] { categoryId });
                    break;
                default:
                    break;
            }
            return deletedRows;
        }
    
        @Override
        public String getType(Uri uri) {
            switch (uriMatcher.match(uri)) {
                case BOOK_DIR:
                    return "vnd.android.cursor.dir/vnd.com.example.databasetest. provider.book";
                case BOOK_ITEM:
                    return "vnd.android.cursor.item/vnd.com.example.databasetest. provider.book";
                case CATEGORY_DIR:
                    return "vnd.android.cursor.dir/vnd.com.example.databasetest. provider.category";
                case CATEGORY_ITEM:
                    return "vnd.android.cursor.item/vnd.com.example.databasetest. provider.category";
            }
            return null;
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:第七章--内容提供器

          本文链接:https://www.haomeiwen.com/subject/ndbknttx.html