Android與FireBase(一)DataBase-資料存取

首先,必須先知道

FireBase是什麼(https://tw.alphacamp.co/2016/07/22/firebase/)


Google強大地整合了開發人員

入門時最容易遇到的問題 : 資料庫! 
以及委外的認證機制 + 使用者分析 + 錯誤報告 +
儲存空間 + 推播通知 + 廣告 + 伺服器運行程式...
相當完整地提供了"後台"的功能!!!
有了以上功能的"後台",讓開發人員可以~
相當快速地建構專案,省去架設伺服器、資料庫...等等繁複的前置步驟
(APP、Web本就是相當薄的UI層,所有應用的發展,都少不了那個雲端!)


那麼該怎麼快速上手呢?



此處可以參考:
https://litotom.com/2016/05/20/2016-firebase/

其中MainActivity的介面設計,寫入以下程式碼時
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
會產生找不到@dimen的問題
此處錯誤是因為找不到此資源檔
所以請在res->values->new file->dimention
產生dimention.xml後,寫入
<resources>    
<dimen name="activity_horizontal_margin">16dp</dimen>    
<dimen name="activity_vertical_margin">16dp</dimen>
</resources>
便能順利找到檔案


接著因目前Android更新至2.3.3,所以從FireBase設定開始,按以下施工:
https://litotom.com/2016/11/19/as_222_firebase_db/

到此為止,便能順利連結到所設定的FireBase。
---------------------------------------------------------

如何取出資料?

建議將連結頁面物件(listView)
與連結DataBase分為兩個涵式
1.findViews(),用來設定連結頁面元件
2.setDBdata(),用來取得資料存入ArrayAdapter物件
再一併於onCreate()內執行:
public class MainActivity extends AppCompatActivity {
    private ListView listView;    
    private void _findViews(){listView = (ListView) findViewById(R.id.listView);    }
    private void _setDBdata(){
        final ArrayAdapter<String> adapter =
                new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1);
        listView.setAdapter(adapter);
        FirebaseDatabase fbDB = FirebaseDatabase.getInstance();        
        DatabaseReference dbRef_chat = fbDB.getReference("chat");        
       dbRef_chat.addValueEventListener(new ValueEventListener() {
            @Override            
             public void onDataChange(DataSnapshot dataSnapshot) {
                adapter.clear();                
                for (DataSnapshot ds : dataSnapshot.getChildren() ){
                    adapter.add(ds.child("name").getValue().toString());                }
            }

            @Override            
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        setContentView(R.layout.activity_main);        
        _findViews();        
       _setDBdata();    }
}
以上分割了非邏輯行為與資料存取行為
達到函式分工合作,便於修改與擴充


目前 最新的FireBase已進一步將API簡化了
所以只要以下兩行
 FirebaseDatabase fbDB = FirebaseDatabase.getInstance();
 DatabaseReference dbRef_chat = fbDB.getReference("chat");
便能取得資料庫實體物件,更能進一步從"chat"節點進入
接著一個個取出"name"欄位的值
更多API可參考官方文件:
https://firebase.google.com/docs/reference/android/com/google/firebase/database/DatabaseReference

-------------------------------------------------------------------------------------


偵錯

至此,我們能從FireBase取出資料
正確顯示在手機APP上了
那如果出錯呢?

授權沒有設定好? UI沒找到? 資料庫連線錯誤? ....原因

FireBase又給了我們偵錯工具!
我們可以為專案導入偵錯機制
它便會鉅細靡遺地,記錄裝置狀態與回報錯誤資訊:
https://litotom.com/2017/04/19/firebase-crash-reporting/

---------------------------------------------------------

真是太強大了,感恩讚嘆FireBase
讓APP入門容易太多了
且可以迅速發展出"實際地應用"
再也不用煩惱後端架哪裡、網路不給力
而去做一些玩具如:計算機功能、溫度、BMI轉換功能...
或是花一大堆時間,搞一個不安全的會員制度...