前言
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库不一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
为什么要使用SQLite
- 不需要一个单独的服务器进程或操作的系统(无服务器的)。
- SQLite 不需要配置,这意味着不需要安装或管理。
- 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
- SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
- SQLite 是自给自足的,这意味着不需要任何外部的依赖。
- SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
- SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
- SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
- 综合来看,即
轻量
兼容
多端
无需配置
无外部依赖
拥有简单易懂的API
安全
在Android中如何使用
Android 提供的 SQLiteOpenHelper.java 是一个抽象类。那么在Eclipse中创建Class类时,选择此抽象类模板即可,而在Android Studio中,必须自己写一个类来继承它,根据平时类名称简洁易懂的习惯上,我们创建的都是MyDataBaseHelper.java或DataBaseHelper.java简写DBHelper.java。
数据库如何创建
Android Studio中
- 右键需要创建数据库.java文件的包,选择
new
,选择新建Class
- 在弹出框中选择
输入类名称
- 这一行规定死了,只能是这样的:
public class DBHelper extends SQLiteOpenHelper{
}
代码语言:txt复制
- 需要写一个带全部参数的DBHelper类的构造函数以便于生成数据库对象:
//带有全部参数的构造函数,此构造函数是必须需要的。Eclipse和Android Studio均有自动填充功能
public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
代码语言:txt复制 super(context, name, factory, version);
}
代码语言:txt复制
- 继承的抽象类SQLiteOpenHelper中的两个抽象方法:
@Override
public void onCreate(SQLiteDatabase db) {
代码语言:txt复制 //创建数据库sql语句
代码语言:txt复制 String sql = "create table user(name varchar(20))";
代码语言:txt复制 //执行sql语句
代码语言:txt复制 db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
代码语言:txt复制
Eclipse中
- 右键需要创建数据库.java文件的包,选择
new
,选择新建Class
- 在弹出框中选择
SQLiteOpenHelper
- 点击
Finish
即创建成功
- 在OnCreate中编写数据库指令,如
创建数据库
//创建数据库sql语句
//创建一个数据库,表名为“user”,内含有一个名字为name,类型为varchar类型的数据库表
String sql = "create table user(name varchar(20))";
//执行sql语句
db.execSQL(sql);
代码语言:txt复制
数据库如何生成
第一句代码中,创建Activity时会自动生成。在Activity中创建数据库,这里我们给数据库起名为“info.db”,数据库版本号为1,代码如下:
代码语言:txt复制//依靠DatabaseHelper带全部参数的构造函数创建数据库
DBHelper dbHelper = new DBHelper(MainActivity.this, "info.db",null,1);
//通过SQLiteDatabase指定数据库读写权限
SQLiteDatabase db = dbHelper.getWritableDatabase();
数据库的增删改查
- 增
db.insert();
代码语言:txt复制
- 删
db.delete();
代码语言:txt复制
- 改
db.update();
代码语言:txt复制
- 查
Cursor cursor = db.rawQuery("select * from info.db", null);
if (cursor.getCount() != 0) {
}
代码语言:txt复制
实操
在技能大赛中常用的数据库操作
一、在Class类中数据库的创建、绑定
解析:创建完毕数据库(
SQLiteOpenHelper
)类后,需要在类的OnCreate方法中通过SQL命令创建数据库
代码:
代码语言:txt复制@Override
public void onCreate(SQLiteDatabase db) {
//创建数据库
db.execSQL("create table user (_id integer primary key autoincrement,username text,passward text)");
//向数据库插入数据
db.execSQL("insert into user (username,passward)values(?,?)", new String[]{"admin", "123456"});
}
然后在需要用到数据库的类、Activity或Fragment中新建数据库对象并绑定
- 在OnCreate方法外新建数据库对象
private MyDataBaseHelper dbHelper;
private SQLiteDatabase db;
- 在OnCreate方法中绑定数据库
dbHelper = new MyDataBaseHelper(getApplicationContext(), "info.db", null, 2);
db = dbHelper.getWritableDatabase();
- 至此,在Class类中数据库的创建、绑定操作完成。
二、用户的注册
解析:用户注册时,主要是用数据库的插入指令。基本题目要求同一用户名只能注册一次,即当用户名已注册时无法再次进行注册。
使用
if(){}else{}
判断条件,当满足某一条件时进行判断用户名是否存在并插入数据库完成注册功能。
数据库代码:
代码语言:txt复制//db执行sql命令:insert into(插入到) user(你的数据库表名) username,passward(你的数据库列名) values(?,?)(正则匹配,values前括号内有几个参数,后面要跟相同数量的问号) new String[]{}(传入参数,相同数据库语句内有几个参数,后面要传入相同数量的参数)
db.execSQL("insert into user (username,passward)values(?,?)",new String[]{参数1,参数2});
可参照图片:
如何判断用户是否已存在?
代码语言:txt复制解析:使用
Cursor
游标方法类,从数据库获取列表并比对。
//使用游标获取数据库列表并匹配参数
Cursor cursor = db.rawQuery("select * from user where username = ?", new String[]{"参数1"});
if (cursor.moveToNext()) {
//条件满足,游标移动,即数据库中已有匹配数据
Toast.makeText(this, "用户名已存在", Toast.LENGTH_SHORT).show();
} else {
//条件不满足,游标未移动,即数据库中未找到相匹配数据
Toast.makeText(this, "用户名不存在", Toast.LENGTH_SHORT).show();
}
如何插入数据库(即用户名不存在时注册成功)
代码语言:txt复制解析:使用
Cursor
游标方法类,从数据库获取列表并比对,最后通过判断来执行sql语句
//使用游标获取数据库列表并匹配参数(释义:查找user数据表中的username列中参数值和“参数1”相同的位置并移动游标)
Cursor cursor = db.rawQuery("select * from user where username = ?", new String[]{"参数1"});
//判断条件:游标是否移动
if (cursor.moveToNext()) {
//条件满足,游标移动,即数据库中已有匹配数据
Toast.makeText(this, "用户名已存在", Toast.LENGTH_SHORT).show();
} else {
//条件不满足,游标未移动,即数据库中未找到相匹配数据,所以插入数据库注册成功
db.execSQL("insert into user (username,passward)values(?,?)", new String[]{"参数1", "参数2"});
//给出提示
Toast.makeText(this, "注册成功", Toast.LENGTH_SHORT).show();
}
三、用户的登录
解析:用户登录的逻辑和注册基本一致,但是登录相对来说要精简一些
代码:
代码语言:txt复制//使用游标获取数据库列表并匹配参数(释义:查找user数据表中的username、passward两个列中参数值和“参数1”、“参数2”同时相同的位置并移动游标)
Cursor cursor = db.rawQuery("select * from user where username = ? and passward = ?", new String[]{"参数1","参数2"});
//判断条件:游标是否移动
if (cursor.moveToNext()) {
//条件满足,游标移动,即数据库中可以找到匹配数据,登陆成功
Toast.makeText(this, "登录成功", Toast.LENGTH_SHORT).show();
} else {
//条件不满足,游标未移动,即数据库中未找到相匹配数据,登录失败
Toast.makeText(this, "用户名或密码输入错误", Toast.LENGTH_SHORT).show();
}
总结
至此,技能赛大概会用到的SQL数据库基本学习完毕。