ContentProvider使用

    平时很少用到数据库SQLite,对于ContentProvider的认识一直是一个模糊的概念;每次用到的时候就必须从网上查询资料,还是自己记录下为好!

    1.创建数据库、表

    SQLiteOpenHelper作为数据库创建以及版本管理的帮助类,我们在使用ContentProvider的时候经常会用到该类;SQLiteOpenHelper是可以抽象类,我们需要创建他的实例,并重载子类的构造方法以及至少重写它的两个抽象方法:

public abstract void onCreate(SQLiteDatabase db);
public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);
    构造方法:子类的构造方法一般提供至少1个参数context;但是为了管理、升级数据库,最好同时传递数据库版本号参数;例如:

public ImageDataBase(Context context, int version) {
    super(context, DATABASE_NAME, null, version);
}

    onCreate:在此方法中调用SQLiteDatabase的方法execSQL,去创建所需要的表格;其中execSQL的参数是一条字符型的SQL语句;例如:

private static final String CONTENT_CREATE = "CREATE TABLE " + CONTENT_TABLE + " (id INTEGER PRIMARY KEY AUTOINCREMENT, DETAIL TEXT, PUBLISHDATE INTEGER)";
另外,我们也可以通过sqlite命令去查看表的创建语句:.schema 表名;

    onUpgrade:该方法后面有两个参数,oldVersion和newVersion;需求中可能会涉及到数据库的更新操作,比如:增加一张表、为某个表增加一列等;就可以在onUpgrade中去实现:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    switch(oldVersion) {
        case 1:
            db.execSQL(CONTENT_CREATE);
            Log.i("wrx1048", "---onUpgrade---" + oldVersion);
            break;
        case 2:
            db.execSQL(CONTENT_ALTER);
            Log.i("wrx1048", "---onUpgrade---" + oldVersion);
            break;
        default:
            break;
    }
}
通过判断旧的数据库的版本号,去执行相应的SQL语句更新数据库;

    2.常见的SQL语句:

    创建表格:

"CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (id INTEGER PRIMARY KEY AUTOINCREMENT, IMAGETITLE TEXT, IMAGEURI TEXT, IMAGEDESC TEXT)"
    删除表格:

"DROP TABLE IS EXISTS " + TABLE_NAME
    增加表格一列:

"ALTER TABLE TABLE_NAME ADD AGE INTEGER"

    3.创建ContentProvider

    ContentProvider作为Android四大组件之一,他的作用主要就是为多进程分享数据,例如联系人数据库;如果应用程序的数据不需要被其他应用分享,那么使用SQLiteDatabase就可以了。

    每个ContentProvider都必须是唯一的;在配置文件中,定义contentProvider时需要配置一个authorities(权威)字段;这个字段就和contentProvider子类的authorities字段一样就可以了;具体如下:

private static final String AUTHORITY = "con.wrx.content";
private static final Uri CONTENT_UTI = Uri.parse("content://" + AUTHORITY + "/images");

private static final int IMAGES = 1;
private static final int IMAGE_ID = 2;

private static final UriMatcher uriMatcher = getMatcher();

private static UriMatcher getMatcher() {
    UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(AUTHORITY, "images", IMAGES);
    uriMatcher.addURI(AUTHORITY, "images/#", IMAGE_ID);
    return uriMatcher;
}

@Override
public String getType(Uri uri) {
    switch (uriMatcher.match(uri)) {
        case IMAGES:
            return "vnd.android.cursor.dir/vnd.wrx.images";
        case IMAGE_ID:
            return "vnd.android.cursor.item/vnd.wrx.images";
    }
    return "";
}
    定义ContentProvider必须重写以下几个方法:


    onCreate:可以在此创建SQLiteOpenHelper实例:

@Override
public boolean onCreate() {
    Context context = getContext();
    imageDataBase = new ImageDataBase(context, 3);
    return true;
}
    getType:判断某个URI类型,是单条数据还是多条,通常配置UriMatcher一起使用。

    其他四个CRUD操作,可以通过SQLiteOpenHelper的getWritableDatabase或者getreadableDatabase方法,获取SQLiteDatabase实例去操作数据库;

    在Activity中调用contentProvider:确定contentProvider的URI;URI通常是由Uri.parse("content://" + AUTHORITY + "/images")得到; 调用getContentResolver()得到ContentResolver实例,进而调用CRUD方法进行数据库操作。

    3.常见的sqlite3命令:

    查看数据库有哪些表:.table(注意前面有个点)

    查看表的列名:pragma table_info(表名);

    切换显示模式:.mode line(注意前面有个点)

    查看表的创建语句:.schema 表名(注意前面有个点)

    把表结构输出,同时索引也会输出:.dump 表名(注意前面有个点)

    退出:.exit 或者.quit

    强制退出sql语句:ctrl + z

    4.sqlite支持的数据类型

    以后再写,改bug去了...

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值