日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android使用Realm數據庫實現App中的收藏功能(代碼詳解)

瀏覽:172日期:2022-09-25 10:50:53

前 言

App數據持久化功能是每個App必不可少的功能,而Android最常用的數據持久化方式主要有以下的五種方式:

使用SharedPreferences存儲數據; 文件存儲數據; SQLite數據庫存儲數據; 使用ContentProvider存儲數據; 網絡存儲數據。

其中前四種都是緩存數據到本地,這篇主要講的是使用第三種方式來實現App中的收藏功能,不過不用Android原生自帶SQLite數據庫來存儲數據,而是使用第三方的Realm數據庫來來存儲數據。

Realm 本質上是一個嵌入式數據庫,他并不是基于SQLite所構建的。它擁有自己的數據庫存儲引擎,可以高效且快速地完成數據庫的構建操作。和SQLite不同的是,它允許你在持久層直接和數據對象工作。在它之上是一個函數式風格的查詢api,眾多的努力讓它比傳統的SQLite 操作更快 。

Realm不僅支持Android的接入,還支持IOS的接入。那么接下來就使用Realm數據庫實現Android App中的收藏功能吧。

需求分析

要使用Realm數據庫實現App中的收藏功能,需要實現以下幾個功能和步驟:

在Android項目接入Realm數據庫; 創建收藏數據庫表; 實現對收藏數據庫表進行增刪查的操作; 數據庫表增刪查時界面實時渲染和更新。

接入Realm數據庫

然后在AS的外層build.gradle里的buildscript.dependencies添加Realm數據庫相關的依賴

buildscript { dependencies { ... classpath 'io.realm:realm-gradle-plugin:6.0.1' }}

然后在AS的內層build.gradle里添加Realm數據庫相關的依賴

在頂部 apply plugin: ‘com.android.application’ 下添加 apply plugin: ‘realm-android’ 的聲明,如下圖

Android使用Realm數據庫實現App中的收藏功能(代碼詳解)

在定義的Application里初始化數據庫相關的配置(包括數據庫名稱和版本號,具體代碼看Demo源碼)

/** * 數據庫相關的配置 * * @param context */ private void initRealm(Context context) { try { Realm.init(context); RealmConfiguration config = new RealmConfiguration.Builder() .name(RealmConstant.REALM_DB_NAME) .schemaVersion(RealmConstant.REALM_DB_VERSION) .build(); Realm.setDefaultConfiguration(config); } catch (Exception e) { e.printStackTrace(); } }

創建收藏數據庫表首先先創建一張收藏數據庫表,代碼如下:

/** * 電影收藏數據庫表名 */public class MovieCollectDBModel extends RealmObject { // 影視id,主鍵 @Required @PrimaryKey @Index private String movieId; // 影視名稱 @Required private String movieName; // 影視海報、封面 @Required private String poster; // 影視標簽 @Required private String movieLabel; // 影視類型 @Required private String videoType; // 添加到數據的時間 @Required private String createdTime; // 以下省略字段的 set 和 get}

該類繼承于Realm的RealmObject類,其中字段movieId作為該表的主鍵,也是數據在表里的唯一性。

收藏數據庫表的增刪查添加影視數據到到數據庫的操作(增)

/** * 添加收藏數據到本地數據庫 * * @param mvId * @param mvName * @param movieImg * @param movieLabel * @param videoType */ public void addCollectToDB(String mvId, String mvName, String movieImg, String movieLabel, String videoType) { MovieCollectDBModel movieCollectDBModel = new MovieCollectDBModel(); movieCollectDBModel.setMovieId(mvId); movieCollectDBModel.setMovieName(mvName); movieCollectDBModel.setPoster(movieImg); movieCollectDBModel.setMovieLabel(movieLabel); movieCollectDBModel.setVideoType(videoType); movieCollectDBModel.setCreatedTime(BaseUtil.getNowDateTimeFormat()); mTransaction = mRealm.executeTransactionAsync(new Realm.Transaction() { @Override public void execute(Realm realm) { realm.copyToRealmOrUpdate(movieCollectDBModel); } }, new Realm.Transaction.OnSuccess() { @Override public void onSuccess() { L.i('收藏數據添加成功!'); ToastUtil.showToast(String.format('%s 已收藏', mvName)); } }, new Realm.Transaction.OnError() { @Override public void onError(Throwable error) { L.i('收藏數據添加失敗:' + error.toString()); ToastUtil.showToast(String.format('%s 收藏失敗', mvName)); } }); }

上面的代碼是Realm數據插入數據到數據庫的操作,這是一樣異步插入數據的方式。在業務場景的需要,可以改新增和更新數據的插入方式,比如插入數據時如果數據庫中已經存在了該數據則進行更新操作,否則進行了新增操作。

從數據庫中刪除一條影視數據的操作(刪)

/** * 通過鍵值對來刪除指定收藏數據 * * @param key * @param value */ public void deleteByKeyCollectData(String key, String value) { RealmResults<MovieCollectDBModel> movieCollectDBModels = mRealm.where(MovieCollectDBModel.class) .equalTo(key, value) .findAllAsync(); movieCollectDBModels.addChangeListener(new RealmChangeListener<RealmResults<MovieCollectDBModel>>() { @Override public void onChange(RealmResults<MovieCollectDBModel> movieCollectDBModels1) { if (movieCollectDBModels1.isEmpty()) return; mRealm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { movieCollectDBModels1.deleteFromRealm(0); } }); } }); }

從數據庫中刪除全部影視數據的操作(刪)

/** * 清除全部收藏的數據庫內容 */ public void deleteAllCollectData() { RealmResults<MovieCollectDBModel> movieCollectDBModels = mRealm.where(MovieCollectDBModel.class) .findAll(); mRealm.executeTransaction(new Realm.Transaction() { @Override public void execute(Realm realm) { if (movieCollectDBModels.isEmpty()) { ToastUtil.showToast('暫無收藏數據可刪除'); return; } movieCollectDBModels.deleteAllFromRealm(); ToastUtil.showToast('收藏數據已全部清空'); } }); }

從數據庫中查詢全部影視數據的操作(查)

/** * 查詢所有的收藏數據 * * @param listener */ public void queryAllCollectData(RealmChangeListener<RealmResults<MovieCollectDBModel>> listener) { RealmResults<MovieCollectDBModel> movieCollectDBModels = mRealm.where(MovieCollectDBModel.class) .sort('createdTime', Sort.DESCENDING) .findAllAsync(); movieCollectDBModels.addChangeListener(listener); }

當前用戶進入收藏界面的時候,需要從數據庫中拉取全部的收藏數據,可以剛才添加收藏時間進行倒序排序。

數據庫表增刪查時界面的渲染和更新當用戶進入主頁的時候,首次從網絡獲取數據,然后遍歷一下網絡獲取數據是否已經有數據操作收藏數據庫中,如果有的話則需要提示用戶該數據已經被收藏并更改收藏圖標。

public class MainActivity extends AppCompatActivity { private MovieAdapter adapter; private List<MovieDataModel.DataBean> mList = new ArrayList<>(); private RealmDBHelp mRealmDBHelp; private boolean refreshType; @BindView(R.id.mTitleBar) TitleBar mTitleBar; @BindView(R.id.homeMovieList) RecyclerView homeMovieList; @BindView(R.id.refreshLayout) RefreshLayout refreshLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initRefresh(); } private void initView() { ButterKnife.bind(this); mTitleBar.setOnTitleBarListener(new OnTitleBarListener() { @Override public void onLeftClick(View v) { } @Override public void onTitleClick(View v) { } @Override public void onRightClick(View v) { // 跳轉至我的收藏界面 startActivity(new Intent(MainActivity.this, MovieCollectActivity.class)); } }); // 初始化本地數據庫幫助類 mRealmDBHelp = new RealmDBHelp(); } private void initRefresh() { // 開啟自動加載功能(非必須) refreshLayout.setEnableAutoLoadMore(true); refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(@NonNull final RefreshLayout refreshLayout) { refreshLayout.getLayout().postDelayed(new Runnable() { @Override public void run() { refreshType = true; // 加載數據 initData(); refreshLayout.finishRefresh(); refreshLayout.resetNoMoreData();//setNoMoreData(false); } }, 2000); } }); refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { refreshLayout.getLayout().postDelayed(new Runnable() { @Override public void run() { refreshType = false; ToastUtil.showToast('暫無更多的數據啦'); // 將不會再次觸發加載更多事件 refreshLayout.finishLoadMoreWithNoMoreData(); refreshLayout.setEnableLoadMore(false); refreshLayout.finishLoadMore(); } }, 2000); } }); //觸發自動刷新 refreshLayout.autoRefresh(); } private void initData() { // 模擬從網絡獲取到json數據 appsrcmainassetsmovieData.json String jsonData = BaseUtil.getAssetsJson(this, 'movieData.json');// L.i('jsonData:' + jsonData); if (TextUtils.isEmpty(jsonData)) { ToastUtil.showToast('Json數據為空'); return; } if (mList != null) mList.clear(); // 將json數據解析為Java實體對象 MovieDataModel movieDataModel = new Gson().fromJson(jsonData, MovieDataModel.class); List<MovieDataModel.DataBean> dataBeanList = movieDataModel.getData(); for (MovieDataModel.DataBean dataBean : dataBeanList) { MovieDataModel.DataBean data = new MovieDataModel.DataBean(); data.setMvid(dataBean.getMvid()); data.setName(dataBean.getName()); data.setPoster(dataBean.getPoster()); data.setUpdateStatus(dataBean.getUpdateStatus()); data.setTag(dataBean.getTag()); data.setVideo_type(dataBean.getVideo_type()); mList.add(data); } // 查詢本地收藏數據庫中是否存在收藏的數據(更改收藏圖標用的) queryAllCollectData(); try { // 設置適配器 homeMovieList.setLayoutManager(new GridLayoutManager(this, 3)); adapter = new MovieAdapter(this, mList); homeMovieList.setAdapter(adapter); } catch (Exception e) { e.printStackTrace(); } // 設置條目的點擊事件 adapter.setItemClikListener(new MovieAdapter.OnItemClikListener() { @Override public void onItemClik(View view, int position) { String mvId = mList.get(position).getMvid(); String mvName = mList.get(position).getName(); String movieImg = mList.get(position).getPoster(); String movieTag = mList.get(position).getTag(); String videoType = mList.get(position).getVideo_type(); boolean isCollect = mList.get(position).isCollect(); if (isCollect) { // 如果已經收藏了則清除該條收藏 // 根據Id來刪除一條數據 mRealmDBHelp.deleteByKeyCollectData('movieId', mvId); mList.get(position).setCollect(false); ToastUtil.showToast(String.format('%s 已取消收藏', mvName)); } else { // 添加收藏數據到本地數據庫 mRealmDBHelp.addCollectToDB(mvId, mvName, movieImg, movieTag, videoType); mList.get(position).setCollect(true); } // 通知適配器數據改變重新更新界面 adapter.notifyDataSetChanged(); } @Override public void onItemLongClik(View view, int position) { } }); } /** * 查詢本地收藏數據庫中是否存在收藏的數據(更改收藏圖標用的) */ private void queryAllCollectData() { mRealmDBHelp.queryAllCollectData(new RealmChangeListener<RealmResults<MovieCollectDBModel>>() { @Override public void onChange(RealmResults<MovieCollectDBModel> movieCollectDBModels) { if (movieCollectDBModels.isEmpty()) { return; } for (MovieCollectDBModel movieCollectDBModel : movieCollectDBModels) { for (int i = 0; i < mList.size(); i++) { if (mList.get(i).getMvid().equals(movieCollectDBModel.getMovieId())) { mList.get(i).setCollect(true); break; } } } } }); } @Override protected void onStop() { super.onStop(); mRealmDBHelp.closeTransaction(); } @Override protected void onDestroy() { super.onDestroy(); mRealmDBHelp.close(); }}

收藏界面的代碼,包括查詢和刪除操作。

public class MovieCollectActivity extends AppCompatActivity { private RealmDBHelp mRealmDBHelp; private List<MovieCollectModel> mList = new ArrayList<>(); private MovieCollectAdapter adapter; private boolean refreshType; @BindView(R.id.mTitleBar) TitleBar mTitleBar; @BindView(R.id.movieCollectList) RecyclerView movieCollectList; @BindView(R.id.empty_view) RelativeLayout empty_view; @BindView(R.id.refreshLayout) RefreshLayout refreshLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_movie_collect); initView(); initRefresh(); } private void initView() { ButterKnife.bind(this); mTitleBar.setOnTitleBarListener(new OnTitleBarListener() { @Override public void onLeftClick(View v) { finish(); } @Override public void onTitleClick(View v) { } @Override public void onRightClick(View v) { deleteRealmDB(); } }); mRealmDBHelp = new RealmDBHelp(); } private void initRefresh() { // 開啟自動加載功能(非必須) refreshLayout.setEnableAutoLoadMore(true); refreshLayout.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh(@NonNull final RefreshLayout refreshLayout) { refreshLayout.getLayout().postDelayed(new Runnable() { @Override public void run() { refreshType = true; // 加載數據 initData(); refreshLayout.finishRefresh(); refreshLayout.resetNoMoreData();//setNoMoreData(false); } }, 2000); } }); refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore(@NonNull final RefreshLayout refreshLayout) { refreshLayout.getLayout().postDelayed(new Runnable() { @Override public void run() { refreshType = false; ToastUtil.showToast('暫無更多的數據啦'); // 將不會再次觸發加載更多事件 refreshLayout.finishLoadMoreWithNoMoreData(); refreshLayout.setEnableLoadMore(false); refreshLayout.finishLoadMore(); } }, 2000); } }); //觸發自動刷新 refreshLayout.autoRefresh(); } private void initData() { queryAllCollectData(); } /** * 查詢本地收藏數據庫中所有的數據 */ private void queryAllCollectData() { mRealmDBHelp.queryAllCollectData(new RealmChangeListener<RealmResults<MovieCollectDBModel>>() { @Override public void onChange(RealmResults<MovieCollectDBModel> movieCollectDBModels) { if (movieCollectDBModels.isEmpty()) { return; } if (mList != null) mList.clear(); for (MovieCollectDBModel movieCollectDBModel : movieCollectDBModels) { MovieCollectModel data = new MovieCollectModel(); data.setMovieId(movieCollectDBModel.getMovieId()); data.setMovieName(movieCollectDBModel.getMovieName()); data.setPoster(movieCollectDBModel.getPoster()); data.setMovieTag(movieCollectDBModel.getMovieLabel()); data.setVideoType(movieCollectDBModel.getVideoType()); data.setCreatedTime(movieCollectDBModel.getCreatedTime()); mList.add(data); } runOnUiThread(new Runnable() { @Override public void run() { parsingMovieList(); } }); } }); } private void parsingMovieList() { movieCollectList.setLayoutManager(new GridLayoutManager(this, 3)); adapter = new MovieCollectAdapter(this, mList); movieCollectList.setAdapter(adapter); if (mList.isEmpty()) { empty_view.setVisibility(View.VISIBLE); movieCollectList.setVisibility(View.GONE); } else { movieCollectList.setVisibility(View.VISIBLE); empty_view.setVisibility(View.GONE); } adapter.setItemClikListener(new MovieCollectAdapter.OnItemClikListener() { @Override public void onItemClik(View view, int position) { // 根據Id來刪除一條數據 deleteByKeyCollectData(position); } @Override public void onItemLongClik(View view, int position) { } }); } /** * 根據Id來刪除一條數據 * * @param position */ private void deleteByKeyCollectData(int position) { IOSMsgDialog.Companion.init(getSupportFragmentManager()) .setTitle('清除影視提示') .setMessage('是否要清除該條影視收藏的數據?') .setAnimStyle(R.style.LDialogScaleAnimation) .setNegativeButton('否', new View.OnClickListener() { @Override public void onClick(View v) { } }) .setPositiveButton('是', new View.OnClickListener() { @Override public void onClick(View v) { // 根據Id來刪除一條數據 mRealmDBHelp.deleteByKeyCollectData('movieId', mList.get(position).getMovieId()); mList.remove(position); adapter.notifyDataSetChanged(); } }, Color.RED) .setDismissListener(new OnDialogDismissListener() { @Override public void onDismiss(DialogInterface dialog) { } }).setCancelableOutside(true).show(); } /** * 刪除本地數據庫中全部的收藏數據 */ private void deleteRealmDB() { IOSMsgDialog.Companion.init(getSupportFragmentManager()) .setTitle('清空全部收藏數據提示') .setMessage('是否要立即清空全部我的收藏的數據?如果要清除單條數據的話請點擊單條數據列表。') .setAnimStyle(R.style.LDialogScaleAnimation) .setNegativeButton('否', new View.OnClickListener() { @Override public void onClick(View v) { } }) .setPositiveButton('是', new View.OnClickListener() { @Override public void onClick(View v) { // 清除全部收藏的數據庫內容 mRealmDBHelp.deleteAllCollectData(); mList.clear(); empty_view.setVisibility(View.VISIBLE); movieCollectList.setVisibility(View.GONE); adapter.notifyDataSetChanged(); } }, Color.RED) .setDismissListener(new OnDialogDismissListener() { @Override public void onDismiss(DialogInterface dialog) { } }).setCancelableOutside(true).show(); } @Override protected void onDestroy() { super.onDestroy(); mRealmDBHelp.close(); }}

界面運行效果圖如下:

Android使用Realm數據庫實現App中的收藏功能(代碼詳解)

apk安裝包下載體驗地址:

可以掃描以下二維碼進行下載安裝,或者點擊以下鏈接 http://app.fukaimei.top/MovieCollect 進行下載安裝體驗。

總結

到此這篇關于Android使用Realm數據庫實現App中的收藏功能(代碼詳解)的文章就介紹到這了,更多相關android realm數據庫實現app收藏內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日本午夜精品久久久久| 青青伊人久久| 国产亚洲一级| 日韩中文字幕麻豆| 国产麻豆一区| 亚洲先锋成人| 欧美一区成人| 成人va天堂| 伊人精品久久| 亚洲欧美日本国产| 日本不卡在线视频| 国产精品毛片久久久| 久久精品天堂| 亚洲高清不卡| 蜜桃视频一区二区| 奇米777国产一区国产二区| 青青草国产精品亚洲专区无| 国产精品日韩精品在线播放| 欧美国产另类| 亚洲精品一级二级| 99精品99| 日韩成人一级| 麻豆视频一区| 日韩精品网站| 在线观看亚洲精品福利片| 国产午夜久久av| 国产suv精品一区二区四区视频| 人人精品亚洲| 免费成人在线影院| 国产精品三p一区二区| 三上悠亚国产精品一区二区三区| 在线一区免费| 欧美视频二区| 在线一区av| 丝袜诱惑制服诱惑色一区在线观看 | 精品日韩一区| 日韩精品影视| 久久精品 人人爱| 蜜桃成人av| 国产精品国码视频| 日韩高清成人在线| 亚洲经典在线| 亚洲高清久久| 亚洲一区中文| 欧美另类中文字幕| 欧美日韩视频免费观看| 久热综合在线亚洲精品| 亚久久调教视频| 欧美91在线|欧美| 91久久中文| 久久麻豆视频| 亚洲免费激情| 国产精品久久久一区二区| 99久久精品费精品国产| 日本成人在线视频网站| 波多野结衣久久精品| 综合日韩在线| 日韩成人亚洲| 欧美日本久久| 日韩视频精品在线观看| 国产高清日韩| 一区二区精品| 97精品国产| 欧美亚洲免费| 欧美日韩在线二区| 国产亚洲精品精品国产亚洲综合| 国产精品av久久久久久麻豆网| 国产美女撒尿一区二区| 国产一区导航| 午夜影院一区| 欧美亚洲tv| 老司机精品久久| 日本在线精品| 麻豆91精品视频| 日韩一区二区三区在线看| 国产精品国产一区| 91欧美极品| 国产精品美女久久久久久不卡| 久久不卡日韩美女| 国产综合激情| 久久国产三级| 欧美日韩精品在线一区| 亚洲精品美女91| 日韩精品亚洲aⅴ在线影院| 精品久久美女| 在线午夜精品| 中文字幕成在线观看| 国产精品亚洲片在线播放| 国产亚洲在线| 91精品福利| 婷婷精品视频| 欧美三区四区| 国产精品成人**免费视频| 日韩av一级片| 免费成人在线影院| 99国产一区| 亚洲天堂久久| 亚洲一区资源| 久久精品福利| 精品国产一区二区三区噜噜噜| 91成人精品在线| 日韩一区免费| 亚洲毛片视频| 玖玖玖国产精品| 视频一区在线视频| 性色一区二区| 午夜在线视频观看日韩17c| 欧美aa在线观看| 神马午夜在线视频| 日韩在线免费| 日韩中文视频| 日韩精品一区二区三区免费观影| 中文字幕在线高清| 91视频久久| 久久精品福利| 亚洲精华国产欧美| 日韩国产在线一| 日韩亚洲精品在线观看| 亚洲精品护士| 中文精品电影| 日韩av黄色在线| 久久久久久久欧美精品| 午夜日韩av| 亚洲综合在线电影| 免费高潮视频95在线观看网站| 国产h片在线观看| 午夜久久中文| 1024精品一区二区三区| 激情综合自拍| 国产一级一区二区| 亚洲成人免费| 日韩影院免费视频| 日本少妇一区二区| 国产精久久久| 日韩欧美字幕| 欧美成人精品| 日韩影院免费视频| 色综合视频一区二区三区日韩| 蜜桃91丨九色丨蝌蚪91桃色| 少妇高潮一区二区三区99| 欧美日韩夜夜| 精品国产欧美| 日韩在线观看| 亚洲欧美日韩精品一区二区| 天海翼精品一区二区三区| 亚洲精品国产精品粉嫩| 欧美久久香蕉| 高清在线一区| 亚洲天堂久久| 91亚洲国产| 麻豆国产91在线播放| 欧美亚洲国产激情| 美女网站视频一区| 亚洲日产av中文字幕| 麻豆一区在线| 日韩精品一级二级| 亚洲a一区二区三区| 国产精品一区二区中文字幕| 亚洲涩涩av| 国产高清视频一区二区| 亚洲精品视频一二三区| 国产精品hd| 999视频精品| 人人精品人人爱| 国产精品毛片aⅴ一区二区三区| 色在线视频观看| 一本一道久久a久久精品蜜桃| 日韩精选在线| 成人国产精品久久| av成人国产| 久久av免费| 亚洲精品中文字幕乱码| 国产欧美一区| 日韩av一级| 日韩精品免费视频一区二区三区 | 蜜桃av一区二区| 美女视频黄久久| 亚洲一区欧美激情| 久久精品国产在热久久| 免费久久久久久久久| 91精品一区| 性欧美xxxx免费岛国不卡电影| 亚洲ab电影| 日韩电影免费网站| a日韩av网址| 精品国产欧美| 麻豆国产精品777777在线| 日韩黄色在线观看| 国产欧美亚洲精品a| 国产乱论精品| 亚洲天堂资源| 亚洲大全视频| 中文字幕一区二区三区日韩精品| 久久亚洲二区| 精品国产乱码久久久| 精品一区在线| 你懂的网址国产 欧美| 视频一区中文字幕| 国产中文字幕一区二区三区| 蜜桃视频在线观看一区|