目录
1.什么是SQLite数据库?
- SQLite数据库是一个轻量级的数据库,能够帮助我们存储结构化的数据。
1.1SQLite数据库特点
- 小型单文件形式:存储形式就是一个文件,例如:XXXX.db
- 性能高:使用B-Tree结构
B-tree(多路搜索树,并不是二叉的)是一种常见的数据结构。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。
- 嵌入式:可放在任何只是SQLite数据的平台上使用
- 开源跨平台:源码可下载,在Android/IOS上都可以使用
- 关系型数据库:可通过多张表的关联关系组织数据,实现数据增删改查
- 支持事物操作
1.2实现方式
①创建数据库的方式
- context.openOrCreateDatabase(name,mode,cursorFactory) (不推荐)
传入数据库的名字(name),数据库的操作方式(mode),null(cursorFactory)就可以打开数据库(首次调用时创建该数据库)
优点:简单
缺点:不具有扩展性,因此不推荐使用此方法
- 继承SQLiteOpenHelper并重写抽象方法 (推荐)
②操作数据库的方式
- 执行原生SQL语句
- 使用SQLiteDatabase的相关API
db.execSQL(String sql) //执行原生SQL语句
db.insert(String table, String nullColumnHack, ContentValues values) //增
db.delete(String table, String whereClause, String[] whereArgs) //删
db.update(String table, ContentValues values, String whereClause, String[] whereArgs) //改
db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) //查
1.3可视化工具
①数据库文件导出工具
- adb pull (创建的数据库放在 /data/data/<package_name>/databases/ 目录下)
- AndroidStudio->View->Tool Windows->Device File Explorer; data/data/<package_name>右键save as到本地
②数据库文件查看工具
- sqlite3(通过命令行操作,可以提高工作效率) (推荐)
- 图形化工具,如:Navicat、SQLiteStudio
2.如何创建数据库
2.1SQLiteOpenHelper与SQLiteDatabase的关系
- 首先我们来了解一下2.1SQLiteOpenHelper和SQLiteDatabase之间的故事。(如下图)
- 透过上图,你可能还不是很清楚我想表达什么,那么上面想表达什么呢??
- 我们先自定义一个类(XXHelper)继承SQLiteOpenHelper类
- 创建构造函数,复写onCreate()和onUpgrade()这两个方法(同时编写创建数据库的SQL语句)
- 再在MainActivity中初始化XXHelper后,通过调用getReadaleDatabase()/getWritableDatabase()方法就成功创建数据库了(得到SQLiteDatabase对象,通过SQLiteDatabase类还可以操作数据库。)
没有实例确实看不太明白,那么一起看下下面这个demo吧:
- 先自定义一个类(DatabaseHelper)继承SQLiteOpenHelper类
- 创建构造函数,复写onCreate()和onUpgrade()这两个方法(同时编写创建数据库的SQL语句)
public class DatabaseHelper extends SQLiteOpenHelper {
//1.编写创建表的SQL语句
private static final String CREATE_COURSE = "create table Course (" +
"id integer primary key autoincrement," +
"name text," +
"teacher text," +
"price real)";
private Context mContext;
public DatabaseHelper(Context context, String name,SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
//2.执行这条sql语句
db.execSQL(CREATE_COURSE);
Toast.makeText(mContext,"创建数据库成功",Toast.LENGTH_LONG).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
- 再在MainActivity中初始化XXHelper后,通过调用getReadaleDatabase()/getWritableDatabase()方法(这里通过一个点击事件完成创建)
public class MainActivity extends AppCompatActivity {
//3.声明数据库帮助类
private DatabaseHelper mHelper;
Button mButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = findViewById(R.id.button);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//4.初始化帮助类
mHelper = new DatabaseHelper(MainActivity.this,"CourseStore",null,1);
//5.创建数据库
mHelper.getWritableDatabase();
}
});
}
}
- 没错这样我们就创建了一个数据库 ↓
是不是感觉差了什么东西,上面复写的onUpgrade()方法都没有用到,那我们接下来讲讲这个方法:
- onUpgrade()用于更新数据库,我们只需要把需要的操作放在onUpgrade()方法中 (这里创建了另一张数据库表)
@Override
public void onCreate(SQLiteDatabase db) {
//2.执行这条sql语句
db.execSQL(CREATE_COURSE);
db.execSQL(CREATE_STUDENT);
Toast.makeText(mContext,"创建数据库成功",Toast.LENGTH_LONG).show();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists Course");
db.execSQL("drop table if exists Student");
onCreate(db);
}
- 在我们初始化自定义帮助类的时候把最后一个参数(version)改为下一个版本号即可,如下:
//4.初始化帮助类
// mHelper = new DatabaseHelper(MainActivity.this,"CourseStore",null,1);
mHelper = new DatabaseHelper(MainActivity.this,"CourseStore",null,2);
3.SQLite数据库的增、删、改
①通过SQL语句:
//SQL语句:增
private void add() {
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("insert into Student(name,student,age) values(?,?,?)",
new String[]{"SQLite","macardo","21"});
}
//SQL语句:删
private void delete(){
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("delete from Student where student = ?",
new String[]{"macardo"});
}
//SQL语句:改
private void update() {
SQLiteDatabase db = mHelper.getWritableDatabase();
db.execSQL("update Student set student = ? where name = ?",
new String[]{"macardo2","SQLite"});
}
②通过SQLiteDatabase-API:
private void add() {
SQLiteDatabase db = mHelper.getWritableDatabase();
//通过SQLiteDatabase-API:增
ContentValues values = new ContentValues();//就是一个存储键值对的集合
values.put("name","Database");
values.put("student","macardo1");
values.put("age","21");
db.insert("Student",null,values);
}
private void delete(){
SQLiteDatabase db = mHelper.getWritableDatabase();
//通过SQLiteDatabase-API:删
db.delete("Student","student = ?",new String[]{"macardo1"});
}
private void update() {
SQLiteDatabase db = mHelper.getWritableDatabase();
//通过SQLiteDatabase-API:改
ContentValues values = new ContentValues();
values.put("student","macardo3");
db.update("Student",values,"name = ?",new String[]{"SQLite"});
}
4.SQLite数据库的查
Cursor:游标接口,提供遍历查询结构的方法
private void query() {
SQLiteDatabase db = mHelper.getWritableDatabase();
//SQL语句:查
//Cursor cursor = db.rawQuery("select * from Student", null);
//通过SQLiteDatabase-API:改
Cursor cursor = db.query("Student",null,null,null,null,null,null);
if (cursor.moveToFirst()){
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
String student = cursor.getString(cursor.getColumnIndex("student"));
Integer age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d("MainActivity","name = " + name);
Log.d("MainActivity","student = " + student);
Log.d("MainActivity","age = " + age);
}while (cursor.moveToNext());
}
cursor.close();
}
Github项目地址: Macardo-MySQLite.