Andriod --- JetPack (六):Room 增删改查

44 阅读1分钟
<androidx.constraintlayout.widget.Guideline

    android:id="@+id/guideline4"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:orientation="vertical"

    app:layout_constraintGuide_percent="0.5" />



<Button

    android:id="@+id/button7"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:onClick="mInsert"

    android:text="增加"

    app:layout_constraintBottom_toTopOf="@+id/guideline2"

    app:layout_constraintEnd_toStartOf="@+id/guideline4"

    app:layout_constraintStart_toStartOf="parent"

    app:layout_constraintTop_toTopOf="parent" />



<Button

    android:id="@+id/button8"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:onClick="mUpdate"

    android:text="修改"

    app:layout_constraintBottom_toTopOf="@+id/guideline2"

    app:layout_constraintEnd_toEndOf="parent"

    app:layout_constraintStart_toStartOf="@+id/guideline4"

    app:layout_constraintTop_toTopOf="parent" />



<Button

    android:id="@+id/button9"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:onClick="mDelete"

    android:text="删除"

    app:layout_constraintBottom_toTopOf="@+id/guideline3"

    app:layout_constraintEnd_toStartOf="@+id/guideline4"

    app:layout_constraintStart_toStartOf="parent"

    app:layout_constraintTop_toTopOf="@+id/guideline2" />



<Button

    android:id="@+id/button10"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:onClick="mQuery"

    android:text="查询"

    app:layout_constraintBottom_toTopOf="@+id/guideline3"

    app:layout_constraintEnd_toEndOf="parent"

    app:layout_constraintStart_toStartOf="@+id/guideline4"

    app:layout_constraintTop_toTopOf="@+id/guideline2" />



<androidx.recyclerview.widget.RecyclerView

    android:id="@+id/rv_01"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    app:layout_constraintEnd_toEndOf="parent"

    app:layout_constraintStart_toStartOf="parent"

    app:layout_constraintTop_toTopOf="@+id/guideline3" />

</androidx.constraintlayout.widget.ConstraintLayout>




item.xml



<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="schemas.android.com/apk/res/and…"

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="wrap_content">



<androidx.constraintlayout.widget.Guideline

    android:id="@+id/guideline"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:orientation="vertical"

    app:layout_constraintGuide_percent="0.2" />



<androidx.constraintlayout.widget.Guideline

    android:id="@+id/guideline5"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:orientation="vertical"

    app:layout_constraintGuide_percent="0.8" />



<TextView

    android:id="@+id/tvId"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="1"

    app:layout_constraintBottom_toTopOf="@+id/guideline7"

    app:layout_constraintEnd_toStartOf="@+id/guideline"

    app:layout_constraintStart_toStartOf="parent"

    app:layout_constraintTop_toTopOf="parent" />



<TextView

    android:id="@+id/name"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Jack"

    app:layout_constraintBottom_toTopOf="@+id/guideline7"

    app:layout_constraintEnd_toStartOf="@+id/guideline5"

    app:layout_constraintStart_toStartOf="@+id/guideline"

    app:layout_constraintTop_toTopOf="parent" />



<TextView

    android:id="@+id/age"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="18"

    app:layout_constraintBottom_toTopOf="@+id/guideline7"

    app:layout_constraintEnd_toEndOf="parent"

    app:layout_constraintStart_toStartOf="@+id/guideline5"

    app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>




首先创建实体类Student.java



package com.example.room;

import androidx.room.ColumnInfo;

import androidx.room.Entity;

import androidx.room.Ignore;

import androidx.room.PrimaryKey;

@Entity(tableName = "student")

public class Student {

@PrimaryKey(autoGenerate = true)

@ColumnInfo(name = "id", typeAffinity = ColumnInfo.INTEGER)

public int id;



@ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT)

public String name;



@ColumnInfo(name = "age", typeAffinity = ColumnInfo.INTEGER)

public int age;



public Student(int id, String name, int age) {

    this.id = id;

    this.name = name;

    this.age = age;

}

@Ignore

public Student(String name, int age) {

    this.name = name;

    this.age = age;

}

@Ignore

public Student(int id) {

    this.id = id;

}

}




StudentDao.java



package com.example.room;

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

void insertStudent(Student... students); // 可以传入多个 Student



@Delete

void deleteStudent(Student... students);



@Update

void updateStudent(Student... students);



@Query("SELECT * FROM student")

List<Student> getAllStudent();



@Query("SELECT * FROM student WHERE id = :id")

List<Student> getStudentById(Integer id);

}




MyDataBase.java



package com.example.room;

import android.content.Context;

import androidx.room.Database;

import androidx.room.Room;

import androidx.room.RoomDatabase;

// 一定是抽象类

@Database(entities = {Student.class}, version = 1, exportSchema = false)

public abstract class MyDataBase extends RoomDatabase {

private static final String DATABASE_NAME = "my_db.db";

private static MyDataBase mInstance;



// 构建 database 单例

public static synchronized MyDataBase getInstance(Context context) {

    if(mInstance == null) {

        mInstance = Room.databaseBuilder(context.getApplicationContext(), MyDataBase.class, DATABASE_NAME)

                //.allowMainThreadQueries() // 允许在主线程操作数据库

                .build();

    }

    return mInstance;

}

public abstract StudentDao getStudentDao();

}




StudentRecycleViewAdapter.java



package com.example.room;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

import androidx.annotation.NonNull;

import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class StudentRecycleViewAdapter extends RecyclerView.Adapter<StudentRecycleViewAdapter.MyViewHolder> {

List<Student> students;



public void setStudents(List<Student> students) {

    this.students = students;

}



public StudentRecycleViewAdapter(List<Student> students) {

    this.students = students;

}



@NonNull

@Override

public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View root = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent, false);

    return new MyViewHolder(root);

}



@Override

public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {

    Student student = students.get(position);



    holder.tvId.setText(String.valueOf(student.id));

    holder.name.setText(student.name);

    holder.age.setText(String.valueOf(student.age));

}



@Override

public int getItemCount() {

    return students == null ? 0 :students.size();

}



public class MyViewHolder extends RecyclerView.ViewHolder {

    private TextView tvId, name, age;



    public MyViewHolder(View view) {

        super(view);

        tvId = view.findViewById(R.id.tvId);

        name = view.findViewById(R.id.name);

        age = view.findViewById(R.id.age);

    }

}

}




MainActivity.java



package com.example.room;

import androidx.appcompat.app.AppCompatActivity;

import androidx.recyclerview.widget.LinearLayoutManager;

import androidx.recyclerview.widget.RecyclerView;

import android.os.AsyncTask;

import android.os.Bundle;

import android.view.View;

import java.util.ArrayList;

import java.util.List;

public class MainActivity extends AppCompatActivity {

private StudentRecycleViewAdapter adapter;

private StudentDao studentDao;



@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);



    List<Student> students = new ArrayList<>();

    RecyclerView recyclerView = findViewById(R.id.rv_01);



    adapter = new StudentRecycleViewAdapter(students);

    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    recyclerView.setAdapter(adapter);



    MyDataBase myDataBase = MyDataBase.getInstance(this);

    studentDao = myDataBase.getStudentDao();



}

// Room 不允许在主线程操作数据库,如果非在主线程操作数据库,请修改 MyDataBase 文件



// 增加

public void mInsert(View view) {

    Student s1 = new Student("Jack", 20);

    Student s2 = new Student("Rose", 22);

    new  InsertStudentTask(studentDao).execute(s1,s2);

}



// 删除

public void mDelete(View view) {

    Student s1 = new Student(1);

    new DeleteStudentTask(studentDao).execute(s1);

}



// 修改

public void mUpdate(View view) {

    Student s1 = new Student(3, "Jason", 21);

    new UpdateStudentTask(studentDao).execute(s1);

}



// 查询

public void mQuery(View view) {

    new GetAllStudentTask(studentDao).execute();

}



// 异步线程添加学生

class InsertStudentTask extends AsyncTask<Student, Void, Void> {

    private StudentDao studentDao;



    public InsertStudentTask(StudentDao studentDao) {

        this.studentDao = studentDao;

    }



    @Override

    protected Void doInBackground(Student... students) {

        studentDao.insertStudent(students);

        return null;

    }

}



// 异步修改学生

class UpdateStudentTask extends AsyncTask<Student, Void, Void> {

    private StudentDao studentDao;



    public UpdateStudentTask(StudentDao studentDao) {

        this.studentDao = studentDao;

    }



    @Override

    protected Void doInBackground(Student... students) {

        studentDao.updateStudent(students);

        return null;

    }

}



// 异步删除学生

class DeleteStudentTask extends AsyncTask<Student, Void, Void> {

    private StudentDao studentDao;



    public DeleteStudentTask(StudentDao studentDao) {

        this.studentDao = studentDao;

    }



    @Override

    protected Void doInBackground(Student... students) {

        studentDao.deleteStudent(students);

        return null;

    }

}



// 异步获取学生信息

class GetAllStudentTask extends AsyncTask<Student, Void, Void> {

    private StudentDao studentDao;



    public GetAllStudentTask(StudentDao studentDao) {

        this.studentDao = studentDao;

    }