Android Room的學習之關聯表

Room學習三部曲

Android Room的學習之基本使用
Android Room的學習之關聯表
Android Room的學習之數據庫升級

上一篇我們已經簡單的學習Room的使用,這一篇我們就來學習一下Room多表關聯,讓我們對Room有更多的瞭解。

在瞭解Room多表關聯之前,我們需要學習一下Room裏邊的註解的意思

實體類註解
@Entity

  tableName 表示表的名稱
  @Entity(tableName = "keyvalue_table")

  @Entity 默認表的名稱就是類的名稱
  public class Student {}

@PrimaryKey

  每個實體必須定義至少1個主鍵.
  autoGenerate = true,默認爲false
  @PrimaryKey(autoGenerate = true)
  public int sId;

@ColumnInfo

  註解設置成員對應的列名。如果你覺得成員變量名就本身就可以作爲列名,也可以不設置。
  @ColumnInfo(name = "age")
  public int age;

@Ignore

  Ignore表示不加入表中, 默認全部加入到表中字段
  @Ignore(name = "sex")
  public int sex;

@ForeignKey

 Student實體類的sId和Book實體類的studentId相關聯
 註解中包含Delete = CASCADE, 你可以告訴SQLite,如果相應的Student實例被刪除,那麼刪除這個Student下的所有book。
 @Entity(foreignKeys = @ForeignKey(entity = Student.class,
        parentColumns = "sId",
        childColumns = "studentId"
        ,onDelete = CASCADE))
 public class Book {
 
    @ColumnInfo(name = "studentId")
    public String studentId;
    
 }

例子:

實體類Student

@Entity
public class Student {

    @PrimaryKey(autoGenerate = true)
    public int sId;

    @ColumnInfo(name = "name")
    public String name;

    @ColumnInfo(name = "age")
    public int age;

    public int getId() {
        return sId;
    }

    public void setId(int sId) {
        this.sId = sId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

StudentDao.java

@Dao
public interface StudentDao {

    @Query("SELECT * FROM Student")
    List<Student> getAll();

    @Query("SELECT * FROM Student WHERE sId IN (:userIds)")
    List<Student> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM Student WHERE age=:age")
    List<Student> getStudentByAge(int age);

    @Query("SELECT * FROM Student WHERE age=:age LIMIT :max")
    List<Student> getStudentByAge(int max, int... age);

    @Query("SELECT * FROM Student WHERE sId =:sId")
    Student getStudent(int sId);

    @Insert
    void insertAll(Student... users);

    @Update
    void updateStudent(Student... users);

    @Delete
    void delete(Student user);

}

實體類Book 重點重點重點 關於外鍵看註解

@Entity(foreignKeys = @ForeignKey(entity = Student.class, parentColumns = "sId", childColumns = "studentId",onDelete = CASCADE))
public class Book {

    @PrimaryKey(autoGenerate = true)
    public int bookId;

    @ColumnInfo(name = "bookName")
    public String bookName;

    @ColumnInfo(name = "studentId")
    public String studentId;

    public int getBookId() {
        return bookId;
    }

    public void setBookId(int bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }
}
@Dao
public interface BookDao {

    @Query("SELECT * FROM Book")
    List<Book> getAll();

    @Query("SELECT * FROM Book WHERE studentId IN (:bookId)")
    List<Book> loadAllByIds(int[] bookId);

    @Query("SELECT * FROM Book WHERE studentId =:studentId")
    Book getBook(String studentId);

    @Insert
    void insert(Book... users);

    @Update
    void update(Book... users);

    @Delete
    void delete(Book user);

    //使用內連接查詢
    @Query("SELECT studentId,name,bookName,bookId,age  from Student INNER JOIN Book ON Student.sId = Book.studentId")
    List<Combination> getFromCompany();

}

外鍵查詢 組合類

public class Combination {

    public String name;
    public int age;

    public int bookId;

    public String bookName;

    public String studentId;

    public int getBookId() {
        return bookId;
    }

    public void setBookId(int bookId) {
        this.bookId = bookId;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getStudentId() {
        return studentId;
    }

    public void setStudentId(String studentId) {
        this.studentId = studentId;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
@Database(entities = {Student.class,Book.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

    private static final String DB_NAME = "StudentDatabase.db";
    private static volatile AppDatabase instance;

    static synchronized AppDatabase getInstance(Context context) {
        if (instance == null) {
            instance = create(context);
        }
        return instance;
    }

    private static AppDatabase create(final Context context) {
        return Room.databaseBuilder(
                context,
                AppDatabase.class,
                DB_NAME).build();
    }

    public abstract StudentDao studentDao();

    public abstract BookDao bookDao();
}

添加數據

  StudentDao mStudentDao = db.studentDao();
  Student mStudent = new Student();
  mStudent.setId(i);
  mStudent.setAge(56 + i);
  mStudent.setName("張三" + i);
  mStudentDao.insertAll(mStudent);

  BookDao mBookDao = db.bookDao();
  Book mBook = new Book();
  mBook.setBookName("物理" + i);
  mBook.setStudentId(i + "");
  mBookDao.insert(mBook);

查詢數據

 private void findAge2Book() {
        RxJavaUtils.executeAsyncTask(new RxAsyncTask<BookDao, List<Combination>>(db.bookDao()) {

            @Override
            public List<Combination> doInIOThread(BookDao mBookDao) {
                return mBookDao.getFromCompany();
            }

            @Override
            public void doInUIThread(List<Combination> o) {
                for (Combination mCombination : o) {
                    Log.e("doInUIThread", "doInUIThread getAge   " + mCombination.getAge());
                    Log.e("doInUIThread", "doInUIThread getName  " + mCombination.getName());

                    Log.e("doInUIThread", "doInUIThread getBookName   " + mCombination.getBookName());
                    Log.e("doInUIThread", "doInUIThread getStudentId  " + mCombination.getStudentId());
                    Log.e("doInUIThread", "doInUIThread getBookId  " + mCombination.getBookId());
                }

            }
        });
    }

截圖
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章