欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何在Android中與Room組件

如何在Android中與Room組件?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

創(chuàng)新互聯專注于企業(yè)營銷型網站建設、網站重做改版、臨邑網站定制設計、自適應品牌網站建設、H5響應式網站、商城網站開發(fā)、集團公司官網建設、外貿網站建設、高端網站制作、響應式網頁設計等建站業(yè)務,價格優(yōu)惠性價比高,為臨邑等各大城市提供網站開發(fā)制作服務。

Room其實就是一個orm,抽象了SQLite的使用,但是它作為Android的親兒子orm,并且原生支持LiveData和Rxjava嵌套使用,學習一下還是不錯的。

Room有3個主要組件

  • Database :數據庫

  • Entity : 代表數據庫一個表結構

  • Dao : 包含訪問數據庫的方法

簡單使用

添加Google Maven倉庫

allprojects {
  repositories {
    jcenter()
    google()
  }
}

添加依賴

dependencies {
  // Room
  implementation "android.arch.persistence.room:runtime:1.0.0"
  annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
}

定義數據表實體類

班級表

@Entity(tableName = "tb_class")
public class ClassEntity {
  @PrimaryKey
  private long id;
}

學生表

//指示數據表實體類
@Entity(tableName = "tb_student",//定義表名
    indices = @Index(value = {"name", "sex"}, unique = true),//定義索引
    foreignKeys = {@ForeignKey(entity = ClassEntity.class,
        parentColumns = "id",
        childColumns = "class_id")})//定義外鍵
public class StudentEntity {
  @PrimaryKey //定義主鍵
  private long id;
  @ColumnInfo(name = "name")//定義數據表中的字段名
  private String name;
  @ColumnInfo(name = "sex")
  private int sex;
  @Ignore//指示Room需要忽略的字段或方法
  private String ignoreText;
  @ColumnInfo(name = "class_id")
  private String class_id;
  //setter and getter
}

Entity注解可選參數

public @interface Entity {
 //定義表名
  String tableName() default "";
 //定義索引
  Index[] indices() default {};
 //設為true則父類的索引會自動被當前類繼承
  boolean inheritSuperIndices() default false;
 //定義主鍵
  String[] primaryKeys() default {};
 //定義外鍵
  ForeignKey[] foreignKeys() default {};
}

Index索引注解可選參數

public @interface Index {
 //定義需要添加索引的字段
 String[] value();
 //定義索引的名稱
 String name() default "";
 //true-設置唯一鍵,標識value數組中的索引字段必須是唯一的,不可重復
 boolean unique() default false;
}

ForeignKey外鍵注解可選參數

public @interface ForeignKey {
 //引用外鍵的表的實體
 Class entity();
 //要引用的外鍵列
 String[] parentColumns();
 //要關聯的列
 String[] childColumns();
 //當父類實體(關聯的外鍵表)從數據庫中刪除時執(zhí)行的操作
 @Action int onDelete() default NO_ACTION;
 //當父類實體(關聯的外鍵表)更新時執(zhí)行的操作
 @Action int onUpdate() default NO_ACTION;
 //在事務完成之前,是否應該推遲外鍵約束
 boolean deferred() default false;
 //給onDelete,onUpdate定義的操作
 int NO_ACTION = 1;
 int RESTRICT = 2;
 int SET_NULL = 3;
 int SET_DEFAULT = 4;
 int CASCADE = 5;
 @IntDef({NO_ACTION, RESTRICT, SET_NULL, SET_DEFAULT, CASCADE})
 @interface Action {
  }
}

定義Dao類

@Dao
public interface StudentDao {
  @Query("SELECT * FROM StudentEntity")
  List<StudentEntity> getAll();
  @Query("SELECT * FROM StudentEntity WHERE id IN (:ids)")
  List<StudentEntity> getAllByIds(long[] ids);
  @Insert
  void insert(StudentEntity... entities);
  @Delete
  void delete(StudentEntity entity);
  @Update
  void update(StudentEntity entity);
}

@insert, @Update都可以執(zhí)行事務操作,定義在OnConflictStrategy注解類中

public @interface Insert {
  //定義處理沖突的操作
  @OnConflictStrategy 
  int onConflict() default OnConflictStrategy.ABORT;
}
public @interface OnConflictStrategy {
  //策略沖突就替換舊數據
  int REPLACE = 1;
  //策略沖突就回滾事務
  int ROLLBACK = 2;
  //策略沖突就退出事務
  int ABORT = 3;
  //策略沖突就使事務失敗 
  int FAIL = 4;
  //忽略沖突
  int IGNORE = 5;
}

定義數據庫

@Database(entities = {StudentEntity.class}, version = 1)
public abstract class RoomDemoDatabase extends RoomDatabase {
  public abstract StudentDao studentDao();
}

生成數據庫實例

RoomDemoDatabase database = Room.databaseBuilder(getApplicationContext(),       RoomDemoDatabase.class, "database_name")
        .build();

生成數據庫實例的其他操作

Room.databaseBuilder(getApplicationContext(),
            RoomDemoDatabase.class, "database_name")
            .addCallback(new RoomDatabase.Callback() {
              //第一次創(chuàng)建數據庫時調用,但是在創(chuàng)建所有表之后調用的
              @Override
              public void onCreate(@NonNull SupportSQLiteDatabase db) {
                super.onCreate(db);
              }

              //當數據庫被打開時調用
              @Override
              public void onOpen(@NonNull SupportSQLiteDatabase db) {
                super.onOpen(db);
              }
            })
            .allowMainThreadQueries()//允許在主線程查詢數據
            .addMigrations()//遷移數據庫使用,下面會單獨拿出來講
            .fallbackToDestructiveMigration()//遷移數據庫如果發(fā)生錯誤,將會重新創(chuàng)建數據庫,而不是發(fā)生崩潰
            .build();

數據庫遷移(升級)

Room.databaseBuilder(getApplicationContext(), MyDb.class, "database-name")
    .addMigrations(MIGRATION_1_2, MIGRATION_2_3).build();

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
  @Override
  public void migrate(SupportSQLiteDatabase database) {
    database.execSQL("CREATE TABLE `Fruit` (`id` INTEGER, "
        + "`name` TEXT, PRIMARY KEY(`id`))");
  }
};
static final Migration MIGRATION_2_3 = new Migration(2, 3) {
  @Override
  public void migrate(SupportSQLiteDatabase database) {
    database.execSQL("ALTER TABLE Book "
        + " ADD COLUMN pub_year INTEGER");
  }
};

創(chuàng)建嵌套對象

有時,您希望將一個實體或普通的以前的Java對象(POJO)作為數據庫邏輯中的一個完整的整體來表示,即使該對象包含幾個字段。在這些情況下,您可以使用@Embedded來表示一個對象,您希望將其分解為表中的子字段。然后可以像對其他單個列一樣查詢嵌入式字段

class Address {
  public String street;
  public String state;
  public String city;
  @ColumnInfo(name = "post_code")
  public int postCode;
}
@Entity
class User {
  @PrimaryKey
  public int id;
  public String firstName;
  @Embedded
  public Address address;
}

這樣user表中的字段就包含了 id , firstName , street , state , city , 和 post_code

注意 :嵌入式字段還可以包含其他嵌入式字段

如果一個實體具有相同類型的多個內嵌字段,則可以通過設置前綴屬性(prefix)使每個列保持惟一。然后將所提供的值添加到嵌入對象中每個列名的開頭

 @Embedded(prefix = "foo_")
 Coordinates coordinates;

和 LiveData 一起使用

添加依賴

// ReactiveStreams support for LiveData
implementation "android.arch.lifecycle:reactivestreams:1.0.0"

修改返回類型

@Dao
public interface MyDao {
  @Query("SELECT first_name, last_name FROM user WHERE region IN (:regions)")
  public LiveData<List<User>> loadUsersFromRegionsSync(List<String> regions);
}

和RxJava一起使用

添加依賴

// RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:1.0.0"

修改返回類型

@Dao
public interface MyDao {
  @Query("SELECT * from user where id = :id LIMIT 1")
  public Flowable<User> loadUserById(int id);
}

直接游標訪問

@Dao
public interface MyDao {
  @Query("SELECT * FROM user WHERE age > :minAge LIMIT 5")
  public Cursor loadRawUsersOlderThan(int minAge);
}

類型轉換

定義轉換類,@TypeConverter注解定義轉換的方法

public class Converters {
  @TypeConverter
  public static Date fromTimestamp(Long value) {
    return value == null ? null : new Date(value);
  }
  @TypeConverter
  public static Long dateToTimestamp(Date date) {
    return date == null ? null : date.getTime();
  }
}

@TypeConverters注解,告知數據庫要依賴哪些轉換類

@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
  public abstract UserDao userDao();
}

使用這些轉換器,您可以在其他查詢中使用您的自定義類型,正如您將使用基本類型一樣,如下代碼所示

@Entity
public class User {
  ...
  private Date birthday;
}
@Dao
public interface UserDao {
  ...
  @Query("SELECT * FROM user WHERE birthday BETWEEN :from AND :to")
  List<User> findUsersBornBetweenDates(Date from, Date to);
}

輸出模式

在編譯時,將數據庫的模式信息導出到JSON文件中,這樣可有利于我們更好的調試和排錯

build.gradle
android {
  ...
  defaultConfig {
    ...
    javaCompileOptions {
      annotationProcessorOptions {
        arguments = ["room.schemaLocation":
               "$projectDir/schemas".toString()]
      }
    }
  }
}

關于如何在Android中與Room組件問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯行業(yè)資訊頻道了解更多相關知識。

網頁名稱:如何在Android中與Room組件
文章來源:http://aaarwkj.com/article20/gdiijo.html

成都網站建設公司_創(chuàng)新互聯,為您提供定制開發(fā)、品牌網站制作、網站設計公司ChatGPT、建站公司、云服務器

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

網站建設網站維護公司
青草视频在线播放免费| 亚洲性感人妻系列网站| 三级黄色片免费久久久| 国产一区999精品在线| av天堂五月在线观看| 极品女神福利视频久久| 亚洲香蕉在线视频免费| 91精品国产高清一区二区性色| 人妻少妇精品一区毛二区| 国产精品成人亚洲一区二区| 国产精品国产三级国产av一区| 国产成人亚洲精品午夜国产馆| 亚洲小视频免费在线观看| 99精品热视频在线观看| 日韩 高清 一区二区| 在线播放欧美视频91| 久久婷婷精品国产亚洲av| 国产成人免费视频大全| 中文字幕精品人妻丝袜| 日韩在线国产亚洲精品| 日韩爱爱特级视频中文字幕| 无遮挡国产精品一级二级三级视频| 久久国产国内精品国语对白| 片子免费毛片日韩不卡一区| 亚洲精品深夜福利视频| 日韩中文在线中文网三级| 在线免费观看91亚洲| 欧美精品一区二区三区黄片| 欧美午夜精品福利在线观看| 在线观看一区二区三区国产视频| 欧美内射专区精品一区| 久久久精品免费福利视频| 亚洲一区二区日韩综合久久| 91精品国产综合久蜜臂| 五月综合丁香婷婷久久| 男人喜欢看的免费视频| 欧美日韩一区二区三区久久精品| 日日干天天日夜夜操| 国产激情一区二区三区| 先锋影音女同中文字幕| 日本电影在线看一区二区|