Parse (https://www.parse.com/) 是一套雲端服務,其提供了一套雲端資料庫與 API 供人使用,API 支援的 Platform 包括 Android、iOS、Windows、PHP ... 等等,只要實作 API 就可以達成跨平台的資料整合,超方便的吧,重點是在流量小的情況下還是完全免費的呢,太棒啦~~
以下介紹如何使用 Parse 提供的 API 內儲存資料的基本元件 ParseObject。
Parse 初始化
使用 Parse 之前必須先註冊一個帳號,並建立一個App
Android 程式端初始化 Parse 時必須在 extends Application 的 onCreate() 地方加入
以下方式可以將資料上傳到雲端 Server:
如果原本已經有 ParseObject 的 instance,欲從雲端更新資料下來,可以利用下方式:
此外,若要移除 ParseObject 與 Local DataStore 的連結,可以執行 unpin:
除此之外,有關 Array 的操作,還可用以下的 function:
以下例子可以參考 ParserObject 存放資料的方式:
幹你娘我竟然熬夜在寫這個...
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
利用以下指令,可以刪除 ParseObjectmyObject.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();
幹你娘我竟然熬夜在寫這個...
沒有留言:
張貼留言