目录
4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置
关于ROOM
Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。
处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备之后重新连接到网络后,用户发起的所有内容更改都会同步到服务器。
1.Room有3个主要的组件
数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。
使用
@Database
注释的类应满足以下条件:
- 是扩展
RoomDatabase
的抽象类。- 在注释中添加与数据库关联的实体列表。
- 包含具有 0 个参数且返回使用
@Dao
注释的类的抽象方法。在运行时,您可以通过调用
Room.databaseBuilder()
或Room.inMemoryDatabaseBuilder()
获取Database
的实例。Entity:表示数据库中的表。
DAO:包含用于访问数据库的方法。
应用使用 Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。然后,应用使用每个 DAO 从数据库中获取实体,然后再将对这些实体的所有更改保存回数据库中。最后,应用使用实体来获取和设置与数据库中的表列相对应的值。
2.Room 不同组件之间的关系如图所示
3.导入ROOM(使用 Room 需要添加依赖)
dependencies {
def room_version = "2.2.0-alpha01"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin
// optional - RxJava support for Room
implementation "androidx.room:room-rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置
1.User.java (必须先创建一个需要映射的实体类,用@Entity进行注解)
@Entity
public class User {
@PrimaryKey
private int uid;
@ColumnInfo(name = "first_name")
private String firstName;
@ColumnInfo(name = "last_name")
private String lastName;
// Getters and setters are ignored for brevity,
// but they're required for Room to work.
}
2.UserDao.java( 创建一个操作实体类的dao接口,用@Dao进行注解)
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
List<User> getAll();
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
List<User> loadAllByIds(int[] userIds);
@Query("SELECT * FROM user WHERE first_name LIKE :first AND "
+ "last_name LIKE :last LIMIT 1")
User findByName(String first, String last);
@Insert
void insertAll(User... users);
@Delete
void delete(User user);
}
3.AppDatabase.java( 创建一个抽象类,添加@Database注解)
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
4.在创建上面的文件之后,使用以下代码获得创建数据库的实例:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
实例demo
1.Student.java
package com.example.applicationroom;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
@Entity
public class Student {
@PrimaryKey(autoGenerate = true) // 设置主键,并且自动生长
private int id;
@ColumnInfo(name = "username") // 设置别名,如果不设置就默认为变量名
private String name;
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2.StudentDao.java
package com.example.applicationroom;
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 StudentDao {// 在这里声明数据库的操作,如增删改查
@Insert
public void insertStudents(Student...students);// 可以传递三个参数
@Update
void updateStudents(Student...students);
@Delete
void deleteStudents(Student...students);
@Query("DELETE FROM STUDENT")
void deleteAllStudents();
@Query("SELECT * FROM STUDENT ORDER BY id ASC") // 升序排列
List<Student> getAllStudents();
}
3.StudentDatabase.java
package com.example.applicationroom;
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {Student.class}, version = 6, exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {
public abstract StudentDao getStudentDao(); // 若有多个 Entity,则应该写多个 Dao
/* private static StudentDatabase mInstance;
public StudentDatabase() { }
public static StudentDatabase getsInstance(Context context) {
if (mInstance == null) {
synchronized (StudentDatabase.class) {
if (mInstance == null) {
mInstance = Room.databaseBuilder(context.getApplicationContext(),
StudentDatabase.class, "StudentDb").fallbackToDestructiveMigration().addMigrations().allowMainThreadQueries().build();
}
}
}
return mInstance;
}*/
}
4.MainActivity.java
package com.example.applicationroom;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;
import java.util.List;
public class MainActivity extends AppCompatActivity {
StudentDatabase studentDatabase;
StudentDao studentDao;
TextView textView;
Button buttonInsert,buttonUpdate,buttonDelete,buttonClear;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView);
// allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做
//studentDatabase = StudentDatabase.getsInstance(this);
//studentDao = studentDatabase.studentDao();
// allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做
studentDatabase = Room.databaseBuilder(this,StudentDatabase.class,"word_database").allowMainThreadQueries().build();
studentDao = studentDatabase.getStudentDao();
updateView();
buttonInsert = findViewById(R.id.buttonInsert);
buttonUpdate = findViewById(R.id.buttonUpdate);
buttonDelete = findViewById(R.id.buttonDelete);
buttonClear = findViewById(R.id.buttonClear);
buttonInsert.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Student student1 = new Student(1,"吴美丽");
Student student2 = new Student(2,"张漂亮");
studentDao.insertStudents(student1,student2);
updateView();
}
});
buttonClear.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
studentDao.deleteAllStudents();
updateView();
}
});
buttonUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Student student3= new Student(3,"马可爱");
studentDao.updateStudents(student3);
updateView();
}
});
buttonDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Student student = new Student(0,"");
studentDao.deleteStudents(student);
updateView();
}
});
}
void updateView(){
List<Student> list = studentDao.getAllStudents();
String text = "";
for(int i = 0; i < list.size(); i++){
Student student= list.get(i);
text += student.getId() + ":" + student.getName() + "\n";
}
textView.setText(text);
}
}
5.activity_main.xml
<?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">
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_begin="188dp" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_editor_absoluteX="-16dp"
tools:layout_editor_absoluteY="51dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<Button
android:id="@+id/buttonUpdate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="UPDATE" />
<Button
android:id="@+id/buttonInsert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="INSERT" />
<Button
android:id="@+id/buttonDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DELETE" />
<Button
android:id="@+id/buttonClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="CLEAR" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
</ScrollView>
</androidx.constraintlayout.widget.ConstraintLayout>
图一:插入数据
图二:清空数据
保存的数据库文件,可以在存储中找到,如图: