内容提供者 ContentProvider

来源:互联网 发布:毛笔字 知乎 编辑:程序博客网 时间:2024/06/05 16:14

ContentProvider概念
– 内容提供者是Android中的四大组件之一;
– 为存储和获取数据提供统一的接口;
– 可以在不同的应用程序之间共享数据;

下面几段代码实现的是创建数据库DB及表account,通过ContentProvide向表中添加数据的小例子;

SQLiteOpenHelper:

public class DbHelper extends SQLiteOpenHelper{    public DbHelper(Context context)     {        super(context, "DB", null, 1);   //创建数据库“DB”;    }    @Override    public void onCreate(SQLiteDatabase db)     {        db.execSQL("create table account(id integer primary key, name text)"); //创建表account;    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)     {    }}

SQLiteDatabase:

public class DbUtil{    DbHelper dbHelper;    SQLiteDatabase db;    public DbUtil(Context context)     {        dbHelper = new DbHelper(context);    }    private void open()  //打开;    {        db = dbHelper.getWritableDatabase();    }    private void close() //关闭;    {        db.close();    }    public long insert(String table, ContentValues values)    {        open();        long code = db.insert(table, null, values);  //向表table中插入数据values;        close();        return code;    }public void query(String table)    {        open();        Cursor cursor = db.rawQuery("select * from account", null);        while(cursor.moveToNext())        {            int id = cursor.getInt(cursor.getColumnIndex("id"));            String name = cursor.getString(cursor.getColumnIndex("name"));            System.out.println("id=" + id + ",  name=" + name);        }        close();    }}

URI介绍
– 统一资源定位符,Universal Resource Identifier的简称;
–每一个ContentProvider都拥有一个公共的URI,这个URI用于表示所提供的ContentProvider的数据;
– Uri由以下三部分组成:“content://”、数据的路径、标识ID(可选);
– 每一个ContentProvider都拥有一个公共的URI,这个URI用于表示所提供的ContentProvider的数据;

UriMatcher类的介绍
– 用于操作Uri的工具类

UriMatcher类的主要方法
public void addURI (String authority, String path, int code)
注册所需的Uri
public int match (Uri uri) 与uri进行匹配

UriMatcher类的使用
– 初始化UriMatcher类
– 注册所需的Uri
– 与已经注册的Uri进行匹配

ContentProvider主要方法
boolean onCreate() ContentProvider创建后就执行
Uri insert(Uri uri, ContentValues values) 向ContentProvider添加数据
Cursor query(Uri uri, String[] projection,String selection, String[] selectionArgs, String sortOrder) 从ContentProvider查询数据
int update(Uri uri, ContentValues values,String selection, String[] selectionArgs)从ContentProvider更新数据
int delete(Uri uri, String selection, String[] selectionArgs)
从ContentProvider删除数据

ContentProvider实现过程
– 定义CONTENT_URI常量
– 定义类继承ContentProvider
– 实现onCreate、insert、query、delete、update、getType方法
– 在清单文件AndroidManifest.xml中声明

自定义ContentProvider步骤
– 创建保存数据的文件或者数据库
– 定义类继承ContentProvider,实现抽象类
– 在清单文件AndroidManifest.xml中注册ContentProvider

public class MyContentValues extends ContentProvider{    DbUtil dbUtil;    static UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); //urimatcher用于操作uri的工具类;    final static String AUTHORITY = "com.lu.contentprovider";    //清单文件中的authorities属性值;    final static int URI_ACCOUNT = 1;           //account表;    static     {        uriMatcher.addURI(AUTHORITY, "account", URI_ACCOUNT);  //注册所需的uri的code;    }    @Override    public boolean onCreate()     {        dbUtil = new DbUtil(getContext());        return false;    }    @Override    public Cursor query(Uri uri, String[] projection, String selection,            String[] selectionArgs, String sortOrder)     {               return null;    }    @Override    public String getType(Uri uri)     {        return null;    }    @Override    public Uri insert(Uri uri, ContentValues values)     {        int code = uriMatcher.match(uri);    //match,与uri进行匹配;        long l;        switch(code)        {        case URI_ACCOUNT:            l = dbUtil.insert("account", values);            dbUtil.query("account");  //查询插入结果后的account表;            break;        }        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs)     {               return 0;    }    @Override    public int update(Uri uri, ContentValues values, String selection,            String[] selectionArgs)     {        return 0;    }}

添加系统ContentProvider内容步骤
– 通过getContentResolver获取ContentResolver对象
– 获取ContentResolver的URI标识
– 将添加的内容封装到ContentValues中
– 通ContentResolver对象调用insert方法执行添加操作

查询系统ContentProvider内容步骤
– 通过getContentResolver获取ContentResolver对象
– 获取ContentResolver的URI标识
– 列出想要查询的列
– ContentResolver对象调用query方法执行查询

public class MainActivity extends Activity implements OnClickListener{    Button user, customer;    ContentResolver resolver;    final static String CONTENT_URI = "content://com.lu.contentprovider/";    String path = "data/data/com.lu.contentprovider/database/DB";    @Override    protected void onCreate(Bundle savedInstanceState)     {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init()     {        user = (Button)findViewById(R.id.button1);        customer = (Button)findViewById(R.id.button2);        user.setOnClickListener(this);        customer.setOnClickListener(this);        resolver = getContentResolver();    }    @Override    public void onClick(View v)     {        switch(v.getId())        {        case R.id.button1:            ContentValues values = new ContentValues();            values.put("name", "account");            resolver.insert(Uri.parse(CONTENT_URI + "account"), values);            break;        }    }}

在清单文件中注册:

<provider android:name="com.lu.contentprovider.MyContentValues"         android:authorities="com.lu.contentprovider"         android:exported="true" //true时,其它程序通过此扩展访问> </provider>
0 0
原创粉丝点击