SQLite在Android中的基本使用

SQLite

SQLites是Android系统集成的一个轻量级数据库。

 

SQLiteDatabase

SQLiteDatabase代表了一个数据库,可以管理、操作数据库,SQLiteDatabase对象通过SQLiteOpenHelper的实例获取。

 

SQLiteOpenHelper

SQLiteOpenHelper是一个抽象类,用于进行数据库的创建、提供数据库版本升级和降级回调接口、获取SQLiteDatabase实例。

SQLiteOpenHelper必须被继承使用,非抽象类继承SQLiteOpenHelper时,需要重写onCreate()和onUpdate()。要被外部使用,还需要提供构造方法;数据库需要降级处理时,重写onDowngrade()方法;获取SQLiteDatabase的方法有两个,getWritableDatabase()和getReadableDatabase()。

  • onCreate()方法通常在内部创建表,以及加入原始数据。
  • onUpgrade()方法为数据库版本升级回调接口,处理数据库版本升级时的逻辑。
  • onDowngrade()方法为数据库版本降级回调接口,处理数据库版本降级时的逻辑。
  • getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的getWritableDatabase()方法就会出错。
  • getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。

构造方法一般传入上下文,数据库名字以及数据库版本,下面是SQLiteOpenHelper的构造方法的源码及说明。

/**
 * Create a helper object to create, open, and/or manage a database.
 * This method always returns very quickly.  The database is not actually
 * created or opened until one of {@link #getWritableDatabase} or
 * {@link #getReadableDatabase} is called.
 *
 * @param context to use for locating paths to the the database
 * @param name of the database file, or null for an in-memory database
 * @param factory to use for creating cursor objects, or null for the default
 * @param version number of the database (starting at 1); if the database is older,
 *     {@link #onUpgrade} will be used to upgrade the database; if the database is
 *     newer, {@link #onDowngrade} will be used to downgrade the database
 */
public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
        @Nullable CursorFactory factory, int version) {
    this(context, name, factory, version, null);
}

 

long insert(String table, String nullColumnHack, ContentValues values)
  • @param table 代表想插入数据的表名
  • @param nullColumnHack 代表强行插入null的列名。当values参数为null或者不包含任何键值对时该参生效
  • @param values 表示一行记录的数据
  • @return 新添记录的行号,该行号是一个内部值,与主见id无关,发生错误返回-1
//example
ContentValues values = new ContentValues();
values.put("name", "秦斌");
values.put("age", 27);
db.insert("user", null, values); //db为SQLiteDatabase实例

 

int delete(String table, String whereClause, String[] whereArgs)
  • @param table 代表想删除数据的表名
  • @param whereClause 满足该语句的记录将会被删除
  • @param whereArgs 用于为whereClause子句传入参数
  • @return 受此delete语句影响的记录的条数
//example
db.delete("user", "name = ?", new String[]{"秦斌"});

 

int update(String table, ContentValues values, String whereClause, String[] whereArgs)
  • @param table 代表想更新数据的表名
  • @param values 代表想更新的数据
  • @param whereClause 满足该语句的记录将会被更新
  • @param whereArgs 用于为whereClause子句传入参数
  • @return 受此update语句影响的记录的条数
//example
ContentValues values = new ContentValues();
values.put("age", 26);
db.update("user", values, "name = ?", new String[]{"秦斌"});

 

//查询的方法多次被重载,还有rawQuery等查找方法。这里只列出其中一个方法,不一一赘述
Cursor query(boolean distinct, String table, String[] columns,
        String selection, String[] selectionArgs, String groupBy,
        String having, String orderBy, String limit)
  • @param distinct 是否去除重复记录
  • @param table 执行查询数据的表名
  • @param columns 要查询出来的列名
  • @param whereClause 满足该语句的记录将会被查找出来
  • @param whereArgs 用于为whereClause子句传入参数
  • @param groupBy 用于控制分组
  • @param having 用于对分组进行过滤(avg、count、max、min、sum)
  • @param orderBy 用于对记录进行排序(desc、asc)
  • @param limit 用于分页
  • @return 游标
//example
//人话:在数据库中查找user表,筛选出年龄在18到22岁的女性,获取她们的名字,年龄,电话,按年龄递增排序
Cursor cursor = db.query(true, "user", new String[]{"name", "age", "tel"}, 
        "gender = ? and age > ? and age < ?", new String[]{"female", "18", "22"}, null,
         null, "age asc", null);

 

SQL语句

查看源码可以得知,以上SQLiteDatabase增删改查的方法都是对sql语句进行了封装。

如果你精通sql语句,可以直接使用以下方法。

db.execSQL(sql);

SQL教程:http://www.w3school.com.cn/sql/index.asp

 

事务

SQLiteDatabase控制事务相关的方法

  • beginTransaction() 开始事务
  • endTransaction() 结束事务
  • inTransaction() 判断上下文是否处于事务中,如果是则返回true,否则返回false
  • setTransactionSuccessful() 设置事务成功
//example
db.beginTransaction();
try {
    //执行数据库操作
    ...
    //调用该方法设置事务成功;否则endTransaction()方法将回滚业务
    db.setTransactionSuccessful();
} finally {
    //由事务的标志决定是提交事务还是回滚事务
    db.endTransaction();
}

 

可存储的数据类型

右上图可以看出,数据类型为Byte、Long、Float、Short、byte[]、Double、String、Boolean和Integer都可以通ContentValues存储到数据库中。

序列化的bean也可以保存到数据库中,相关查阅网上文档。

 

相关终端命令

adb shell //进入管道模式
cd /data/data/<包名>/databases/ //去到应用对应的包的数据库目录
sqlite3 <db名> //进入到你选择的数据库当中
.tables //查看数据库中含有的表
.schema <表名> //查看表结构
select * from <表名>; //可以执行任何sql语句,这里只是举个例子,查询表所有数据。注意命令最后一定要有;
.dump //查看表所有数据
.quit //退出sqlite
.help //展示所有点命令及用法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值