• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

ContentProvider数据库共享之实例讲解

mysql 搞代码 4年前 (2022-01-09) 28次浏览 已收录 0个评论

前言:现在这段时间没这么忙了,要抓紧时间把要总结的知识沉淀下来,今年重新分了项目组,在新项目中应该不会那么忙了,看来有时间来学一些自己的东西了。现在而言,我需要的是时间。只要不断的努力,总有一天,你会与从不同。加油。 1、《ContentProvider数

前言:现在这段时间没这么忙了,要抓紧时间把要总结的知识沉淀下来,今年重新分了项目组,在新项目中应该不会那么忙了,看来有时间来学一些自己的东西了。现在而言,我需要的是时间。只要不断的努力,总有一天,你会与从不同。加油。

1、《ContentProvider数据库共享之——概述》
2、《ContentProvider数据库共享之——实例讲解》
3、《ContentProvider数据库共享之——MIME类型与getType()》
4、《ContentProvider数据库共享之——读写权限与数据监听》

在上篇文章中,已经给大家初步讲解了有关ContentProvder的整体流程及设计方式,在这篇文章中将通过实例来讲述ContentProvider的操作过程;

一、ContentProvider提供数据库查询接口

在上篇中,我们提到过,两个应用间是通过Content URI来媒介传递消息的,我们的应用在收到URI以后,通过匹配完成对应的数据库操作功能。听的有点迷糊?没关系,下面会细讲,我这里要说的是,匹配成功后要完成的数据库操作!!!那好,我们的第一步:建数据库,数据表

1、利用SQLiteOpenHelper创建数据库、数据表

在这里,我们在一个数据库(“harvic.db”)中创建两个数据表”first”与”second”;每个表都有多出一个字段“table_name”,来保存当前数据表的名称
代码如下:

public class DatabaseHelper extends SQLiteOpenHelper {    public static final String DATABASE_NAME = "harvic.db";    public static final int DATABASE_VERSION = 1;    public static final String TABLE_FIRST_NAME = "first";    public static final String TABLE_SECOND_NAME = "second";    public static final String SQL_CREATE_TABLE_FIRST = "CREATE TABLE " +TABLE_FIRST_NAME +"("            + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"            + "table_name" +" VARCHAR(50) default 'first',"            + "name" + " VARCHAR(50),"            + "detail" + " TEXT"            + ");" ;    public static final String SQL_CREATE_TABLE_SECOND = "CREATE TABLE "+TABLE_SECOND_NAME+" ("            + BaseColumns._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"            + "table_name" +" VARCHAR(50) default 'second',"            + "name" + " VARCHAR(50),"            + "detail" + " TEXT"            + ");" ;    public DatabaseHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }    @Override    public void onCreate(SQLiteDatabase db) {        Log.e("harvic", "create table: " + SQL_CREATE_TABLE_FIRST);        db.execSQL(SQL_CREATE_TABLE_FIRST);        db.execSQL(SQL_CREATE_TABLE_SECOND);    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        db.execSQL("DROP TABLE IF EXISTS first");        db.execSQL("DROP TABLE IF EXISTS second");        onCreate(db);    }}

2、利用ContentProvider提供数据库操作接口

新建一个类PeopleContentProvider,派生自ContentProvider基类,写好之后,就会自动生成query(),insert(),update(),delete()和getType()方法;这些方法就是根据传过来的URI来操作数据库的接口。此时的PeopleContentProvider是这样的:

public class PeopleContentProvider extends ContentProvider {    @Override    public boolean onCreate() {        return false;    }<b>本文来源gao@!dai!ma.com搞$$代^@码5网@</b>    @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) {        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;    }}

3、使用UriMatcher匹配URI

我们先不管这几个函数的具体操作,先想想在上节中我提到的当一个URI逐级匹配到了ContentProvider类里以后,会怎么做——利用UriMatcher进行再次匹配!!!UriMatcher匹配成功以后,才会执行对应的操作。所以上面的那些操作是在UriMatcher匹配之后。
好,我们就先看看UriMatcher是怎么匹配的。

public class PeopleContentProvider extends ContentProvider {    private static final UriMatcher sUriMatcher;    private static final int MATCH_FIRST = 1;    private static final int MATCH_SECOND = 2;    public static final String AUTHORITY = "com.harvic.provider.PeopleContentProvider";    public static final Uri CONTENT_URI_FIRST = Uri.parse("content://" + AUTHORITY + "/frist");    public static final Uri CONTENT_URI_SECOND = Uri.parse("content://" + AUTHORITY + "/second");    static {        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);        sUriMatcher.addURI(AUTHORITY, "first", MATCH_FIRST);        sUriMatcher.addURI(AUTHORITY, "second", MATCH_SECOND);    }    private DatabaseHelper mDbHelper;    @Override    public boolean onCreate() {        mDbHelper = new DatabaseHelper(getContext());        return false;    }    …………}

上面的代码是最重要的一句话:

sUriMatcher.addURI(AUTHORITY, "first", MATCH_FIRST);

addUri的官方声明为:

public void addURI (String authority, String path, int code)
  • authority:这个参数就是ContentProvider的authority参数,这个参数必须与AndroidManifest.xml中的对应provider的authorities值一样;
  • path:就匹配在URI中authority后的那一坨,在这个例子中,我们构造了两个URI
    (1)、content://com.harvic.provider.PeopleContentProvider/frist
    (2)、content://com.harvic.provider.PeopleContentProvider/second
    而path匹配的就是authority后面的/first或者/second
  • code:这个值就是在匹配path后,返回的对应的数字匹配值;
sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

句话的意思是,如果匹配不成功,返回UriMatcher.NO_MATCH
我们要做一个应用:外部可以使用两个URI传来给我们,当传来content://com.harvic.provider.PeopleContentProvider/frist时,就操作first数据库;如果传来content://com.harvic.provider.PeopleContentProvider/second时,就操作second数据库

4、insert方法


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:ContentProvider数据库共享之实例讲解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址