2015年6月21日 星期日

[擒猿筆記篇] Android 利用 Parse Cloud Server (一) ParseObject

雲端向來為兵家必爭之地,俗話說掌控雲端的人就能夠掌握世界,但自己架設 Server 費時費力又麻煩,怎辦?

Parse (https://www.parse.com/) 是一套雲端服務,其提供了一套雲端資料庫與 API 供人使用,API 支援的 Platform 包括 Android、iOS、Windows、PHP ... 等等,只要實作 API 就可以達成跨平台的資料整合,超方便的吧,重點是在流量小的情況下還是完全免費的呢,太棒啦~~

以下介紹如何使用 Parse 提供的 API 內儲存資料的基本元件 ParseObject。

Parse 初始化

使用 Parse 之前必須先註冊一個帳號,並建立一個App
Android 程式端初始化 Parse 時必須在 extends Application 的 onCreate() 地方加入
Parse.enableLocalDatastore(this);
Parse.initialize(this, "xxxxx", "yyyyy");
其中 xxxxx 與 yyyyy 為每個帳號的認證碼,Parse 網頁上可查詢得到。
此外 AndroidManifest,xl 中需要宣告以下使用網路的權限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


上傳資料至雲端資料庫

ParseObject 是 Parse 用來儲存 Data 的方式,每個 ParseObject 是以 key-value 的形式的 JSON-compatible data,Key 值只能是 alphanumeric,而 Values 值可以是 string、number、boolean、array 或 object (任何可被 JSON ecoded 的資料)
以下方式可以將資料上傳到雲端 Server:
ParseObject gameScore = new ParseObject("GameScore");
gameScore.put("score", 1337);
gameScore.put("playerName", "Sean Plott");
gameScore.put("cheatMode", false);
gameScore.saveInBackground();
執行過後就可以透過 Web Browser 至 Parse 的 Database 查看,應該就可以看到有資料在上面囉。





從雲端資料庫抓取資料

以下方式可以利用 ObjectId 從雲端資料庫抓取資料下來:
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.getInBackground("0SBvgzYv85", new GetCallback<ParseObject>() {
  public void done(ParseObject object, ParseException e) {
    if (e == null) {
      // object will be your game score
      int score = object.getInt("score");
      String playerName = object.getString("playerName");
      boolean cheatMode = object.getBoolean("cheatMode");
    } else {
      // something went wrong
    }
  }
});
其中 "0SBvgzYv85" 就是我們剛剛推上雲端的那筆資料的 ObjectId,利用這個方式只可以抓取一筆資料下來。

如果原本已經有 ParseObject 的 instance,欲從雲端更新資料下來,可以利用下方式:
myObject.fetchInBackground(new GetCallback<ParseObject>() {
  public void done(ParseObject object, ParseException e) {
    if (e == null) {
      // Success!
    } else {
      // Failure!
    }
  }
});

將資料放置到 Local DataStore

此外,Parse 提供了一個 Local DataStore 可以存放 local 資料,可以儲存一些不用上傳到雲端的資訊,存放資料到 Local DataStore 的方式如下:
ParseObject gameScore = new ParseObject("GameScore");
gameScore.put("score", 1337);
gameScore.put("playerName", "Sean Plott");
gameScore.put("cheatMode", false);
gameScore.pinInBackground();
最後一部 pin 的動作,會將該 ParseObject 對應 Local DataStore 中的資料隨著 ParseObject 內的值變更而自動更新,不須再而外做處理,超方便 der~~

此外,若要移除 ParseObject 與 Local DataStore 的連結,可以執行 unpin:
gameScore.unpinInBackground();

從 Local DataStore 中取出資料

透過以下方式,便可從 Local DataStore 中取出資料:
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.fromLocalDatastore();
query.getInBackground("0SBvgzYv85", new GetCallback<ParseObject>() {
  public void done(ParseObject object, ParseException e) {
    if (e == null) {
      // object will be your game score
    } else {
      // something went wrong
    }
  }
});
如果已經有 ParseObject 物件了,可以直接:
ParseObject object = ParseObject.createWithoutData("GameScore", "0SBvgzYv85");
object.fetchFromLocalDatastoreInBackground(new GetCallback<ParseObject>() {
  public void done(ParseObject object, ParseException e) {
    if (e == null) {
      // object will be your game score
    } else {
      // something went wrong
    }
  }
});

在無網路時儲存資料

當網路未連線時,可以利用以下方式先將資料暫存起來,當下次 App 在前景且網路有連線時,Parse 會自動將暫存的資料照儲存順序推上雲端:
ParseObject gameScore = new ParseObject("GameScore");
gameScore.put("score", 1337);
gameScore.put("playerName", "Sean Plott");
gameScore.put("cheatMode", false);
gameScore.saveEventually();
若 ParseObject 有與 Local DataStore 連結,更新 Local DataStore 會在資料真正被 Save 的時候才被執行到。

累加

當有多個 Client 對同一個變數做累加動作時,Parser 提供了以下方法可以避免資料一致性的問題:
gameScore.increment("score");
gameScore.saveInBackground();
也可以是像這樣的用法:increment(key, amount)

儲存陣列

利用以下方式可以將一個陣列加入到 ParseObject 中:
gameScore.addAllUnique("skills", Arrays.asList("flying", "kungfu"));
gameScore.saveInBackground();
執行完用 Web Browser 檢視雲端資料庫,可以看到夾帶 Array 資料的已經推上雲端資料庫了。




除此之外,有關 Array 的操作,還可用以下的 function:

  • add & addAll:將 ParseObject 所夾帶的所有 Array  資料加入資料庫。
  • addUnique & addAllUnique:只將 ParseObject 所夾帶的 Array 資料中,沒有存在的資料加入到資料庫。
  • removeAll:從資料庫中移除符合 ParseObject 中所夾帶的 Array 的資料。


刪除 ParseObject

利用以下指令,可以刪除 ParseObject
myObject.deleteInBackground();
可以實作 DeleteCallback 來取得 delete 完成時的資訊,此外,還可以改為使用 delete() 來 block 住原本正在執行的 thread。


刪除 ParseObject 中的單一欄位

利用以下指令來刪除 ParseObject 中的單一欄位:
// After this, the playerName field will be empty
myObject.remove("playerName");

// Saves the field deletion to the Parse Cloud
myObject.saveInBackground();

關聯式資料

ParseObject 中的資料可以互有關連,如下例中留言版的 Post 和 Comment 和是有相關聯的,因此將 Comment 的 ParseObject 加入一個欄位叫 Parent,指向一個 Post 的 ParseObject。

// Create the post
ParseObject myPost = new ParseObject("Post");
myPost.put("title", "I'm Hungry");
myPost.put("content", "Where should we go for lunch?");

// Create the comment
ParseObject myComment = new ParseObject("Comment");
myComment.put("content", "Let's do Sushirrito.");

// Add a relation between the Post and Comment
myComment.put("parent", myPost);

// This will save both myPost and myComment
myComment.saveInBackground();

Data Types

ParserObject 可以存取的資料型別如下:

  • String
  • int
  • bool
  • ParseObject
  • java.util.Date
  • byte[]
  • JSONObject.NULL
  • JSONObject
  • JSONArray

以下例子可以參考 ParserObject 存放資料的方式:

int myNumber = 42;
String myString = "the number is " + myNumber;
Date myDate = new Date();

JSONArray myArray = new JSONArray();
myArray.put(myString);
myArray.put(myNumber);

JSONObject myObject = new JSONObject();
myObject.put("number", myNumber);
myObject.put("string", myString);

byte[] myData = { 4, 8, 16, 32 };

ParseObject bigObject = new ParseObject("BigObject");
bigObject.put("myNumber", myNumber);
bigObject.put("myString", myString);
bigObject.put("myDate", myDate);
bigObject.put("myData", myData);
bigObject.put("myArray", myArray);
bigObject.put("myObject", myObject);
bigObject.put("myNull", JSONObject.NULL);
bigObject.saveInBackground();

幹你娘我竟然熬夜在寫這個...

沒有留言:

張貼留言