安卓学习日记——ContentProvider

  • Content Provider 简介

1、Content provider是用来管理对结构化数据集进行访问的一组接口。这组接口对数据进行封装,并提供了用于定义数据安全的机制。Content provider是一个进程使用另一个进程数据的标准接口。

2、Android系统本身也通过content provider来管理数据,如音频,视频,图像,个人联系信息等。我们可以在android.provider包的参考文档中看到这些provider列表。在一定条件下,这些provider能够访问任何Android应用程序。

3、provider最主要的目的是为了让其他应用程序使用provider的客户端对象访问provider。所以,provider和provider客户端共同提供了一个一致的标准数据接口用来处理进程间通信和安全的数据访问。

  • 创建一个ContentProvider

定义ContentProvider继承该类,实现相关方法
1、删除符合指定条件的记录

public int delete(Uri uri,String selection,String[] selectionArgs);

2、插入一个新的记录

public Uri insert(Uri uri,ContentValues values);

3、查询符合指定条件的记录

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

4、更新条例指定条件的记录

public int update(Uri uri,ContentValues values,String selection,String[] selectionArgs);

5、创建数据存储后端,如数据库,文件,网络接口等,这里主要进行初始化工作 public boolean onCreate();

6、基于给定URI,返回该URI表示的MIME类型

public String getType(Uri uri);

例子展示(这边更新代码ID设置的是1,由于提前操作过,所以已经把1给删了,所以更新操作没演示出效果,但可用)
在这里插入图片描述
MainActivity

import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void addClick(View v){
     ContentResolver cr=this.getContentResolver();
     //conten://com.example.contentprovider.HelloContentProvider/person
        //conten://com.example.contentprovider.HelloContentProvider/person/1
     //调用CP的添加方法
        Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person");
        ContentValues values=new ContentValues();
        values.put(PersonMetadata.Person.NAME,"ck");
        values.put(PersonMetadata.Person.AGE,6);
        cr.insert(uri,values);
    }
    public void deleteClick(View v){
        ContentResolver cr=this.getContentResolver();
        Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person/2");
        cr.delete(uri,null,null);
    }
    public void updateClick(View v){
        ContentResolver cr=this.getContentResolver();
        Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person/1");
        ContentValues values=new ContentValues();
        values.put(PersonMetadata.Person.NAME,"ck");
        values.put(PersonMetadata.Person.AGE,20);
        cr.update(uri,values,null,null);
    }
    public void queryClick(View v){
        ContentResolver cr=this.getContentResolver();
        Uri uri=Uri.parse("content://com.example.contentprovider.HelloContentProvider/person");
        Cursor c=cr.query(uri,null,null,null,null);
        while (c.moveToNext()){
            System.out.println(c.getInt(c.getColumnIndex(PersonMetadata.Person._ID)));
            System.out.println(c.getString(c.getColumnIndex(PersonMetadata.Person.NAME)));
            System.out.println(c.getInt(c.getColumnIndex(PersonMetadata.Person.AGE)));
        }
        c.close();
    }
}

HelloContentProvider

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

/**
 * 自定义ContentProvider
 */
public class HelloContentProvider extends ContentProvider {
    private static final String authority="com.example.contentprovider.HelloContentProvider";
    //创建一个URI的匹配器,
    private static UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);
    private static final int single_code=2;//返回单个记录的匹配码
    private static final int mutiple_code=1;//返回多个记录的匹配码
    //text/plain image/jpg
    private static final String SINGLE_TYPE="vnd.android.cursor.item/person";
    private static final String MUTIPLE_TYPE="vnd.android.cursor.dir/person";
    static {
//conten://com.example.contentprovider.HelloContentProvider/person
        uriMatcher.addURI(authority,"person",mutiple_code);
//conten://com.example.contentprovider.HelloContentProvider/person/1
        uriMatcher.addURI(authority,"person/#",single_code);
    }
private DatabaseAdapter.DatabaseHelper dbHelper;
    @Override
    public boolean onCreate() {
        dbHelper=new DatabaseAdapter.DatabaseHelper(getContext());
        return false;
    }


    @Override
    public Cursor query(Uri uri, String[] projection,String selection,String[] selectionArgs,String sortOrder) {
       switch (uriMatcher.match(uri)){
           case single_code:
               SQLiteDatabase db=dbHelper.getReadableDatabase();
               long id=ContentUris.parseId(uri);
               selection= PersonMetadata.Person._ID+"=?";
               selectionArgs=new String[]{String.valueOf(id)};
              return db.query(PersonMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
           case mutiple_code:
               db=dbHelper.getReadableDatabase();
               return db.query(PersonMetadata.Person.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);

       }
        return null;
    }


    @Override
    public String getType(Uri uri) {
        switch (uriMatcher.match(uri)){
            case single_code:
                return SINGLE_TYPE;
            case mutiple_code:
                return MUTIPLE_TYPE;
        }
        return null;
    }


    @Override
    public Uri insert(Uri uri,ContentValues values) {
        switch (uriMatcher.match(uri)){
            case mutiple_code:
                SQLiteDatabase db=dbHelper.getWritableDatabase();
               long id=db.insert(PersonMetadata.Person.TABLE_NAME,null,values);
                uri=ContentUris.withAppendedId(uri,id);
                db.close();
                break;

        }
        return uri;
    }

    @Override
    public int delete(Uri uri, String selection,  String[] selectionArgs) {
        switch (uriMatcher.match(uri)){
            //conten://com.example.contentprovider.HelloContentProvider/person/1
            case single_code:
                SQLiteDatabase db=dbHelper.getWritableDatabase();
                long id=ContentUris.parseId(uri);
                 selection= PersonMetadata.Person._ID+"=?";
                 selectionArgs=new String[]{String.valueOf(id)};
                int row=db.delete(PersonMetadata.Person.TABLE_NAME,selection,selectionArgs);
                db.close();
                return row;

            case mutiple_code:
                db=dbHelper.getWritableDatabase();
               row=db.delete(PersonMetadata.Person.TABLE_NAME,selection,selectionArgs);
                db.close();
                return row;
        }
        return 0;
    }

    @Override
    public int update( Uri uri, ContentValues values,  String selection, String[] selectionArgs) {
        switch (uriMatcher.match(uri)){
            //conten://com.example.contentprovider.HelloContentProvider/person/1
            case single_code:
                SQLiteDatabase db=dbHelper.getWritableDatabase();
                long id=ContentUris.parseId(uri);
                selection= PersonMetadata.Person._ID+"=?";
                selectionArgs=new String[]{String.valueOf(id)};
                int row=db.update(PersonMetadata.Person.TABLE_NAME,values,selection,selectionArgs);
                db.close();
                return row;

            case mutiple_code:
                db=dbHelper.getWritableDatabase();
                row=db.update(PersonMetadata.Person.TABLE_NAME,values,selection,selectionArgs);
                db.close();
                return row;
        }
        return 0;
    }
}

DatabaseAdapter

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;

public class DatabaseAdapter {

    private DatabaseHelper dbHelper;

    public DatabaseAdapter(Context context){
        dbHelper=new DatabaseHelper(context);
    }

    public void save(Person person){
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(PersonMetadata.Person.NAME,person.getName());
        values.put(PersonMetadata.Person.AGE,person.getAge());
        db.insert(PersonMetadata.Person.TABLE_NAME,null,values);
        db.close();
    }

    public void delete(int id){
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        db.delete(PersonMetadata.Person.TABLE_NAME, PersonMetadata.Person._ID+"=?",new String[]{String.valueOf(id)});
        db.close();
    }

    public void update(Person person){
        SQLiteDatabase db=dbHelper.getWritableDatabase();
        ContentValues values=new ContentValues();
        values.put(PersonMetadata.Person.NAME,person.getName());
        values.put(PersonMetadata.Person.AGE,person.getAge());
        String where=PersonMetadata.Person._ID+"=?";
        String[] args={String.valueOf(person.getId())};
        db.update(PersonMetadata.Person.TABLE_NAME,values,where,args);
        db.close();
    }
    public ArrayList<Person> findAll(){
        SQLiteDatabase db= dbHelper.getReadableDatabase();
        Cursor c= db.query(PersonMetadata.Person.TABLE_NAME,null,null,null,null,null,null);
        ArrayList<Person> list=new ArrayList<>();
        Person person=null;
        while (c.moveToNext()){
            person=new Person();
            person.setId(c.getInt(c.getColumnIndex(PersonMetadata.Person._ID)));
            person.setName(c.getString(c.getColumnIndex(PersonMetadata.Person.NAME)));
            person.setAge(c.getInt(c.getColumnIndex(PersonMetadata.Person.AGE)));
            list.add(person);
        }
        c.close();
        db.close();
        return list;
    }

    public Person findById(int id){
        SQLiteDatabase db= dbHelper.getReadableDatabase();
        Cursor c= db.query(PersonMetadata.Person.TABLE_NAME,null,PersonMetadata.Person._ID+"=?",new String[]{String.valueOf(id)},null,null,null);
        Person person=null;
        if (c.moveToNext()){
            person=new Person();
            person.setId(c.getInt(c.getColumnIndex(PersonMetadata.Person._ID)));
            person.setName(c.getString(c.getColumnIndex(PersonMetadata.Person.NAME)));
            person.setAge(c.getInt(c.getColumnIndex(PersonMetadata.Person.AGE)));
        }
        c.close();
        db.close();
        return person;
    }

    public static class DatabaseHelper extends SQLiteOpenHelper{
        private static final String DB_NAME="cp.db";
        private static final int VERSION=1;
        private static final String CREATE_TABLE="CREATE TABLE person(_id integer primary key autoincrement,name text,age int)";
        private static final String DROP_TABLE="DROP TABLE IF EXISTS person";
        public DatabaseHelper(Context context) {
            super(context, DB_NAME, null, VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            db.execSQL(CREATE_TABLE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_TABLE);
        db.execSQL(CREATE_TABLE);
        }
    }
}

Person

import java.lang.ref.SoftReference;

public class Person {
    private int id;
    private String name;
    private int age;

    public Person(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

PersonMetadata

import android.provider.BaseColumns;

public final class PersonMetadata {

    public static abstract class Person implements BaseColumns {
        public static final String TABLE_NAME="person";
        public static final String NAME="name";
        public static final String AGE="age";
    }
}

猜你喜欢

转载自blog.csdn.net/chen_xiaoke/article/details/89229729