精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android本地數據存儲之Room詳細使用

移動開發 Android
@Database:Room數據庫對象。該類需要繼承自RoomDatabase,通過Room.databaseBuilder()結合單例設計模式,完成數據庫的創建工作。我們創建的Dao對象,在這里以抽象方法的形式返回,只需一行代碼即可。

Room在SQLite基礎上做了ORM封裝,使用起來類似JPA,不需要寫太多的sql。

準備,導入依賴

//room
def room_version="2.4.2"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
//implementation "androidx.room:room-rxjava2:$room_version"
//implementation "androidx.room:room-rxjava3:$room_version"
//implementation "androidx.room:room-guava:$room_version"
//testImplementation "androidx.room:room-testing:$room_version"
//implementation "androidx.room:room-paging:2.5.0-alpha01"

關鍵注解說明

1、@Database:Room數據庫對象。該類需要繼承自RoomDatabase,通過Room.databaseBuilder()結合單例設計模式,完成數據庫的創建工作。我們創建的Dao對象,在這里以抽象方法的形式返回,只需一行代碼即可。

  • entities:指定該數據庫有哪些表
  • version:指定數據庫版本號,后續數據庫的升級正是依據版本號來判斷的

2、@Entity:該類與Room中表關聯起來。tableName屬性可以為該表設置名字,如果不設置,則表名與類名相同。

3、@PrimaryKey:用于指定該字段作為表的主鍵。

4、@ColumnInfo:設置該字段存儲在數據庫表中的名字并指定字段的類型;默認字段名和屬性名一樣

5、@Ignore:忽略該字段

一、使用步驟

1、創建實體類,對應數據庫中一張表,使用注解@Entity 2、創建Dao接口類,用于操作數據,使用注解@Dao;不需要實現,在編譯的時候,框架會自動生成實現類 3、創建數據庫對象Database,繼承RoomDatabase,使用單例模式返回實例 4、在Activity中使用,Room數據操作必須在異步線程中執行,所以在Activity中使用線程池執行,或者使用RxJava切換線程

使用代碼示例

1、創建實體類,對應數據庫中一張表,使用注解@Entity

@Entity
public class Person {

// 主鍵,自增長
@PrimaryKey(autoGenerate = true)
private int id;
private String name;
private String sex;
private int age;
}

2、創建Dao接口類,用于操作數據,使用注解@Dao;不需要實現,在編譯的時候,框架會自動生成實現類

@Dao
public interface PersonDao {
// 插入
@Insert
void insertPersons(Person... persons);
// 修改
@Update
void updatePersons(Person... persons);
// 刪除所有
@Query("delete from Person")
void deleteAllPersons();
// 刪除指定實體
@Delete
void deletePersons(Person... persons);
// 根據id刪除
@Query("delete from Person where id in (:ids)")
void deleteByIds(int ...ids);
// 根據id查詢
@Query("select * from Person where id in (:ids)")
List<Person> selectByIds(int ...ids);
// 查詢所有
@Query("select * from Person order by id desc")
List<Person> selectAllPersons();
}

3、創建數據庫對象Database,繼承RoomDatabase,使用單例模式返回實例

@Database(entities = {Person.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract PersonDao personDao();

private volatile static AppDatabase instance;

public static AppDatabase getInstance(Context context){
if (instance == null) {
synchronized (DBHelper.class) {
if (instance == null) {
instance = Room.databaseBuilder(context, AppDatabase.class, "person.db").build();
}
}
}
return instance;
}
}

4、在Activity中使用

Room數據操作必須在異步線程中執行,所以在Activity中使用線程池執行

ExecutorService pool = Executors.newCachedThreadPool();

// 插入數據
public void insertRoom(View view){
AppDatabase db = AppDatabase.getInstance(getApplicationContext());

pool.execute(() -> {
PersonDao dao = db.personDao();
Person p1 = new Person("用戶1", "男", 18);
Person p2 = new Person("用戶2", "男", 28);
Person p3 = new Person("用戶3", "男", 38);
dao.insertPersons(p1, p2, p3);
});

}

// 查詢數據
public void queryRoom(View view){

AppDatabase db = AppDatabase.getInstance(getApplicationContext());

pool.execute(() -> {

PersonDao dao = db.personDao();
List<Person> list = dao.selectAllPersons();
list.forEach(p-> Log.d("test", p.toString()));

});
}

// 根據id查詢
public void queryRoomById(View view){

AppDatabase db = AppDatabase.getInstance(getApplicationContext());

pool.execute(() -> {

PersonDao dao = db.personDao();
List<Person> list = dao.selectByIds(3,4);
list.forEach(p-> Log.d("test", p.toString()));

});
}

// 刪除
public void deleteRoom(View view){

AppDatabase db = AppDatabase.getInstance(getApplicationContext());

pool.execute(() -> {

PersonDao dao = db.personDao();
dao.deleteByIds(1,2);
});
}

二、類型轉換器

SQLite支持null,integer,real,text,blob五種數據類型,實際上SQLite也接受varchar,char,decimal等數據類型,只不過在運算中或保存時會轉換成對應的5種數據類型,因此,可以將各種類型數據保存到任何字段中。

除了上述基本類型外,其他如Date、BigDecimal、或Json對象等如何存儲呢?

Room給我們提供的非常方便的類型轉換器功能。

  • @TypeConverter,定義類型轉換靜態方法
  • @TypeConverters,定義包含一組轉換方法的class類

1、創建類型轉換類型,如,Date和Long互轉

使用注解@TypeConverter聲明具體的轉換方法,每個方法必須包含一個參數,以及必須有返回值。

public class DateConverter {

@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null : new Date(dateLong);
}

@TypeConverter
public static Long fromDate(Date date){
return date == null ? null : date.getTime();
}
}

2、將創建好的轉換器類,在entity上使用

使用注解@TypeConverters({DateConverter.class}),那么實體類中的所有的Date屬性都會被轉換成Long存儲,查詢取出的時候,會自動從Long轉換成Date顯示。

注意:@TypeConverters放在元素屬性、Class、Dao、Database上面

  • 放在元素屬性,只對改屬性有效
  • 放在實體Class上,對class中所有元素有效
  • 放在Dao上,對Dao的所有方法有效
  • 放在Database,對Database的所有實體和所有Dao都有效

為避免出現混亂,通常建議只在Entity或屬性上定義轉換器

@Entity
@TypeConverters({DateConverter.class})
public class BsGoods {
private static final long serialVersionUID = 1122172437556010779L;
// 主鍵
@PrimaryKey
private Long id;
private Date createdDate;
private Date updatedDate;

...
}

其他類型轉換示例,BigDecimal轉String。

如果是JavaBean等復雜對象,可以轉換成Json字符串存儲。

public class BigDecimalConverter {

@TypeConverter
public static String toStr(BigDecimal decimal) {
return decimal == null ? null : decimal.toString();
}

@TypeConverter
public static BigDecimal toDecimal(String str) {
return str == null ? null : new BigDecimal(str);
}
}

三、結合RxJava,在Activity中使用,并且更新界面UI元素

Android的界面UI元素更新,必須在主線程中執行,但是Room的數據查詢,又只能使用異常線程處理。那么如何將查詢到數據,更新到頁面控件上面呢?

這里可以結合RxJava實現流式操作,線下切換!

示例代碼,查詢所有商品數據,顯示在頁面控件上面,控件使用的是自定義的TableView,暫不展開,這里只顯示數據查詢以及顯示。

1、在Database類中定義查詢方法,傳入回調函數

public void selectAll(Consumer<List<BsGoods>> fun) {
BsGoodsDao dao = bsGoodsDao();

Observable.just("select")
.map(s -> dao.selectAll())
.subscribeOn(Schedulers.io())// 給上面的操作分配異步線程
.observeOn(AndroidSchedulers.mainThread())// 給終點分配安卓主線程
.subscribe(new Observer<List<BsGoods>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {

}

@Override
public void onNext(@NonNull List<BsGoods> bsGoods) {
fun.accept(bsGoods);
}

@Override
public void onError(@NonNull Throwable e) {

}

@Override
public void onComplete() {

}
});
}

2、在Activity中使用,傳入回調函數更新界面UI

private void initializeTableViewLocal(){
BsGoodsDatabase db = BsGoodsDatabase.getInstance(getContext());
db.selectAll(list -> {
GoodsTableViewModel tableViewModel = new GoodsTableViewModel(list);
TableViewAdapter tableViewAdapter = new TableViewAdapter(tableViewModel);
mTableView.setAdapter(tableViewAdapter);
mTableView.setTableViewListener(new TableViewListener(mTableView));

tableViewAdapter.setAllItems(tableViewModel.getColumnHeaderList(), tableViewModel
.getRowHeaderList(), tableViewModel.getCellList());

});

}


責任編輯:武曉燕 來源: 今日頭條
相關推薦

2011-05-31 17:32:32

Android SharedPref

2010-12-20 09:44:36

SQLite.C#

2022-09-06 09:59:21

數據備份

2013-06-21 10:33:02

虛擬化應用存儲虛擬化

2009-03-06 10:11:30

2023-12-08 08:26:05

數據存儲持久性

2017-09-12 13:13:33

Android遷移測試Room

2018-06-11 12:53:53

LinuxStratis本地存儲

2012-12-24 09:20:48

AndoidUnity3D

2012-04-24 10:08:12

HTML5

2023-11-26 09:06:46

2021-10-27 11:33:31

數據倉庫架構

2022-09-13 15:19:20

服務器云備份存儲

2011-12-02 09:57:50

存儲虛擬化存儲虛擬化

2015-08-06 11:10:46

開源IaaS軟件ZStack本地存儲

2021-05-06 08:04:37

存儲StratisCentos 8

2011-12-05 14:07:17

虛擬化本地存儲桌面虛擬化

2015-07-09 13:47:37

IOSFMDB

2011-03-08 09:58:21

海量數據

2018-03-20 09:36:57

數據倉庫數據存儲知識
點贊
收藏

51CTO技術棧公眾號

www.色就是色| 成人h视频在线观看播放| 妞干网在线免费视频| 深夜福利免费在线观看| 亚洲欧美成人| 这里只有视频精品| 日韩中文字幕免费在线| 成年人三级黄色片| 国产精品7777777| 同性恋视频一区| 91官网在线免费观看| 日本精品二区| 国产男女裸体做爰爽爽| 欧美日韩视频| 亚洲男人天堂2024| 日韩有码免费视频| av网址在线看| 97精品久久久午夜一区二区三区 | 在线观看视频二区| 欧美一区影院| 日韩欧美高清一区| 亚洲乱码中文字幕久久孕妇黑人| 成年人在线视频免费观看| 精品一区二区精品| 91禁国产网站| www.日本高清视频| 波多野结衣一区二区三区免费视频| 午夜a成v人精品| 一本一生久久a久久精品综合蜜| 精品久久国产视频| 久久亚洲二区| 欧美激情免费看| 自拍偷拍中文字幕| 91成人福利社区| 午夜精品免费在线观看| 日韩在线第一区| 色wwwwww| 成人丝袜18视频在线观看| 91免费精品国偷自产在线| www.国产毛片| 国产精品视区| 国内精品免费午夜毛片| 久久国产一级片| 亚洲xxx拳头交| 中文字幕亚洲字幕| 国产三级短视频| 一区二区三区www污污污网站| 亚洲精品一区二区三区中文字幕| 欧美日韩美少妇| 青青青在线视频免费观看| 成年男女免费视频网站不卡| 亚洲精品久久嫩草网站秘色| 国产免费色视频| 在线播放毛片| 国产精品视频看| 欧洲精品久久| 九色在线免费| 国产午夜精品理论片a级大结局 | 68精品久久久久久欧美| 久久久久无码国产精品| 韩日欧美一区| 欧美激情影音先锋| 久久久久亚洲av片无码下载蜜桃| 欧美成人日韩| 久久久噜久噜久久综合| 国产无套粉嫩白浆内谢| 亚洲精品专区| 欧美又大又粗又长| 超碰超碰超碰超碰| 石原莉奈一区二区三区在线观看| 日韩av黄色在线观看| 亚洲成人第一网站| 日产国产欧美视频一区精品| 国产精品男人的天堂| 国产精品熟女久久久久久| 国产一区二区三区四区五区美女| 91免费版黄色| 午夜成人鲁丝片午夜精品| 久久久久久电影| 日韩在线三级| 在线中文字幕电影| 香蕉加勒比综合久久| 欧美牲交a欧美牲交| 欧洲一级精品| 欧美精品丝袜中出| 精品人妻二区中文字幕| 亚洲免费福利一区| 色系列之999| 久久久久久久久97| 午夜久久久久久久久久影院| 国产精品久久久久久久久久10秀| 日韩中文在线中文网三级| 玖玖爱这里只有精品| 亚洲另类自拍| 国产精品视频1区| 亚洲精品综合久久| 国产午夜亚洲精品理论片色戒| 亚洲第一页在线视频| 爱啪啪综合导航| 欧美日韩国产电影| 日韩免费高清一区二区| 日本久久黄色| 国内精品久久久久伊人av| 国产一级片免费视频| 国产精品1024| 日韩欧美三级电影| 黄网站在线观| 欧美日韩亚洲综合一区| 91亚洲一线产区二线产区| 国产一卡不卡| 久久久日本电影| 91精东传媒理伦片在线观看| 99国内精品久久| 国产精品12p| 波多野结衣亚洲| 日韩欧美色综合| 天天摸日日摸狠狠添| 亚洲毛片网站| 91福利入口| www.91在线| 色拍拍在线精品视频8848| 国产黄色一区二区三区| 久久香蕉国产| 日本欧美黄网站| 欧美一级一区二区三区| 亚洲欧洲国产专区| 黄色av免费在线播放| 盗摄系列偷拍视频精品tp| 久久精品成人一区二区三区| 一二三区免费视频| av高清久久久| 真人抽搐一进一出视频| 国产精品99久久免费| 在线观看国产欧美| 性色av免费观看| 97久久精品人人做人人爽| 日韩成人黄色av| 日本精品一区在线观看| 国产一区福利| 欧美第一淫aaasss性| 国产精品丝袜黑色高跟鞋| 国产目拍亚洲精品99久久精品| 欧美在线一区视频| av一级亚洲| 欧美日韩第一页| 99久久久国产精品无码网爆| 中文字幕一区二区在线观看| www.涩涩涩| 成人在线视频免费观看| 国产精品xxx视频| 黄色在线视频观看网站| 日本韩国一区二区三区| 成人片黄网站色大片免费毛片| 亚洲毛片播放| 免费一区二区三区| 性欧美18一19sex性欧美| 国产亚洲欧洲高清一区| 久久影视中文字幕| 国产精品免费网站在线观看| 亚洲精品性视频| 天天操综合网| 99porn视频在线| 91色在线看| 日韩激情视频在线播放| 男人天堂av在线播放| 国产欧美日韩亚州综合| 亚洲成人福利在线| 综合在线视频| 国产精品伊人日日| 黑人巨大精品欧美一区二区桃花岛| 亚洲欧美一区二区三区久久| 成人午夜精品视频| 中文字幕亚洲一区二区va在线| 国产黑丝在线视频| 99国产精品99久久久久久粉嫩| 看欧美日韩国产| 成人四虎影院| 欧美肥老妇视频| 视频在线不卡| 欧美日韩不卡一区二区| 欧美日韩成人免费观看| 99久久精品免费看国产免费软件| 狠狠爱免费视频| 999久久久国产精品| 国产激情美女久久久久久吹潮| 在线观看福利电影| 久久久999精品视频| 欧美黄色一级生活片| 国产成人福利av| 57pao精品| 麻豆网在线观看| 亚洲精品一区二区精华| 青青艹在线观看| 一区二区三区欧美日韩| 手机在线看片日韩| 蜜桃精品在线观看| 日韩一区二区高清视频| 九九综合在线| 69174成人网| 成人免费影院| 九九久久综合网站| 黄色大片在线看| 日韩欧美123| 美女黄页在线观看| 亚洲一区在线观看网站| 日本理论中文字幕| av一区二区三区在线| 午夜精品免费看| 欧美综合二区| 99久久久精品视频| 韩日一区二区三区| 成人看片视频| 在线高清欧美| 国产成人免费av电影| 超黄网站在线观看| 久久精品视频在线观看| 国内精品在线视频| 亚洲国产精品999| 国产毛片毛片毛片毛片| 色欧美片视频在线观看| 日韩欧美大片在线观看| 亚洲蜜臀av乱码久久精品蜜桃| 女人又爽又黄免费女仆| 99在线热播精品免费| 91视频福利网| 久久狠狠亚洲综合| 北条麻妃视频在线| 羞羞答答国产精品www一本| 国产在线xxxx| 亚洲va在线| 一区二区三区四区久久| 欧美日韩一二| 日本午夜精品电影| 中文有码一区| 久久精品人人做人人爽电影| 综合伊人久久| 成人综合电影| 91成人短视频| 成人免费观看网站| 香蕉大人久久国产成人av| 91精品在线播放| 欧美成人xxxx| 91九色视频在线| 久久久久无码国产精品| 99精品视频一区二区三区| 国产女主播在线播放| 国产白丝网站精品污在线入口| 日本高清久久久| 寂寞少妇一区二区三区| 不用播放器的免费av| 精品一区二区三区在线播放视频| 特级丰满少妇一级| 黄网站免费久久| 在线黄色免费看| 精品一区二区三区蜜桃| 国产农村妇女精品久久| 国产精品亚洲第一区在线暖暖韩国| 天堂av在线8| 国产精品一区二区在线播放| 免费高清视频在线观看| 国产福利一区二区三区视频在线| 熟妇无码乱子成人精品| 国产不卡视频一区二区三区| 亚洲av午夜精品一区二区三区| 成人精品视频一区| 国产伦精品一区三区精东| 成人福利视频在线看| 男女一区二区三区| 久久女同互慰一区二区三区| 永久免费毛片在线观看| 中文字幕日韩av资源站| 全程偷拍露脸中年夫妇| 亚洲一二三区在线观看| 91看片在线播放| 色素色在线综合| 中文字幕日韩国产| 日韩美一区二区三区| 天天干天天色天天| 在线播放国产精品| av毛片在线| 欧美在线视频观看免费网站| 91精品国产66| 99久re热视频这里只有精品6| 欧美自拍一区| 亚洲激情图片| 午夜久久福利| 日韩欧美精品在线观看视频| 久久99久国产精品黄毛片色诱| 无码人妻丰满熟妇区毛片蜜桃精品 | 久久6免费高清热精品| 超碰91在线观看| 国产精品欧美一区二区三区奶水| www.成人在线.com| 国语精品中文字幕| 久久精品国产大片免费观看| 男人天堂a在线| 欧美aaa在线| 亚洲一区二区三区黄色| 国产精品亲子伦对白| 久久视频免费在线观看| 免费人成黄页网站在线一区二区| 国产一区二区三区奇米久涩 | 国产精品一区二区无线| 日韩av在线看免费观看| 亚洲天天做日日做天天谢日日欢| 在线观看国产亚洲| 宅男在线国产精品| 欧洲成人av| 久久久久久久国产| 日韩成人综合网站| 久久爱av电影| 真实国产乱子伦精品一区二区三区| 国产精品视频一区二区三区四区五区| 韩国三级在线一区| 久久久久久久久久久久久久久| 艳妇臀荡乳欲伦亚洲一区| 国产视频1区2区| 亚洲成人性视频| 男人天堂久久久| 国产精品91一区| 欧美福利在线播放网址导航| 在线观看污视频| 久久se这里有精品| 阿v天堂2014| 色综合久久中文字幕| 少妇人妻偷人精品一区二区| 欧美成人午夜激情| 国产欧美自拍| 日韩理论片在线观看| 亚洲国产mv| 69xxx免费视频| 亚洲美女一区二区三区| 亚洲无码精品在线播放| 亚洲香蕉av在线一区二区三区| 国产白浆在线免费观看| 风间由美久久久| 欧美va天堂在线| 在线观看视频在线观看| 国产精品国产三级国产有无不卡 | 日本一区视频在线| 国产毛片一区| 国产毛片毛片毛片毛片毛片毛片| 亚洲高清在线视频| 欧美亚洲精品在线观看| 97久久精品视频| 性人久久久久| 男人的天堂日韩| 国产欧美一区二区三区沐欲| 日韩xxx视频| 搡老女人一区二区三区视频tv| 日本欧美韩国| 中文字幕剧情在线观看一区| 国产又黄又大久久| 久久久久免费看| 日韩av在线导航| 欧美gay囗交囗交| 日韩欧美三级一区二区| 久久91精品国产91久久小草| 欧美日韩午夜视频| 欧美成人综合网站| 9999在线视频| 欧美一区国产一区| 91国产精品一区| 伊人久久久久久久久久| 成人免费一区| 日本高清xxxx| 成人激情免费电影网址| 九九热精品视频在线| 一本色道久久综合亚洲精品小说| 福利精品在线| 欧美精品在欧美一区二区| 91在线你懂得| 自拍偷拍精品视频| 欧美成人精品在线视频| 国内精品免费| 中文字幕第80页| 亚洲精品成人悠悠色影视| 色偷偷在线观看| 国产精品欧美激情在线播放| 欧美aa国产视频| 中文字幕丰满乱子伦无码专区| 欧美少妇性性性| 99在线视频影院| 欧美在线一二三区| 国内精品伊人久久久久av影院 | 国产精品大尺度| 国产伦精品一区二区三区视频痴汉 | 欧美国产日韩一区二区在线观看| 亚洲午夜免费| 亚洲五月天综合| 自拍偷拍欧美精品| 网站黄在线观看| 国产va免费精品高清在线观看| 国产精品久久久久9999赢消| 一个人看的视频www| 精品国产91乱高清在线观看| 国产在线视频你懂得| 91中文在线视频| 中文精品在线| 中文字幕资源站|