導入依賴
def roomVersion = "2.3.0" implementation("androidx.room:room-runtime:$roomVersion") annotationProcessor("androidx.room:room-compiler:$roomVersion")
實體類
@Entity(tableName = "user" )//tableName設置表名 public class User { //主鍵 自增 @PrimaryKey(autoGenerate = true) private int uid; //唯一性 @ColumnInfo(index = true) private String name; //屬性名稱改為 "pass_word" @ColumnInfo(name = "pass_word") @NonNull private String passWord; private String tag; @ColumnInfo(name = "is_online") private Boolean isOnline; public User() { } //不加忽略注解會出現 There are multiple good constructors and Room will ... 問題 @Ignore public User(String name, String passWord, String tag) { this.name = name; this.passWord = passWord; this.tag = tag; this.isOnline = false; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } ...... }
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 name LIKE :name AND " + "pass_word LIKE :passWord LIMIT 1") User findByName(String name, String passWord); @Query("SELECT * FROM user WHERE is_online LIKE :online LIMIT 1") User findByOnline(Boolean online); //改 @Update void updateUser(User user); //增 //OnConflictStrategy.REPLACE:取代舊數據同時繼續事務。 //OnConflictStrategy.ROLLBACK:回滾事務。@Deprecated //OnConflictStrategy.ABORT:終止事務。 //OnConflictStrategy.FAIL:事務失敗。@Deprecated //OnConflictStrategy.IGNORE:忽略沖突。 @Insert(onConflict = OnConflictStrategy.IGNORE) //可以返回long別返回int會出現 Not sure how to handle insert method's return type問題 long insert(User users); @Insert(onConflict = OnConflictStrategy.IGNORE) void insert(User... users); //刪 @Delete void delete(User user); @Query("DELETE FROM user where name=:name") void delete(String name); }
AppDatabase
//Room數據庫不能在主線程中進行操作,需要新開子線程 //如果出現 Schema export directory is not provided to the annotation processor so we cannot export the schema. You can either provide room.schemaLocation annotation processor argument OR set exportSchema to false. //在build gradle中添加(推薦) // // android { // ... // defaultConfig { // ... // javaCompileOptions { // annotationProcessorOptions { // arguments = ["room.schemaLocation": // "$projectDir/schemas".toString()] // } // } // } // } @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
使用
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build(); db.userDao().insert(new User());