当前位置:   article > 正文

ContentProvider(内容提供者)和ContentResolve(内容访问者)_内容提供者是哪个函数实习的

内容提供者是哪个函数实习的

   ContentProvder(内容提供者是安卓四大组件之一):为存储和获取数据提供统一的接口。可以在不同的应用程序之间共享数据。Android已经为常见的一些数据提供了默认的ContentProvider
1、ContentProvider使用表的形式来组织数据
无论数据的来源是什么,ContentProvider都会认为是一种表,然后把数据组织成表格
2、ContentProvider提供的方法
   query:查询
   insert:插入
   update:更新
   delete:删除
   getType:得到数据类型
   onCreate:创建数据时调用的回调函数
3、每个ContentProvider都有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。Android所提供的ContentProvider都存放在android.provider包当中


下面说下我写的
1.首先是ContentProvider(内容提供者)的主界面:

外面是用的LinearLayout布局

 <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_main_id"
        android:hint="ID:"
        />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_main_name"
        android:hint="Name:"
        />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_main_age"
        android:hint="age:"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存"
        android:onClick="save"
        />

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

2.写一个DbHelper(继承SQLiteOpenHelper)连接数据库并重新建一个表 重写3个方法:

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) {
        //操作:创建表的操作
        Log.i("test","创建表");

        sqLiteDatabase.execSQL("create table person(_id integer primary key autoincrement,name,age)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        Log.i("test","数据库版本,低--->高");
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3.写了一个类继承ContentProvider
写出ContentProvider提供的6个方法
因为我只写了一个查询数据:

 private static final int PERSONS=1;
    private static final int PERSON=2;
    @Override
    public boolean onCreate() {
        DbHelper dbHelper=new DbHelper(getContext(),"G150831.db",null,2);
        sqLiteDatabase = dbHelper.getReadableDatabase();

        //实例化URI匹配器
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        //添加匹配规则
        //      content://com.zking.g150831_android16_sqlite.data/datas代表查询所有
        //      content://com.zking.g150831_android16_sqlite.data/datas/1代表查询单个

uriMatcher.addURI("com.zking.g150831_android16_sqlite.person","persons",MyProvider.PERSONS);
        uriMatcher.addURI("com.zking.g150831_android16_sqlite.person","persons/#",MyProvider.PERSON);

        Log.i("text","onCreate");
        return false;
    }

    @Nullable
    @Override
    //查询
    public Cursor query(Uri uri, String[] strings, String s, String[] strings1, String s1) {
        //查询所有的数据
        Log.i("text","query");
         int code=uriMatcher.match(uri);
        switch (code) {
            case MyProvider.PERSONS:
                Log.i("text","query查询所有");
                return sqLiteDatabase.query(true,"person",strings,s,strings1,null,null,s1,null);
            case MyProvider.PERSON:
                Log.i("text","query查询单个");
                //获取#好的值
               long id= ContentUris.parseId(uri);
                return  sqLiteDatabase.rawQuery("select * from person where _id=?",new String[]{id+""});
        }
            return null;

那几个方法我就不写上去了
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

4.在androidMainfest.xml 清单文件中去配置这个MyProvider

  <provider 
  android:authorities="com.zking.g150831_android16_sqlite.person"
            android:name="com.zking.provider.MyProvider"
            android:exported="true"
            ></provider>
  • 1
  • 2
  • 3
  • 4
  • 5

5.在MainActivity这个类中写了一个方法:

 public void save(View view){
        String name=et_main_name.getText().toString();
        String age=et_main_age.getText().toString();

        //存到数据库
//        ContentValues values=new ContentValues();//Map
//        values.put("name",name);
//        values.put("age",age);
//        values.putNull("_id");
//        database.insert("person","name",values);

        //HQL QBC 纯(原)
        for (int i = 0; i <20 ; i++) {
        //根据你写入的数据循环20次
            database.execSQL("insert into person values(null,?,?)",new String[]{name+i,age});
        }
        Toast.makeText(MainActivity.this, "保存成功", Toast.LENGTH_SHORT).show();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

ContentResolve(内容访问者)

1.主界面:

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/et_main"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取数据"
        android:onClick="getdata"
        />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.MainActivity写了个判断EditText有没有数据在查询:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //获取内容访问者
        cr = getContentResolver();
        et_main = (EditText) findViewById(R.id.et_main);
    }
    public void getdata(View view){
       if (TextUtils.isEmpty(et_main.getText())){
           //如果查询为空就查所有
           uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons");

       }
        else {
           //否则查询单个
           String id=et_main.getText().toString();
           uri = Uri.parse("content://com.zking.g150831_android16_sqlite.person/persons/"+id);
       }
        //

        Cursor cursor= cr.query(uri,null,null,null,null);

        //单个查询
        //01.条件查询_id=3
        //02.网页查询?id=4

        //03.URI匹配器



        //SimpleCursorAdaper
        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("text","_"+id+"_"+name+"_"+age);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/245888
推荐阅读
  

闽ICP备14008679号