zoukankan      html  css  js  c++  java
  • 创建内容提供者

    如果要使用内容提供者就要继承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;
    
  • 相关阅读:
    HDU 5120 A Curious Matt(2014北京赛区现场赛A题 简单模拟)
    HDU 5122 K.Bro Sorting(2014北京区域赛现场赛K题 模拟)
    HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)
    HDU 4793 Collision(2013长沙区域赛现场赛C题)
    HDU 4791 Alice's Print Service(2013长沙区域赛现场赛A题)
    HDU 4803 Poor Warehouse Keeper
    HDU HDU1558 Segment set(并查集+判断线段相交)
    HDU 1086You can Solve a Geometry Problem too(判断两条选段是否有交点)
    HDU 1392 Surround the Trees(凸包*计算几何)
    HDU 1174 爆头(计算几何)
  • 原文地址:https://www.cnblogs.com/lyl123/p/7183403.html
Copyright © 2011-2022 走看看