ContentProvider&SQLite

ContentProvider & SQLite

ContentProvider

​ ContentProvider即内容提供者,是 android的四大组件之一,是不同应用程序之间进行数据交换的标准API,ContentProvide以Uri的形式对外提供数据,允许其他应用访问和修改数据;其他应用使用ContentResolve根据Uri进行访问操作指定的数据。

ContentProvider主要以表格的形式组织数据,同时也支持文件数据。每个表格中包含多张表,每张表包含行和列,分别对应记录和字段。ContentProvider类并不会直接与外部进程交互,而是通过ContentResolver 类与外部交互。

在这里插入图片描述

URL

定义:Uniform Resource Identifier,即统一资源标识符。
作用:唯一标识 ContentProvider 和其中的数据。
外界进程通过 URI 找到对应的ContentProvider & 其中的数据,再进行数据操作
使用:URI分为系统预置和自定义,分别对应系统内置的数据(如通讯录、日程表等等)和自定义数据库,下面描述自定义Uri。
例如content://com.example.provider.myprovider/test,与网络的Uri类似,其规则如下:
content://:协议部分,表示ContentProvider使用的协议,Android规定的固定值。
com.example.provider.myprovider:URI 的标识,通过属性authorities定义,系统通过这个标识找到要对应的ContentProvider;为了保证URI标识的唯一性,它一般是一个完整的、小写的类名。
test:资源所在的路径,访问者可以动态访问不同的资源;如果想要访问具体数据,可以在后面加上该行的ID,例如上述路径下的第1条记录,那么Uri可以写为content://com.example.provider.myprovider/test/1。

在这里插入图片描述

ContentResolver

1.ContentResolver通过URI即可操作 不同的ContentProvider 中的数据,统一管理不同 ContentProvider间的操作。
2.外部进程通过 ContentResolver类从而与ContentProvider类进行交互。
3.通过调用Content的 getContentResolver() 方法获取 ContentResolver对象实例,
其实ContentResolver的作用类似于HttpClient,获取对象后就可以根据Uri对应用的数
据进行CRUD操作了。
4.ContentResolver 类提供了与ContentProvider类相同名字与作用的4个方法。

<-- 4个核心方法 -->
  public Uri insert(Uri uri, ContentValues values) 
  外部进程向 ContentProvider 中添加数据
  public int delete(Uri uri, String selection, String[] selectionArgs) 
  外部进程 删除 ContentProvider 中的数据
  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs)
 外部进程更新 ContentProvider 中的数据
  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,  String sortOrder)  
 外部应用 获取 ContentProvider 中的数据
<-- 2个其他方法 -->
public boolean onCreate() 
 ContentProvider创建后或打开系统后其它进程第一次访问该ContentProvider时由系统进行调用
运行在ContentProvider进程的主线程,故不能做耗时操作
public String getType(Uri uri)
得到数据类型,即返回当前 Url 所代表数据的MIME类型

SQLite

SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式系统中

SQLite 数据库是无类型的,可以向一个integer 的列中添加一个字符串,但它又支持常见的类型比如:NULL,VARCHAR, TEXT,INTEGER,BLOB,CLOB 等

Android 系统内置了SQLite,并提供了一系列API 方便对其进行操作。

自定义SQLiteOpenHelper

public class MySQLiteOpenHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "user.db";
private static final int VERSION = 1;

public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, name, factory, version);
}

public MySQLiteOpenHelper(Context context) {
    super(context, DB_NAME, null, VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    //数据库创建
    db.execSQL("create table person (_id integer primary key autoincrement, " +
            "name char(10), phone char(20), money integer(20))");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    //数据库升级
}

@Override
public void onOpen(SQLiteDatabase db) {
    super.onOpen(db);
}

}

数据库的增删改查

使用SQL语句

insert into person (name, phone, money) values ('张三', '159874611', 2000);//插入
delete from person where name = '李四' and _id = 4;//删除
update person set money = 6000 where name = '李四';//更新
select name, phone from person where name = '张三';//查询
alter table t_user add c_money float;//升级
create table t_user(uid integer primary key not null,c_name varchar(20),c_age 
integer,c_phone varchar(20))";//创建

db.execSQL("insert into person (name, phone, money) values (?, ?, ?);", 
 new Object[]{"张三", 15987461, 75000});
Cursor cursor = db.rawQuery("select _id, name, money from person where name = ?;", 
 new String[]{"张三"});

使用API

插入
//以键值对的形式保存要存入数据库的数据
ContentValues cv = new ContentValues();
cv.put("name", "刘能");
cv.put("phone", 1651646);
cv.put("money", 3500);
//返回值是改行的主键,如果出错返回-1
long i = db.insert("person", null, cv);

修改
ContentValues cv = new ContentValues();
cv.put("money", 25000);
int i = db.update("person", cv, "name = ?", new String[]{"赵四"});

删除
//返回值是删除的行数
int i = db.delete("person", "_id = ? and name = ?", new String[]{"1", "张三"});

查询
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
  • 参数名 作用
  • table 表名
  • columns 查询的字段
  • selection 查询条件
  • selectionArgs 填充查询条件的占位符,条件中?对应的值
  • groupBy 分组查询参数
  • having 分组查询条件
  • orderBy 排序字段和规则,“字段名 desc/asc”
  • limit 分页查询,“m,n”,m表示从第几条开始查,n表示一个查询多少条数据

事务Transaction

  • 在SQLiteDatabase 提供了对事务的支持,处于事务中的操作都是“临时性”的,只有事务提交了才会将数据保存到数据库。
  • 事务的使用不仅可以保证数据的一致性,也可以提高批处理时的执行效率。
  • SQLiteDatabase 提供的beginTransaction()打开事务,endTransaction()结束事务。注意:结束事务并不代表事务提交,如果想让数据写入的数据库需要在结束事务前执行setTransactionSuccessful()方法。这是事务提交的唯一方式。
  • 使用事务会大大提高批量处理的效率
try {
    //开启事务
    db.beginTransaction();
    ...........
    //设置事务执行成功
    db.setTransactionSuccessful();
} finally{
    //关闭事务
    //如果此时已经设置事务执行成功,则sql语句生效,否则不生效
    db.endTransaction();
}
nTransaction();
    ...........
    //设置事务执行成功
    db.setTransactionSuccessful();
} finally{
    //关闭事务
    //如果此时已经设置事务执行成功,则sql语句生效,否则不生效
    db.endTransaction();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值