如何在Android App介接Parse資料

網站上的Parse中文教學不算多,事實上Parse網站上已經提供繁體中文版的技術文件,這是最好的參考來源,而且它的文件經常更新,如果在使用上有任何問題,建議先查詢官方網站的技術文件。

資料匯入
首先,要介紹的是檔案的匯入功能。Parse提供資料匯入的介面,讓開發者能將資料檔匯入Parse平台。檔案支援CSV和JSON兩種格式。

先選擇上方的"Core",在選擇左邊的"Import"

接著就會彈出匯入視窗,你可以把要匯入的檔案直接拖曳到這個視窗裡。如果資料匯入成功,會在Data中新增一個Class(相當於資料庫的Table)

JSON檔,必須在頭尾加上result,格式如下,
{ "results":[  
 "..你的資料.."
 ]} 

否則匯入時會出現以下錯誤,

在資料匯入時,如果資料檔中有地理位置資訊的話,要使用JSON格式,而且必須要把經緯度轉換成以下格式,在資料匯入時,Parse才會把它轉換為Parse內部的地理位置資料型態。
"location": {  
 "__type": "GeoPoint",  
  longitude": 121.5443,   
 "latitude": 24.992969  
 }

安裝SDK
Parse有提供Java SDK,目前官方的SDK沒有在Maven函式庫上,所以要自行下載SDK然後把Jar檔加入IDE。可以從這個連結下載SDK
https://parse.com/docs/downloads

SDK壓縮檔解開後有很多檔案,一般只需要加入Parse-x.x.x.jar和bolts-android-x.x.x.jar兩個檔案。

[更新] Parse SDK 已經在 Maven 函式庫,可透過 Gradle 載入,並已 Open Source 至 Github。SDK 1.10.0 之後,ParseQueryAdapter 被拆出來放到 Parse-UI Widget Library,詳見 Release Note
compile 'com.parse.bolts:bolts-android:1.3.0'
compile 'com.parse:parse-android:1.12.0'
compile 'com.parse:parseui-widget-android:0.0.1'

接著說明程式的部分

應用程式驗證
Parse是以Key字串的方式來做應用程式的驗證,驗證字串在Settings > Keys下,Android只會用到Application ID和Client Key兩個驗證字串。

下面這行是在做驗證。
Parse.initialize(this, PARSE_APPLICATION_ID, PARSE_CLIENT_KEY);  

下面則是執行一個查詢,GameScore是Class Name(這裡的Class指的是Data的物件,也就是剛剛資料檔匯入時所建立的Object)
ParseQuery query = ParseQuery.getQuery("GameScore");  
 query.whereEqualTo("playerName", "Dan Stemkoski");  
 query.findInBackground(new FindCallback() {  
   public void done(List scoreList, ParseException e) {  
     if (e == null) {  
       Log.d("score", "Retrieved " + scoreList.size() + " scores");  
     } else {  
       Log.d("score", "Error: " + e.getMessage());  
     }  
   }  
 });  

更進階的用法
以下介紹用ArrayList的方式作查詢,可以針對Object的部分自訂一個ArrayList Class,ParseClassName裡面的字串,就是Class Name
@ParseClassName("TaipelAll")  
 public class ArrayItem extends ParseObject {  
 ...  
 } 

執行查詢
ParseObject.registerSubclass(ArrayItem.class);  
 // Set up a customized query  
       ParseQueryAdapter.QueryFactory factory =  
           new ParseQueryAdapter.QueryFactory() {  
             public ParseQuery create() {  
               ParseQuery query = ArrayItem.getQuery();  
               query.whereContains("CarTime",hour);  
               query.orderByAscending("CarTime");  
               query.whereWithinKilometers("location"  
                   , geoPointFromLocation(myLoc)  
                   , distance  
               );  
               query.setLimit(20);  
               return query;  
             }  
           };  
       // Set up the query adapter  
       trashQueryAdapter = new ParseQueryAdapter(this, factory) {  
         @Override  
         public View getItemView(ArrayItem trash, View view, ViewGroup parent) {  
           if (view == null) {  
             view = View.inflate(getContext(), R.layout.trash_item, null);  
           }  
           TextView timeView = (TextView) view.findViewById(R.id.time_view);  
           TextView addressView = (TextView) view.findViewById(R.id.address_view);  
           TextView distanceView = (TextView) view.findViewById(R.id.distance_view);  
           timeView.setText(trash.getCarTime());  
           distanceView.setText(trash.getDistance(geoPointFromLocation(myLoc)).toString());  
           addressView.setText(trash.getAddress());  
           return view;  
         }  
       };  

如果需要有ProgressDialog效果,可以引用addOnQueryLoadListener的onLoading方法
trashQueryAdapter.addOnQueryLoadListener(new ParseQueryAdapter.OnQueryLoadListener() {  
         @Override  
         public void onLoading() {  
           proDialog = new ProgressDialog(MainActivity.this);  
           proDialog.setMessage("處理中");  
           proDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);  
           proDialog.setCancelable(false);  
           proDialog.show();  
         }  
         @Override  
         public void onLoaded(List objects, Exception e) {  
           if (proDialog != null && proDialog.isShowing())  
             proDialog.dismiss();  
         }  
       });  

如果需要了解更進階的用法, 可以參考Parse在Github上的範例程式AnyWall。
https://github.com/ParsePlatform/AnyWall


相關文章

如何將電腦畫面經由 Chromecast 投放到電視螢幕上

Mac與Android裝置傳輸檔案的方法

Chrome 的檔案續傳功能

使用 Line Bot API 製作聊天機器人