创建内容提供者

如果要使用内容提供者就要继承ContentProvider,并且重写了onCreate(),insert(),query(),updata(),delete(),getType()方法,

onCreate()完成对数据库的创建和升级,返回true表示成功,

query():使用uri参数来确定查询那个表,projection 那一列,selection和selectionArgs 参数用于约束那些行,sortOrder对结果进行排序,返回值放到Cursor对象中返回

public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder)

 getType()方法根据传入内容 的URI来返回相应的MIME类型。如果是单条数据,那么我们的MIME类型应该以vnd.android.cursor.item开头,如果是多条数据,我们的MIME类型的数据应该以vnd.android.cursor.dir开头。

    public String getType(Uri uri) {
      switch (uriMatcher.match(uri)){
          case BOOK_DIR://查询多行
              return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Book";
          case BOOK_ITEM://查询单行
              return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Book";
          case CATEGORY_DIR:
              return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Category";
          case CATEGORY_ITEM:
              return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Category";
      }
       return null;
    }

 创建内容提供者,创建一个类继承ContentProvider

在定义两个常量,分别表示执行单行还是多行。

接下来在静态代码块中创建UriMatcher实例,并且调用addURI()方法,将我们期望的值传进来。UriMatcher主要用在ContentProvider中,用来判断Uri的正确性,如在insert之前先判断用户传进来的Uri是否与UriMatcher定义的匹配。

    public static final int BOOK_DIR=0;
    public static final int BOOK_ITEM = 1;

    public static final String AUTHORITY ="com.example.a13522.provider";
    private static UriMatcher uriMatcher;
    private MyDatabaseHelper dbHelper;
    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);//NO_MATCH是Uri不匹配时返回的code
        uriMatcher.addURI(AUTHORITY,"Book",BOOK_DIR);
        uriMatcher.addURI(AUTHORITY,"Book/#",BOOK_ITEM);

    

 在onCreate()方法中创建数据库

  public boolean onCreate() {
        dbHelper = new MyDatabaseHelper(getContext(),"BookStore.db",null,2);
        return false;
    }

 在query()方法中进行查询

首先用SQLiteDatabase 调用我们创建的MyDatabaseHelper类获取getReadeableDatabase()方法读取数据库

然后创建Cursor实例将得到的数据保存到Cursor中

 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, "price=?", new String[]{bookId}, null, null, sortOrder);
                break;
            default:
                break;
        }
         return cursor;
    }

 insert()插入信息

首先添加数据库,通过数据库向表中插入数据,并且得到插入的uri

public Uri insert(Uri uri, ContentValues values) {
       SQLiteDatabase db = dbHelper.getReadableDatabase();
        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;
default:break; } return uriReturn; }

 updata()更新数据

1.添加数据库,利用数据库掉用更新的方法,并且获取它受影响的行数

public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        int update = 0;//更新行数
        switch (uriMatcher.match(uri)){
            case BOOK_DIR:
                update = db.update("Book",values,selection,selectionArgs);
                break;
            case BOOK_ITEM:
               String bookId= uri.getPathSegments().get(1);
                update = db.update("Book",values,"price=?",new String[]{bookId});
                break;
        }
        return update;
    }

 delete()删除数据库

1.添加数据库,利用数据库调用删除方法,并且返回受影响的行数

    public int delete(Uri uri, String selection, String[] selectionArgs) {
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        int delectData = 0;
        switch (uriMatcher.match(uri)){
            case BOOK_DIR:
               delectData= db.delete("Book",selection,selectionArgs);
                break;
            case BOOK_ITEM:
               String bookId= uri.getPathSegments().get(1);
                db.delete("Book","price=?",new String[]{bookId});
                break;
      
            default:break;

        }

 最后添加getType()方法

    public String getType(Uri uri) {
      switch (uriMatcher.match(uri)){
          case BOOK_DIR:
              return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Book";
          case BOOK_ITEM:
              return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Book";
          case CATEGORY_DIR:
              return "vnd.android.cursor.dir/vnd.com.example.a13522.provider.Category";
          case CATEGORY_ITEM:
              return "vnd.android.cursor.item/vnd.com.example.a13522.provider.Category";
      }
       return null;
原文地址:https://www.cnblogs.com/lyl123/p/7183403.html