运行 Database Inspector 需要在API Level 26 或者更高的设备上。Database Inspector是一个动态数据库工具,可以查询和修改表数据,执行查询语句,执行 Dao 文件中定义的 Room 查询语句。
在这个工具类中我们同时也建了一个表
后续用这个工具类可以进行增删改查的操作
public class OpenSqlHelper extends SQLiteOpenHelper {
// name -> 数据库名字
public OpenSqlHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
// 建表
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user(id integer primary key autoincrement,username varchar(20),password varchar(20),age integer) ");
}
// 更新表
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
首先我们在activity_main.xml布局文件中增加四个按钮来设置点击之后增删改查的操作
activity_main.xml
<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:layout_marginTop="126dp"
android:text="增加数据"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:layout_marginEnd="1dp"
android:layout_marginRight="1dp"
android:text="删除数据"
app:layout_constraintEnd_toEndOf="@+id/button"
app:layout_constraintTop_toBottomOf="@+id/button" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginLeft="1dp"
android:layout_marginTop="49dp"
android:text="查询数据"
app:layout_constraintStart_toStartOf="@+id/button2"
app:layout_constraintTop_toBottomOf="@+id/button2" />
androidx.constraintlayout.widget.ConstraintLayout>
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 增加数据
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase= openSqlHelper.getWritableDatabase();
// ContengValues->HashMap
ContentValues contentValues=new ContentValues();
contentValues.put("username","a碟");
contentValues.put("password","123456");
contentValues.put("age",19);
sqLiteDatabase.insert("user",null,contentValues);
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase=openSqlHelper.getWritableDatabase();
String id="1";
String username="a碟";
sqLiteDatabase.delete("user","id=? and username = ?",new String[]{
id,username});
}
});
findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase = openSqlHelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("username","b碟");
String id="5";
sqLiteDatabase.update("user",contentValues,"id= ?",new String[]{
id});
}
});
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase = openSqlHelper.getWritableDatabase();
String username="a碟";
Cursor cursor=sqLiteDatabase.query("user",null,"username = ?",new String[]{
username},null,null,null);
while(cursor.moveToNext()){
String username1=cursor.getString(cursor.getColumnIndex("username"));
int id1=cursor.getInt(cursor.getColumnIndex("id"));
Log.i("MainActivity","username= "+username1+" id = "+id1);
}
}
});
Room是谷歌官方的数据库ORM(对象关系映射)框架,使用起来非常方便。
Room提供了一个SQLite之上的抽象层,使得在充分利用SQLite功能的前提下顺畅的访问数据库。
首先新建一个接口UserDao
这个接口中写了需要的增删改查方法,并在对应的位置标记了对应的注解。
在添加注解的时候爆红,光标点击在对应的爆红的位置按住alt+enter即可选择导入依赖
在DAO(data access object)中,可以使用SQL语句进行对数据库的操作并且将这些语句与Java中方法关联调用,编译器会检查SQL语句并且通过注解生成对应的查询语句,例如@Insert。
注意:
1、DAO必现是抽象类或者接口
2、所有的查询语句必须在单独的线程里面执行。
package com.hnucm.android_05_27;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao
public interface UserDao {
//提供表的增删改查方法
@Insert
void addUser(User user);
@Delete
void deleteUser(User user);
@Update
void update(User user);
@Query("select * from user")
List<User> find();
@Query("select * from user where id = :id")
List<User> findAllUserById(int id);
// 模糊搜索
@Query("select * from user where username like '%' || :name ||'%'")
List<User>findAllUsersByName(String name);
}
抽象类UserDatabase
package com.hnucm.android_05_27;
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {
User.class},version = 1,exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {
public abstract UserDao getUserDao();
}
java类User,User的属性与数据库中的字段需要一一对应
Room Database中的Entity表示一张数据表结构,一个Entity实例就是表中的一行,如定义一个User类的Entity。
重点:
1、一个Entity对象代表数据表中的一行,一个Entity类代表一张数据表。
2、Entity中的成员变量都是数据表中的列。
3、一个Java类定义成Entity只要加上Entity注解就可以了。
package com.hnucm.android_05_27;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
//与数据库中的字段一一对应
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name="username")
public String username;
public String password;
public int age;
}
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user=new User();
user.username="test123";
user.password="123456";
user.age=20;
userDao.addUser(user);
}
});
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user=new User();
user.username="test123";
userDao.deleteUser(user);
}
});
findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user=new User();
user.username="test222";
user.id=5;
userDao.update(user);
}
});
1.普通查询
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<User>userList=userDao.find();
for(User user:userList){
Log.i("MainActivity","id = "+user.id+"username = "+user.username);
}
}
});
2.按照id查询
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int id=2;
List<User>userList=userDao.findAllUserById(id);
for(User user:userList){
Log.i("MainActivity","id = "+user.id+"username = "+user.username);
}
}
});
3.模糊查询
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<User>userList=userDao.findAllUsersByName("test");
for(User user:userList){
Log.i("MainActivity","id = "+user.id+"username = "+user.username);
}
}
});
根据以上几个案例,我们发现使用room框架基于注解开发,非常简单的就完成了增删改查的操作。