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());
}
}
});
}
截圖