国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

2017-09-12 13:13:33

Android遷移測試Room

2023-12-08 08:26:05

數據存儲持久性

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-05 14:07:17

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

2015-08-06 11:10:46

開源IaaS軟件ZStack本地存儲

2011-12-02 09:57:50

存儲虛擬化存儲虛擬化

2021-05-06 08:04:37

存儲StratisCentos 8

2015-07-09 13:47:37

IOSFMDB

2011-03-08 09:58:21

海量數據

2018-03-20 09:36:57

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

51CTO技術棧公眾號

一区二区三区在线观看动漫| 99综合在线| 亚州成人在线电影| 国产女教师bbwbbwbbw| 激情婷婷综合| 综合久久五月天| 青青青青在线| 国产精品欧美精品| 男人的天堂成人| 永久91嫩草亚洲精品人人| 色综合老司机第九色激情| 好久没做在线观看| 欧美日韩一区二区欧美激情| 欧美日韩中文不卡| 日韩一区精品视频| 51精品国产人成在线观看| 老司机精品视频在线播放| 色播久久人人爽人人爽人人片视av| av中文字幕一区二区三区| 亚洲欧洲精品一区二区三区| 国产成人无码一二三区视频| 久久av资源网| 亚洲精品一区二区三区樱花 | 成人免费观看男女羞羞视频| 欧美另类一区| 日韩电影免费在线观看网站| 欧美高清性xxxxhd| 日本最新不卡在线| 日本高清不卡三区| 亚洲一区欧美激情| 免费观看亚洲视频| 国产欧美一区视频| 2018高清国产日本一道国产| 亚洲一线二线三线视频| 日韩大胆人体| 欧美一区二区视频网站| 超碰超碰人人人人精品| 久久九九热免费视频| 羞羞答答一区二区| 亚洲a∨日韩av高清在线观看| 激情综合亚洲| 无码人妻丰满熟妇区96| 亚洲欧洲精品天堂一级| av网站大全在线观看| 精品美女被调教视频大全网站| 久草免费在线视频| 午夜精品国产精品大乳美女| 亚洲香蕉av| 国产h视频在线播放| 欧美日韩在线免费观看| 日本色护士高潮视频在线观看| 久久精品美女视频网站| 亚洲性图久久| av丝袜天堂网| 精品国产凹凸成av人导航| 国产精品xxx在线观看| 国产麻豆乱码精品一区二区三区 | 欧美大香线蕉线伊人久久国产精品| 日日欢夜夜爽一区| 色偷偷免费视频| 精品亚洲男同gayvideo网站| 国产亚洲精品美女久久久久久久久久| 日本视频一区二区在线观看| 国产不卡高清在线观看视频| h视频网站在线观看| 日韩av免费在线播放| 国产激情91久久精品导航| 免费a在线观看| 国产69精品久久久久9999| 六十路在线观看| 欧美性生交xxxxx久久久| 成人一区福利| 亚洲精蜜桃久在线| 7777精品伊人久久久大香线蕉| 国产精品久久久网站| 国产精品999视频| 亚洲第一精品电影| 国产精品久久久免费| 日本免费中文字幕在线| 成人久久久久久| 精品福利一区二区| 国产亚洲一区二区三区不卡| 免费视频二区| 国产日韩在线看| 日本韩国一区二区| 综合亚洲视频| 婷婷在线视频| 一区二区三区在线视频看| 亚洲欧美精品中文字幕在线| 不卡高清视频专区| 国产精品极品在线观看| 中文在线网在线中文| 国产在线日韩在线| 日韩欧美二区三区| 丁香婷婷综合色啪| 国产一区二区三区不卡视频网站| 97dyy97影院理论片在线| 不卡av在线网站| 国产精品久久午夜| 欧美亚洲高清| 91视频在线观看| 日韩一区二区三区高清| 亚洲激情视频网| 不卡的看片网站| 精品久久视频| 成人免费在线电影| 一本一本a久久| 亚洲一级免费视频| 国产精品电影院| 欧美精品99| 精品久久福利| 久草在线免费二| 国产精品久久亚洲7777| 亚洲国产欧美一区二区丝袜黑人 | 韩国19禁主播vip福利视频| 亚洲视频精选在线| 国精品一区二区| 9.1麻豆精品| 每日更新在线观看av| 亚洲精品久久久久久久蜜桃臀| 97免费视频在线播放| 欧美在线999| 久久久不卡影院| 日本成人超碰在线观看| 都市激情国产精品| 视频免费在线看| www.好吊操| yellow视频在线观看一区二区| 亚洲小视频在线| 国产精品久久久久影院亚瑟 | 欧美一区久久久| 制服丝袜影音先锋| 亚洲精品一区二区三| 91精品在线观看视频| 精品少妇v888av| 亚洲精品综合久久中文字幕| 亚洲美女屁股眼交| 久久九九全国免费| 亚洲激情黄色| 伊人久久大香线| 国产永久精品大片wwwapp| 日韩电影免费观| 污视频在线免费观看网站| 美州a亚洲一视本频v色道| 北条麻妃视频在线| 国内不卡一区二区三区| 在线播放欧美女士性生活| 丁香婷婷综合色啪| 国产成人aaa| 成人黄色在线网站| 成人精品免费网站| 香港欧美日韩三级黄色一级电影网站| 欧美激情三区| 99视频这里有精品| 高清一区二区| av手机在线观看| 一区二区三区| 看亚洲a级一级毛片| 日本一区二区中文字幕| 亚洲精品三区| 超碰在线免费公开| 日韩欧美少妇| 国产精品久久久网站| 成人免费在线电影网| 国产精品免费大片| 亚洲色图自拍| 国产又黄又猛视频| 久久人妻精品白浆国产| 91丨porny丨探花| 91日韩视频在线观看| 视频三区在线观看| 啦啦啦啦免费高清视频在线观看1| 黄网站app在线观看下载视频大全官网| 小草av在线播放| 午夜小视频福利在线观看| 最新日韩一区| 91麻豆精品国产91久久久平台| 国产欧美日韩亚洲一区二区三区| 国产精品毛片一区二区三区| 国产乱码精品一区二区三区五月婷| 本田岬高潮一区二区三区| 午夜激情综合网| 欧美军同video69gay| 日韩有码在线播放| 91国内在线视频| 久久综合九色综合97婷婷| 日韩视频免费观看高清完整版在线观看| 日韩精品高清在线| 97av在线视频免费播放| 欧美精品v日韩精品v国产精品| 337p亚洲精品色噜噜狠狠p| 久久久久久五月天久久久久久久久| 牛牛精品视频在线| 好吊妞视频这里有精品| 国产乱对白刺激视频不卡| 日本乱码高清不卡字幕| 亚洲国产高清一区| 欧美午夜影院| 一区二区激情视频| 欧美一级黄色网|