最近为了巩固android基础,复习了sqlite数据库这篇。好记性不如烂笔头,操起键盘就是干....
sqlite简介
SQLite 是一款轻量级的关系型数据库,它的运算速度非常快, 占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用。SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID 事务,所以只要你以前使用过其他的 关系型数据库,就可以很快地上手 SQLite。而 SQLite 又比一般的数据库要简单得多,它甚 至不用设置用户名和密码就可以使用。Android 正是把这个功能极为强大的数据库嵌入到了 系统当中,使得本地持久化的功能有了一次质的飞跃。
优点:
1)零配置,无需安装和配置
2)储存在单一磁盘文件中的一个完整数据库
3)数据库文件可以在不同的字节顺序的机器间自由共享
4)支持数据库大小至2TB
5)足够小,全部源代码大致3万行C代码,250k
6)比目前流行的大多数数据库带数据的操作要快
7)开源
常用的sql基本语句
创建表:
create table 表名 (字段名 数据类型,字段名 数据类型,字段名 数据类型)
插入数据:
insert into 表名 values(数据值,数据值,数据值)
insert into 表名 (字段1,字段2,字段3) values(数据值,数据值,数据值)
更新数据:
update 表名 set 字段1 = 数据值 where 其他字段 = 数据值
删除数据:
delete from 表名 where 字段值 = 数据值
删除表:
drop table if exists 表名
增加字段:
alter table 表名 add column 字段 数据类型
查询数据:
select * from表名 where 查询的条件表达式 group by 分组的字段 order by 排序的字段
//select 后面为* 则返回所有的字段,返回部分字段,只需把*换成需要的字段,多个字段有逗号隔开
创建数据库
android的为我们提供了SQLiteOpenHelper ,继承这个抽象类类,需要复写构造方法(一般选构造参数少的那个),onCreate()和onUpgrade()
onCreate
这个方法是用来创建数据库用的;
onUpgrade
这个方法是用来升级数据库用的;
例子如下:
创建一个学生表
public class MySQLiteHelp extends SQLiteOpenHelper {
public static final int VERSION = 1;
private static final String DB_NAME = "my_db.db";
private static final String CREATE_BOOK = "create table Students (" +
"id integer primary key autoincrement," +
"name text," +
"class text," +
"year integer," +
"grade real)";
private Context mContext;
public MySQLiteHelp(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
Toast.makeText(mContext,"创建成功!",Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
然后实例化MySQLiteHelp这个类,并调用getWritableDatabase()方法。
//第一个参数上下文,第二个参数数据库名字,第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般传null,第四个参数传入数据库版本
mySQLiteHelp = new MySQLiteHelp(this,MySQLiteHelp.DB_NAME,null,1);
//创建或者打开一个数据库,如果数据库存在就打开,没有就创建
mySQLiteHelp.getWritableDatabase();
打开File Explorer查看数据库是否创建成功;目录在data/data/[包名]/databases
这里需要讲下 SQLite的数据类型和getWritableDatabase()与getReadableDatabase()的区别
SQLite的数据类型只有5种:
1,null(数据值为空)
2,integer(整型)
3,real(浮点型数据)
4,text(字符串,数据库编码【utf-8,utf-16be或者utf-16le】存放)
5,blob(只是一个数据块,完全按照输入存放)
getWritableDatabase()与getReadableDatabase()的区别
getWritableDatabase取得的实例不是仅仅具有写的功能,而是同时具有读和写的功能同样的;
getReadableDatabase取得的实例也是具对数据库进行读和写的功能。
两者的区别在于getWritableDatabase取得的实例是以读写的方式打开数据库,如果打开的数据库磁盘满了,此时只能读不能写,此时调用了getWritableDatabase的实例,那么将会发生错误(异常)
getReadableDatabase取得的实例是先调用getWritableDatabase以读写的方式打开数据库,如果数据库的磁盘满了,此时返回打开失败,继而用getReadableDatabase的实例以只读的方式去打开数据库
操作数据库
操作数据库的类不是SQLiteOpenHelper ,而是SQLiteDatabase,这个对象是通过调用getWritableDatabase方法返回的对象;
下面来演示下操作数据库的增删改查
添加数据
ps:db 是一个SQLiteDatabase对象;
调用db.execSQL(String sql)方法;
String sql = "insert into Students (name,class,year,grade) values ('小明','一年级',8,98)";
db.execSQL(sql);
这里我用sqlite expert professional 这个工具打开数据库,查看数据是否插入成功
其实SQLiteDatabase还为我们提供了更加简单的一种方法插入数据;
调用 db.insert();
ContentValues values = new ContentValues();
values.put("name","小红");
values.put("class","一年级");
values.put("year",7);
values.put("grade",100);
db.insert("Students",null,values);
更新数据
我们来将小明的分数偷偷的改成100
使用sql语法的如下:
String sql = "update Students set grade = 100 where name = '小明' ";
db.execSQL(sql);
android内置语法:
我们来把小明的分数偷偷的改成60
ContentValues values1 = new ContentValues();
values1.put("grade",60);
db.update("Students",values1,"name = ?",new String[]{"小明"});
db.update的方法需要传入四个参数,第一个是表名,第二个是需要修改的值,第三个是条件,第四个是符合条件的值
删除数据
我们来将小明的数据删除点;
sql语法:
String sql = "delete from Students where name = '小明' ";
db.execSQL(sql);
将小明的数据删除了,这样他爸妈就不知道了。
android内置语法:
//这里三个参数,第一个是表名,第二个是条件,第三个是符合条件的值
db.delete("Students","name = ?",new String[]{"小明"});
查询数据
sql语句:
查询数据这里不能用:db.execSQL(sql),
这里需要换一个方法:db.rawQuery()
String sql1 = "select * from Students where name = '小红' ";
//第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符,该参数可以设置为null
Cursor cursor = db.rawQuery(sql1, null);
if (cursor.moveToFirst()){
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
String class_ = cursor.getString(cursor.getColumnIndex("class"));
int year = cursor.getInt(cursor.getColumnIndex("year"));
double grade = cursor.getDouble(cursor.getColumnIndex("grade"));
Log.d(TAG, "name: "+name);
Log.d(TAG, "name: "+class_);
Log.d(TAG, "name: "+year);
Log.d(TAG, "name: "+grade);
}while (cursor.moveToNext());
}
cursor.close();
执行完查询语句返回一个Cursor数据类型。他是一个提供了随机读写访问数据库查询结果集的接口。Cursor并不是线程安全,因此在多线程中访问的时候需要手动进行同步,避免线程出现问题。
常用的Cursor函数有:
close() 关闭游标,释放资源
copyStringToBuffer(int columnIndex, CharArrayBuffer buffer) 在缓冲区中检索请求的列的文本,将将其存储
getColumnCount() 返回所有列的总数
getColumnIndex(String columnName) 返回指定列的名称,如果不存在返回-1
getColumnIndexOrThrow(String columnName) 从零开始返回指定列名称,如果不存在将抛出IllegalArgumentException 异常。
getColumnName(int columnIndex) 从给定的索引返回列名
getColumnNames() 返回一个字符串数组的列名
getCount() 返回Cursor 中的行数
moveToFirst() 移动光标到第一行
moveToLast() 移动光标到最后一行
moveToNext() 移动光标到下一行
moveToPosition(int position) 移动光标到一个绝对的位置
moveToPrevious() 移动光标到上一行
android内置语法:
/**
* 第一个参数:表名
* 第二个参数:要查询的字段名
* 第三个参数:要查询的条件字段
* 第四个参数:要查询的条件字段对应的值
* 第五个参数:分组的字段
* 第六个参数:筛选的字段
* 第七个参数:排序的字段
* 返回值:游标
Cursor cursor = db.query("Students",null,null,null,null,null,null);
*/
获取了游标Cursor 之后的操作与上面一样。
android的基本操作就这样了,下次有时候写一下数据库的升级和优化部分。等我把github弄好我再吧代码上传