在我们Android系统中有内置的数据库————SQLite,它是一款轻量级的关系型数据库,运算速度非常快,占用资源很少,因而比较适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,所以只要使用过其他关系型数据库,就可以很快上手SQLite。下面来认识使用一下SQLite
创建数据库
Android提供了一个SQLiteOpenHelper帮助类,借助这个类我们可以简单的对数据库进行创建和升级。首先新建一个类去继承它,重写里面的onCreate()和onUpgrade(),在这两个方法中去实现创建、升级数据库的逻辑。代码如下:
public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_USER = "create table User (" +
"id integer primary key autoincrement," +
"name text," +
"age integer," +
"sex text)";
private Context mContext;
public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_USER);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
在数据库中新建一张User表,表中又id(主键)、名字、年龄、性别,SQLite的数据类型比较简单,integer表示整型,real表示浮点型,text表示文本类型,blob表示二进制类型,另外我们使用了primary id将id列设为主键, 并用autoincrement关键字表示id列是自增长。我们在onCreate()方法中调用了SQLiteDataBase的execSQL()方法去执行这条建表语句。接下来在MainActivity的布局文件中加入一个按钮用于创建数据库,activity代码如下:
public class MainActivity extends AppCompatActivity {
private MyDatabaseHelper databaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
databaseHelper = new MyDatabaseHelper(this, "User.db", null, 1);
Button createDatabase = findViewById(R.id.create);
createDatabase.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
databaseHelper.getWritableDatabase();
}
});
}
}
首先构建了一个MyDatabaseHelper对象,指定数据库名为“User.db”
,版本号未1,然后在点击事件调用getWritableDatabase()方法,这样当我们第一次点击按钮时,就会坚持当前程序有没有“User.db”
这个数据库,没有就会调用MyDatabaseHelper中的onCre()方法,这样User表也就得到了创建,再次点击时,发现已经存在该数据库,因此不会再创建一次。
升级数据库
当我们在原有的数据库里再新建表或者对原有的表进行修改时,就需要升级数据库,这时候就用到了MyDatabaseHelper里的onUpg()方法,只需要我们创建MyDatabaseHelper对象时,将版本号设为比之前的版本号大即可,之前我们传入的是1,现在只需要传入一个比1大的数,就可以让onUpgrade()方法得到执行。
添加数据
数据库的操作无非就4种,即CRUD,C代表添加(Create),R代表查询(Retrieve),U代表更新(Update),D代表删除(Delete)。每一种操作又各自对应了一种SQL命令,下面就一一介绍这4种操作,首先是添加,代码如下:
findViewById(R.id.add_data).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 22);
values.put("sex", "男");
//插入数据
database.insert("User", null, values);
values.clear();
values.put("name", "李四");
values.put("age", 18);
values.put("sex", "男");
//插入数据
database.insert("User", null, values);
values.clear();
values.put("name", "王五");
values.put("age", 25);
values.put("sex", "女");
//插入数据
database.insert("User", null, values);
}
});
首先获取到SQLiteDatabase 对象, 然后使用ContentValues来对要添加的数据进行组装。调用SQLiteDatabase的insert()方法保存数据,这里接收三个参数,第一个参数是该表的名字,第二个参数用哪个有未指定添加数据的情况下给某些可为空的列自动赋值为null,第三个参数是传一个ContentValues对象,这样子就可以成功向表里添加三条数据。
删除数据
上面添加了三条数据,分别是(张三,22,男)、(李四,18,男)、(王五,25,女),这里对表进行删除操作,把20岁以下的数据删掉,代码如下:
findViewById(R.id.delete_data).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
database.delete("User", "age < ?", new String[] {"20"});
}
});
调用SQLiteDatabase的delete()方法,这个方法接收3个参数,第一个参数仍然是表名,第二、三个参数用于条件约束删除某一行或者某些行,这里传入了age < 20, 也就是删除年龄小于20岁的数据,如果不指定的话默认就是删除此表的所有数据。
更新数据
把王五的性别改为男,代码如下:
findViewById(R.id.update_data).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("sex", "男");
database.update("User", values, "name = ?", new String[] {"王五"});
}
});
首先一样先获取SQLiteDatabase对象,再构建一个ContentValues对象,将我们想修改的数据添加到ContentValues对象里,再调用SQLiteDatabase的update()方法去执行更新操作,这里接收四个参数,第一个参数还是表名,第二个参数表示要修改的数据,第三、四个参数和上面的删除操作一样用于条件约束某一行或者某些行,这里表示name=“王五”的条件,这样就完成了一个修改操作。
查询操作
查询是4种操作的值一种了,也是最难的一种操作,掌握了查询的方法猴,数据库的CRUD操作将全部学完。下面简单演示一个最简单的查询,查询表中的全部数据,代码如下:
findViewById(R.id.query_data).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
SQLiteDatabase database = databaseHelper.getWritableDatabase();
Cursor cursor = database.query("User", null, null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String sex = cursor.getString(cursor.getColumnIndex("sex"));
Log.i("MainActivity", "name:" + name);
Log.i("MainActivity", "age:" + age);
Log.i("MainActivity", "sex:" + sex);
} while (cursor.moveToNext());
}
cursor.close();
}
});
首先获取SQLiteDatabase对象,再调用query()方法去查询数据,这个方法的参数非常复杂,最短的一个方法重载也需要传入7个参数。7个参数的介绍如下表。
参数 | 对应SQL部分语句 | 描述 |
table | from table_name | 指定查询的表名 |
colunms | select column1, column2 | 指定查询的列名 |
selection | where column = value | 指定where的约束条件 |
selectionArgs | - | 为where中的占位符提供具体的值 |
groupBy | group by column | 指定需要group by的列 |
having | having column =value | 对group by后的结果进一步的约束 |
orderBy | order bty column1, column2 | 指定查询结果的排序方式 |
当除了第一个参数表名有值,其他参数为null时,查询的是表中的所有数据。查询完之后得到一个Cursor对象,接着循环获取出表中的所有数据,用log打印出来,结果如下
这是查询表中所有数据的方法,如果需要设置条件也是可以的。
查询年龄大于23岁的id和名字,查询语句和结果如下:
Cursor cursor = database.query("User",new String[]{"id", "name"}, "age > 23", null, null, null, null, null);