Android 入门第七讲03- SQLite数据库(SQLite数据库概述,使用方法(SQL语法复习,SQLite的增删改查),案例实战-增加查询学生数据)
第一步,导入依赖
implementation 'org.xutils:xutils:3.8.5'
第二步,MainActivity中添加代码
x.Ext.init(getApplication());
x.Ext.setDebug(BuildConfig.DEBUG);// 是否输出debug日志, 开启debug会影响性能.
x.view().inject(this);//没有用到view注解可以先不用
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增加数据"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
原生数据库:通过sql语法来对数据库进行操作
数据库框架-xUtils:通过对对象的操作 来对数据库进行操作
第一步,创建实体类对象 User
使用框架的好处是,我们不需要像之前一样去用sql语法创建表,而是通过在实体类中添加注解表示表名,然后通过实体类中的字段刚好对应上数据库表中的字段,可以通过ture来指定主键
@Table(name = "user")
public class User {
@Column(name = "id", isId = true)
private int id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "age")
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
在对数据库操作前,先创建DaoConfig 对象(作为成员变量)
DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
.setDbName("test.db")
// 不设置dbDir时, 默认存储在app的私有目录.
// .setDbDir(new File("/sdcard")) // "sdcard"的写法并非最佳实践, 这里为了简单, 先这样写了.
.setDbVersion(2)
.setDbOpenListener(new DbManager.DbOpenListener() {
@Override
public void onDbOpened(DbManager db) {
// 开启WAL, 对写入加速提升巨大
db.getDatabase().enableWriteAheadLogging();
}
})
.setDbUpgradeListener(new DbManager.DbUpgradeListener() {
@Override
public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
// TODO: ...
// db.addColumn(...);
// db.dropTable(...);
// ...
// or
// db.dropDb();
}
});
原来增加数据还要用到sql语法,这里直接创建一个DbManager ,然后这个DbManager 可以调用save方法来增加数据,然后这个save里面传的是这个user对象
DbManager db = null;
try {
db = x.getDb(daoConfig);
User user = new User();
user.setUsername("test"+System.currentTimeMillis());
user.setPassword("passwd");
user.setAge(30);
db.save(user);
} catch (DbException e) {
e.printStackTrace();
return;
}
可以发现我们对数据库的操作实际上是对对象的操作,省去了很多sql的语法
查看
Android中SQLite数据库查看推荐博客《Android Studio查看SQLite数据库方法大全》
我们这里 采用SQLite Expert Professional工具来查看
第一步:导出模拟器数据库文件
找到data目录下的—》data目录—》应用程序包名—》databases文件夹下的数据库文件
第二步:查看数据库文件(
打开第一步保存的db文件
找到文件路径
第一步,关闭已经打开的数据库
第二步,重新运行,并且执行修改操作–这里我们执行添加数据
第三步,重新导出db文件
第三步,打开db文件所对应数据库(可以看到我们已经成功添加数据)
在点击事件中添加
DbManager db = null;
try {
db = x.getDb(daoConfig);
User user = new User();
user.setId(2);
db.delete(user);
} catch (DbException e) {
e.printStackTrace();
return;
}
DbManager db = null;
try {
db = x.getDb(daoConfig);
db.delete(User.class,
WhereBuilder.b("age", "=",30));
} catch (DbException e) {
e.printStackTrace();
return;
}
try {
DbManager db = null;
db = x.getDb(daoConfig);
User user = new User();
user.setId(32);
user.setUsername("new user");
user.setPassword("new passwd");
user.setAge(30);
db.saveOrUpdate(user);
// db.update(user);或者用这个方法修改
} catch (DbException e) {
e.printStackTrace();
return;
}
try {
DbManager db = null;
db = x.getDb(daoConfig);
db.update(User.class, WhereBuilder.b("age", "=", 30),
// WhereBuilder.b("id", "=", 1).and("isAdmin", "=", true).,
new KeyValue("username", "test_name"), new KeyValue("password", "new pss"));
} catch (DbException e) {
e.printStackTrace();
return;
}
查询id=32的数据
DbManager db = null;
try {// 删除1
db = x.getDb(daoConfig);
List<User> users = new ArrayList<>();
users= db.selector(User.class).orderBy("id", true).limit(1000).where("id","=",32).findAll();
for (User user : users){
Log.i("testdb","test" + user);
}
} catch (DbException e) {
e.printStackTrace();
return;
}
运行,点击查询
最后我们梳理一下,查询所有数据的操作是,通过创建一个db对象,然后调用它的selector的方法,往里面传一个User.class,表示我们要去User.class这个表里面去查,然后查到的数据自动封装到一个User对象里面,由于我们这个有很多条数据,所以就封装到了一个List集合里面,findAll()就表示查询所有的数据,
我们可以发现这个方法并不带有任何的sql语法
DbManager db = null;
try {// 删除1
db = x.getDb(daoConfig);
List<User> users = new ArrayList<>();
users= db.selector(User.class).findAll();
for (User user : users){
Log.i("testdb","test" + user);
}
} catch (DbException e) {
e.printStackTrace();
return;
}