精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

久久精品国产精品国产精品污| 一区二区福利视频| jizzjizz国产精品喷水| 狠狠狠综合7777久夜色撩人 | 日日碰狠狠添天天爽超碰97| 精品999视频| 国产九九视频一区二区三区| 欧美影院在线播放| 乱h高h女3p含苞待放| 免费欧美视频| 日韩精品一区二| 亚洲福利精品视频| 欧美1o一11sex性hdhd| 西西大胆午夜视频| 综合久久伊人| 欧美性猛交xxxx免费看漫画 | 91福利精品视频| 热久久最新网址| 福利视频在线看| 99精品在线观看视频| 成人免费大片黄在线播放| 久久久国产精品成人免费| 91精品成人| 一区二区在线视频| 五月婷婷综合在线观看| 97se亚洲| 欧美一卡在线观看| 日韩av.com| 欧美三区四区| 色综合久久中文字幕| 中国丰满熟妇xxxx性| 国产超级va在线视频| 国产日韩欧美激情| 欧洲亚洲一区二区| 免费在线超碰| 91蝌蚪porny九色| 高清av免费一区中文字幕| 亚洲专区在线播放| 麻豆国产精品777777在线| 国产精品福利小视频| 日本欧美www| 日韩主播视频在线| 日本一区二区在线播放| 亚洲天堂一区在线观看| 99av国产精品欲麻豆| 久久久久久高潮国产精品视| 激情综合五月网| 亚洲成av人电影| 久久精品在线视频| 中文字幕av播放| 欧美~级网站不卡| 色综合久久中文字幕综合网小说| 亚洲av鲁丝一区二区三区| 91精品推荐| 欧美大胆a视频| 欧美超级乱淫片喷水| 天天操天天爱天天爽| 欧美日韩亚洲国产| 欧美日韩你懂的| 一区二区在线免费看| 日韩电影精品| 欧美一区二区二区| 亚洲自拍偷拍精品| 要久久电视剧全集免费| 伊人成人开心激情综合网| 国产在视频线精品视频| 天天操综合网| 久久久亚洲国产| 丁香六月婷婷综合| 日本特黄久久久高潮| 91免费版网站入口| 国产 日韩 欧美 精品| 91网上在线视频| 亚洲韩国在线| av网站在线免费看推荐| 亚洲成人中文在线| 黄色国产小视频| www.成人| 日韩成人在线播放| 内射毛片内射国产夫妻| 欧美激情日韩| 欧日韩在线观看| 最近中文字幕在线视频| 国产精品99久久久久久有的能看| 精选一区二区三区四区五区| 波多野结衣在线影院| 亚洲精品国产一区二区精华液| 男人日女人逼逼| 涩涩涩久久久成人精品| 亚洲精品成人久久| 亚洲欧美综合7777色婷婷| 国内精品久久久久国产盗摄免费观看完整版| 久久久久久国产精品久久| av一级在线观看| 国产福利一区二区三区| 日韩国产精品一区二区| 日韩免费影院| 欧美无乱码久久久免费午夜一区| 91亚洲一线产区二线产区| 欧美日韩国产传媒| 97在线免费观看| 91资源在线视频| 中文字幕一区图| 免费成人你懂的| 91蜜桃网站免费观看| 韩国中文免费在线视频| 亚洲一二三区视频在线观看| 婷婷六月天在线| 久久99国产精品久久99大师| 色爱精品视频一区| 久久精品视频1| 国产二区国产一区在线观看| 涩涩涩999| 青青青免费在线视频| 日韩视频一区二区三区| 登山的目的在线| 久久久国产亚洲精品| 懂色av一区二区三区在线播放| 91社区在线高清| 色久优优欧美色久优优| 亚洲成人av免费在线观看| 欧美日韩爆操| 亚洲一区制服诱惑| 黄网站免费在线观看| 91福利区一区二区三区| 一级性生活大片| 亚洲免费影院| 九色91视频| 国产白浆在线免费观看| 精品国产自在久精品国产| 永久免费看片视频教学| 美女一区二区久久| 天堂一区二区三区| 日韩免费小视频| 国产视频亚洲视频| 国产黄色免费观看| 久久亚洲二区三区| jizzjizzxxxx| 亚洲最好看的视频| 国产成+人+综合+亚洲欧美丁香花| 手机av在线免费观看| 午夜视频一区二区三区| 免费黄色三级网站| 99精品视频网| 久久国产精品免费一区| а√天堂8资源中文在线| 亚洲福利小视频| 国产午夜激情视频| 91色在线porny| 亚洲精品无码久久久久久| 伊人成综合网伊人222| 国产高清在线不卡| 成年人在线观看视频| 欧美日韩一区小说| 欧美一级特黄高清视频| 国产毛片一区二区| 日韩视频在线视频| 一呦二呦三呦国产精品| 国产精品一区二区三区成人| 欧美日韩在线资源| 欧美一区二区播放| 九九九国产视频| 久久伊人中文字幕| 中文字幕在线观看第三页| 欧美电影免费| 成人欧美一区二区| 欧美裸体视频| 中文字幕欧美在线| 国产农村妇女毛片精品久久| 亚洲国产一区二区三区| 无码人妻精品一区二区三应用大全| 久久国产免费| 一区二区三区四区视频在线观看| 精品久久亚洲| 91精品国产成人| 91精彩视频在线播放| 日韩欧美一区二区免费| 丁香六月婷婷综合| 亚洲人精品一区| 特级西西人体wwwww| 久久er99精品| 欧美在线一区视频| 日韩在线精品| 国产视频精品网| 福利精品在线| 性色av一区二区三区免费| 91短视频版在线观看www免费| 日韩美女视频一区二区在线观看| 9i看片成人免费看片| 亚洲免费成人av| 成年人网站免费看| 国产成人在线影院| 成人午夜激情av| 日韩视频一区二区三区在线播放免费观看| 日韩高清av| 精品淫伦v久久水蜜桃| 国产色视频一区| 国产理论在线| 久久综合九色九九| av男人的天堂在线| 国产丝袜一区二区三区免费视频| av中文字幕免费在线观看| 日韩欧美中文在线| 国产亚洲精品女人久久久久久| 国产欧美日韩在线| japanese在线观看| 国产精品自在在线| 美女网站色免费| 亚洲欧美日本国产专区一区| 青青视频免费在线观看| 久久高清精品| 欧美一区免费视频| 日韩黄色网络| 国产a一区二区| crdy在线观看欧美| 91精品国产自产在线老师啪| 欧美电影免费观看| 97色在线视频| 97人人在线视频| 另类专区欧美制服同性| 91大神在线网站| 国产一区二区动漫| 人操人视频在线观看| 亚洲成人黄色网| 国产丰满美女做爰| 欧美一区二区日韩一区二区| 一本大道伊人av久久综合| 欧美在线视频不卡| 最近免费中文字幕大全免费版视频| 亚洲国产aⅴ成人精品无吗| 成人免费毛片东京热| 亚洲免费观看高清在线观看| 中国一级片在线观看| 中文字幕一区av| 成人无码精品1区2区3区免费看 | 视频一区三区| 精品72久久久久中文字幕| 老司机精品福利在线观看| 牛牛精品成人免费视频| 久精品国产欧美| 日韩伦理一区二区三区| 久久精品成人一区二区三区蜜臀| 玖玖玖免费嫩草在线影院一区| 成人区精品一区二区| 99香蕉久久| 国产一区免费在线| 日韩极品少妇| 欧美三级网色| 色综合蜜月久久综合网| 中文字幕在线中文字幕日亚韩一区| 日韩精品dvd| 2021狠狠干| 欧美特黄a级高清免费大片a级| 国产玉足脚交久久欧美| 亚洲一区不卡| 亚洲人成无码www久久久| 日韩黄色免费电影| 玖玖爱视频在线| 国产一区二区精品久久99| 国产精品日日摸夜夜爽| 92国产精品观看| 久久成人激情视频| 国产精品久久久久久妇女6080| 在线免费观看亚洲视频| 亚洲国产cao| 懂色av中文字幕| 56国语精品自产拍在线观看| 国产熟女精品视频| 日韩成人小视频| av大片在线看| 欧美疯狂xxxx大交乱88av| 天天综合av| 成人福利免费观看| 国内毛片久久| 午夜精品短视频| 欧美激情视频一区二区三区免费| 国产91xxx| 麻豆91在线播放| 国产香蕉精品视频| 国产日韩欧美激情| 久久久久久国产精品免费播放| 激情懂色av一区av二区av| 成人免费一区二区三区| 欧美大片日本大片免费观看| 日本私人网站在线观看| 北条麻妃在线一区二区| 麻豆蜜桃在线观看| 成人网在线视频| 日韩欧美四区| 麻豆一区二区三区在线观看| 亚洲欧美日韩国产| 91丨porny丨九色| 久久精品欧美日韩精品 | 91福利视频久久久久| 精品人妻伦一二三区久久| 亚洲精品中文字| 欧美69xxx| 欧美一乱一性一交一视频| 国产高清精品二区| 日本一区二区三区免费观看| 欧美精品首页| 97超碰成人在线| 91免费视频大全| 久久99久久久| 91精品久久久久久久99蜜桃| 欧美孕妇孕交xxⅹ孕妇交| 欧美精品在线播放| 久久天天久久| 日日骚一区二区网站| 99精品免费网| 中文字幕无人区二| 亚洲免费观看高清完整版在线 | 国产一区在线不卡| 我想看黄色大片| 日韩欧美成人精品| 日本黄色一区二区三区| 久热精品视频在线| **国产精品| 亚洲国产欧美日韩| 天堂成人免费av电影一区| 性欧美丰满熟妇xxxx性久久久| 亚洲欧美日韩在线播放| 在线免费av网| 中文字幕精品网| 性感美女一区二区在线观看| 免费电影一区| av成人毛片| 奇米777第四色| 香蕉乱码成人久久天堂爱免费| 精品人妻午夜一区二区三区四区 | 国产高清日韩| 日本黄色播放器| 六月丁香婷婷久久| 99在线视频免费| 在线观看一区二区精品视频| 美女毛片在线看| 国产精国产精品| 欧美理论在线播放| 国产嫩草在线观看| 中文欧美字幕免费| 91久久精品国产91性色69| 深夜成人在线观看| 亚洲热av色在线播放| 亚洲一区二区三区欧美| 久久99精品久久久| 成人高潮免费视频| 日韩一级二级三级| 黄网av在线| 精品久久久久久乱码天堂| 国产一区二区高清| 国产美女免费无遮挡| 在线观看亚洲一区| 性开放的欧美大片| 亚洲a级在线观看| 好吊视频一区二区三区四区| av天堂一区二区| 一本色道久久综合亚洲精品按摩| 国产香蕉在线| 国产欧美日韩高清| 欧美激情视频一区二区三区在线播放 | 日韩亚洲视频| 精品中文字幕一区二区小辣椒| 51精品免费网站| 日韩欧美一级片| 免费成人在线电影| 亚洲成人自拍| 国产精品正在播放| 日韩乱码一区二区| 一区二区三区视频免费| 成人51免费| 免费看国产曰批40分钟| 欧美经典一区二区三区| 精品国产va久久久久久久| 97av在线视频免费播放| 青青草原综合久久大伊人精品 | 天美av一区二区三区久久| www.日日操| 亚洲美腿欧美偷拍| 亚洲欧美综合在线观看| 91精品国产综合久久久久久久久 | 亚欧在线免费观看| 亚洲三级在线播放| 四虎精品成人影院观看地址| 国产精品人成电影| 亚洲电影在线| 欧美亚洲色综久久精品国产| 亚洲白拍色综合图区| 成人精品一区二区三区电影| 国产情侣第一页| 亚洲国产精品av| 免费观看a视频| 国产精品亚洲美女av网站| 在线国产欧美| 情侣偷拍对白清晰饥渴难耐| 精品无码久久久久久国产| 99热这里有精品| 99视频在线视频| 亚洲aaa精品| 超碰porn在线| 视频三区二区一区|