您的位置:首页 > 编程语言 > PHP开发

ContentProvider使用

2016-03-23 15:25 381 查看
    平时很少用到数据库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去了...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: