Android的SQLiteDatabase提供了insert,update,delete和query语句来操作数据库,下面来简单的介绍一下这些方法的用法。
1.使用insert方法插入记录
SQLiteDatabase的insert方法的签名为long insert(String table, String nullColumnHack, ContentValues values),这个插入方法的参数说明如下。
》table:代表想插入数据的表名。
》nullColumnHack:代表强行插入null值的数据列的列明。当values参数为null或不包含任何key-value对时该参数有效。
》values:代表一行记录的数据。
insert方法插入的一行记录使用ContentValues存放,ContentValues类似于Map,它提供了put(String key, Xxx value)(其中key为数据列的列名)方法用于存放数据、getAsXxx(String key)方法用于取出数据。
例如如下语句:
ContentValues values = new ContentValues();
values.put("name", "孙悟空");
values.put("age", 500);
//返回新添加记录的行号,该行号是一个内部直,与主键ID无关,发生错误返回-1
long rowid = db.insert("person_inf", null, values);
不管第三个参数是否包含数据,执行insert()方法总会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他字段值都为null的记录。
insert()方法的底层实际上依然是通过构造insert SQL语句来进行插入的,因此它生成的SQL语句总是形如下面的语句:
//ContentValues里key-value对的数量决定了下面的key-value对。
insert into <表名>(key1, key2, ...)
values(value1, value2...)
此时如果第三个参数为null或其中key-value对的数量为0,由于insert()方法还会按此方法生成一条insert语句,此时的insert语句为:
//ContentValues里key-value对的数量决定了下面的key-value对。
insert into <表名>()
values()
上面的SQL语句显然有问题。为了满足SQL语法的需要,insert语句必须给定一个列名,如:insert into person(name) values(null), 这个name列名就由第二个参数来制定。由此可见,当ContentValues为null或它包含的key-value对的数量为0时,第二个参数就会起作用了。
一般来说,第二个参数指定的列名不应该是主键列的列名,也不应该是非空列的列明,否则强行往这些数据列插入null会引发异常。
2.使用update方法更新记录
SQLiteDatabase的update方法的签名为update(String table, ContentValues values, String whereClause, String[] whereArgs),这个更新方法的参数说明如下。
》table:代表想更新数据的表名。
》values:代表想更新的数据。
》whereClause:满足该whereClause子句的记录将会被更新。
》whereArgs:用于为whereClause子句传入参数。
该方法返回受此update语句影响的记录的条数。
例如我们想更新person_inf表中所有主键大于20的人的人名,可调用如下方法:
ContentValues values = new ContentValues();
//存放更新后的人名
values.put("name", "新人名");
int result = db.update("person_inf", values, "_id>?", new Integer[]{20});
实际上update方法底层对应的sql语句如下:
update <table>
set key1=value1, key2=value2 ...
where <whereClause>
其中whereArgs参数用于向whereClause中传入参数。
3.使用delete方法删除记录
SQLiteDatabase的delete方法的签名为delete(String table, String whereClause, String[] whereArgs),这个删除的参数说明如下。
》table:代表想删除数据的表名。
》whereClause:满足该whereClause子句的记录将会被删除。
》whereArgs:用于为whereClause子句传入参数。
该方法返回受此delete语句影响的记录的条数。
例如我们想删除person_inf表中所有人名以“孙”开头的记录,可调用如下方法:
int result = db.delete("person_inf", "person_name like ?", new String[]{"孙_"});
实际上delete方法底层对应的SQL语句如下:
delete <table>
where <whereClause>
4.使用query方法查询记录
SQLiteDatabase的query方法的签名位Cursor query(boolean distinct, String table, String[] columns, String whereClause, String[] selectionArgs, String groupBy, String having, String orderBy, String limit),这个方法的参数说明如下:
》distinct:指定是否去除重复记录。
》table:执行查询数据的表名。
》columns:要查询出来的列名。相当于select语句select关键字后面的部分。
》whereClause:查询条件子句,相当于select语句where关键字后面的部分,在条件子句中允许使用占位符“?”。
》selectionArgs:用于为whereClause子句中占位符传入参数值,值在数组中的位置为占位符在语句中的位置必须一致,否则就会有异常。
》groupBy:用于控制分组。相当于select语句group by 关键字后面的部分。
》having:用于对分组进行过滤。相当于select语句having关键字后面的部分。
》orderBy:对于对记录进行排序。相当于select语句order by关键字后面的部分,如:personid desc, age asc。
》limit:用于进行分页,相当于select语句limit关键字后面的部分。例如5,10.
这个query()方法的用处,列举了一处:当应用程序需要进行“条件不确定”的查询(即查询条件需要动态改变的查询)时,使用这个query方法可以避免手动拼接sql语句。
例如想查询出person_inf表中人名为“孙”开头的记录,可使用如下语句:
Cursor cursor = db.query("person_inf", new String[]{"_id", "name", "age"}, "name like ?", new String[]{"孙?"}, null, null, "personid desc", "5,10");
//处理结果集
cursor.close();
上面就列举了insert,update,delete,query等SQLiteDatabase提供的对SQLite数据库进行操作的方法。