SQLite
什么是SQLite
SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百KB的内存就足够了
SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务
它甚至还不需要设置用户名和密码就可以使用
为什么要用SQLite
因为前面所学的SharedPreferences存储只适用于保存一些简单的数据和键值对,当需要存储大量复杂的关系型数据时,SharedPreferences存储就难以应付了,这时就需要用Android系统内置的SQLite数据库
如何创建数据库和数据表
首先你需要创建一个类继承SQLiteOpenHelper()抽象类
并继承它的构造方法
这个构造方法有4个参数:
第一个参数是Context,这个就不解释了
第二个参数是数据库名,创建数据库时就是使用这里指定的名称
第三个参数允许我们在查询数据时返回一个自定义的Cursor,一般传入null
第四个参数表示当前数据库版本号
public class MysqliteHelper extends SQLiteOpenHelper{
public MysqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
构建好SQLiteOpenHelper实例后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能创建数据库了
这里提一下getReadableDatabase()方法是只能读取数据,而不能写入数据,也就是无法更新数据库
MysqliteHelper mysqliteHelper=new MysqliteHelper(this,"students_db",null,1);
SQLiteDatabase sqLiteDatabase=mysqliteHelper.getWritableDatabase();
建表语言
解释一下:比如,下面的 name text,name是数据库的列名,text是该列数据的数据类型,特别注意中间要用空格隔开,且每一列之间要用逗号隔开
再说一下数据类型:integer表示整型,real表示浮点类型,text表示文本类型,blob表示二进制类型,下面还用到了primary key将id设为主键,并用autoincrement和not null表示id列是自增长和不为空的
String sql="create table students(" +
"id integer primary key autoincrement not null," +
"name text," +
"age integer" +
")";
建表语句是写在上面的MysqliteHelper类中的,并且再onCreate()中调用SQLiteDatabase的execSQL()方法执行建表语句
修改如下:
public class MysqliteHelper extends SQLiteOpenHelper{
String sql="create table students(" +
"id integer primary key autoincrement not null," +
"name text," +
"age integer" +
")";
public MysqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
如何添加数据
Avtivity的Java代码:
private void addStudent() {
//获取输入的数据
String name=nameET.getText().toString();
int age=Integer.parseInt(ageET.getText().toString());
//将数据存入ContentValues对象中
ContentValues values=new ContentValues();
//"name"要和建表语句中的列名相同
values.put("name",name);
values.put("age",age);
//创建名为students_db的数据库
MysqliteHelper mysqliteHelper=new MysqliteHelper(this,"students_db",null,1);
//调用getWritableDatabase()方法
SQLiteDatabase sqLiteDatabase=mysqliteHelper.getWritableDatabase();
//将数据添加进数据表内
sqLiteDatabase.insert("students",null,values);
}
注意:上面最后一行代码中”students”要和你的建表语句中表名相同
如何修改数据
这里我就讲一下update()语句中相关参数,第一和第二个就不用说了,主要说一下第三和第四个
第三个参数表示的是修改数据的条件,”列名=?”,条件是可以写多个的,中间用and连接,这里的问号就是第四个参数
第四个参数,因为前面的条件可以写多个,所以第四个参数是一个字符串数组
private void changeStudents() {
String name=nameET.getText().toString();
String age=ageET.getText().toString();
MysqliteHelper mysqliteHelper=new MysqliteHelper(this,"students_db",null,1);
SQLiteDatabase sqLiteDatabase=mysqliteHelper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("name","XXX");
sqLiteDatabase.update("students",values,"name=?",new String[]{name});
}
如何删除数据
删除和修改基本是一样的,这里就不多讲解了
private void delStudents() {
String name=nameET.getText().toString();
String age=ageET.getText().toString();
MysqliteHelper mysqliteHelper=new MysqliteHelper(this,"students_db",null,1);
SQLiteDatabase sqLiteDatabase=mysqliteHelper.getWritableDatabase();
sqLiteDatabase.delete("students","name=?",new String[]{name});
}
如何查询数据
用一个循环通过Cursor游标获取数据库中数据
private void listStudent() {
MysqliteHelper mysqliteHelper=new MysqliteHelper(this,"students_db",null,1);
SQLiteDatabase sqLiteDatabase=mysqliteHelper.getWritableDatabase();
Cursor cursor=sqLiteDatabase.query("students",null,null,null,null,null,null);
cursor.moveToFirst();
do{
int id=cursor.getInt(cursor.getColumnIndex("id"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
String name=cursor.getString(cursor.getColumnIndex("name"));
}while (cursor.moveToNext());
}