前言:
最近的新項目使用Firebase做爲app的後臺,即經過Firebase的sdk來獲取Firestore(數據庫)的實時數據。Firebase的Firestore是一種雲託管數據庫,該數據庫將數據存儲爲 JSON,並以實時方式與每一個鏈接的客戶端同步。下面我簡單總結一下在MVVM架構的項目中如何獲取Firebase雲數據。java
用到的知識點:
1.FirebaseFirestore獲取動態數據
2.Recyclerview+Adapter展現列表信息數據庫
實現的代碼:
1.Google官網註冊應用
首先去網址:https://console.firebase.google.com/ 去註冊本身的應用,並下載google-services.json的文件,把它放到項目的app/目錄。json
2.添加依賴網絡
2.1 Project的build.gradle
classpath 'com.google.gms:google-services:4.1.0'
2.2 Module的build.gradle
dependencies {
compile 'com.google.firebase:firebase-database:15.0.1'
}
apply plugin: 'com.google.gms.google-services' //這一句必定要放在最下面,不然無效架構
3.在Firebase創建實時數據庫app
4.在LenderRepository裏面封裝FirebaseFirestore獲取動態數據的方法ide
public class LenderRepository { private static final String TAG = LenderRepository.class.getSimpleName(); /* *封裝一個FirebaseFirestore獲取動態數據的方法 */ public void getLenderList(CompleteCallback<ArrayList<Lender>> callback) { CollectionReference loansRef = FirebaseFirestore.getInstance().collection(FIREBASE_COLLECT_LENDERS); loansRef.get() .addOnSuccessListener(queryDocumentSnapshots -> { ArrayList<Lender> lenders = new ArrayList<>(); if (!queryDocumentSnapshots.isEmpty()) { lenders.addAll(queryDocumentSnapshots.toObjects(Lender.class)); } callback.onComplete(null, lenders); }) .addOnFailureListener(e -> { callback.onComplete(AppError.parse(e.getCause()), null); }); } }
5.DependencyInjector的類gradle
public class DependencyInjector { // Repositories private static LenderRepository sLenderRepo; public static LenderRepository getsLenderRepository(){ if(sLenderRepo == null){ sLenderRepo = new LenderRepository(); } return sLenderRepo; } }
6.LenderViewModel的類ui
public class LenderViewModel extends PaddyViewModel { private LenderRepository lenderRepository = DependencyInjector.getsLenderRepository(); public void getLenderList(CompleteCallback<ArrayList<Lender>> callback) { //判斷是否有網絡 if (!NetworkingManager.isNetworkConnected()) { callback.onComplete(AppError.NETWORK_CONNECTION, null); return; } lenderRepository.getLenderList(callback); } }
7.在LenderActivity調用FirebaseFirestore獲取動態數據的方法this
public class LenderActivity extends PaddyActivity { private ActivityLenderBinding mBinding; private LenderViewModel viewModel; private LenderAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this, R.layout.activity_lender); viewModel = obtainViewModel(LenderViewModel.class); setupViews(); } private void setupViews() { //調用FirebaseFirestore獲取動態數據的方法 getLenderList(); } /* *調用FirebaseFirestore獲取動態數據的方法 */ private void getLenderList() { showLoading(); viewModel.getLenderList((error, lenders) -> { if (error != null) { hideLoading(); return; } setupLender(lenders); }); } private void setupLender(ArrayList<Lender> lenders) { adapter = new LenderAdapter(this, lenders); mBinding.rcvLenders.setLayoutManager(new GridLayoutManager(this, 2)); mBinding.rcvLenders.setAdapter(adapter); hideLoading(); } @Override protected PaddyViewModel getViewModel() { if (viewModel == null) { viewModel = obtainViewModel(LenderViewModel.class); } return viewModel; } }
8.適配器的代碼
public class LenderAdapter extends RecyclerView.Adapter<LenderAdapter.ViewHolder> { private LayoutInflater mInflater; private ArrayList<Lender> lenderList = new ArrayList<>(); private Context context; public LenderAdapter(Context context,ArrayList<Lender> lenderList) { this.context=context; this.lenderList.addAll(lenderList); } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { if (mInflater == null) { mInflater = LayoutInflater.from(parent.getContext()); } View itemView = mInflater.inflate(R.layout.item_lenders, parent, false); return new LenderAdapter.ViewHolder(itemView); } @Override public void onBindViewHolder(@NonNull LenderAdapter.ViewHolder holder, int position) { String logo_url = lenderList.get(position).getLogo(); setLenderImage(logo_url, holder.imvLender); String name = lenderList.get(position).getName(); holder.tvLender.setText(name); } private void setLenderImage(@NonNull String url, @NonNull ImageView imageView) { ImageUtil.load(context, imageView, url); } @Override public int getItemCount() { return lenderList.size(); } class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.imv_lender) ImageView imvLender; @BindView(R.id.tv_lender) TextView tvLender; ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } }
9.總結:
Android客戶端獲取Firebase雲數據的功能已經實現啦,若是你們有什麼疑問的話,歡迎留言聯繫我哦!