Skip to content

Commit 5c6ee40

Browse files
committed
initial commit
0 parents  commit 5c6ee40

310 files changed

Lines changed: 65301 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.gitignore‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
.DS_Store

‎README.md‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Parse Docs
2+
3+
These are the markdown version of all the [platform guides](https://parse.com/docs) of Parse. The content for the guides is stored in this repo, and we use a [Background Job](https://parse.com/docs/js/guide#cloud-code-advanced-background-jobs) to process the markdown and store it in a Parse app. The guides you see on our website are simply served from this Parse app!
4+
5+
## How Do I Contribute?
6+
7+
If you have any fix or suggestion, simply send us a pull request! The guides are organized first by language, then by platform. So for example, `/en/ios/` contains all of sections for the iOS guide in English. You'll notice a `common` folder in each language. This folder contains content that is shared amongst all of the platform. That helps us not duplicate content unnecessarily.
8+
9+
## Can I Access The Docs Offline?
10+
11+
This repository is public and all the files are in markdown. If you'd like to keep a copy locally, please do!

‎cn/android/analytics.mdown‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# 分析
2+
3+
Parse 提供了很多挂接点,让您可以了解应用的核心。我们知道,了解您的应用程序执行的操作、频率和时间非常重要。
4+
5+
虽然本节将介绍不同的方法来测试您的应用程序,以最好地利用 Parse 的分析后台,不过使用 Parse 存储和检索数据的开发者已经可以利用 Parse 上的分析指标。
6+
7+
无需实施任何客户侧逻辑,您就可以在应用面板中查看 API 请求的实时图表和数据细项(按设备类型、Parse 类名或 REST 动词分类),并保存这些图表过滤器以快速访问您感兴趣的数据。
8+
9+
## 应用开启/推送分析
10+
11+
我们的初始分析挂接点让您可以在应用启动后对其进行跟踪。在主 `Activity` 的 `onCreate` 方法中添加下面的行,您即可开始收集关于您的应用何时开启及其开启频率的数据。
12+
13+
```java
14+
ParseAnalytics.trackAppOpened(getIntent());
15+
```
16+
17+
您可以通过应用的面板访问统计数据图表和数据细项。
18+
19+
您还可以获得关于推送通知递送和打开率的进一步分析。请参阅“推送指南”的[“跟踪推送和应用开启次数”小节](/docs/push_guide#receiving-tracking/Android),了解关于处理通知净负载和与推送相关的回调的更多信息。
20+
21+
## 自定义分析
22+
23+
`ParseAnalytics` 还可以让您用一些 `String` 键和值追踪自由形式事件。这些额外维度允许您通过应用面板细分自定义事件。
24+
25+
比如说,您的应用提供有公寓清单搜索功能,您想要用一些额外的元数据追踪该功能的使用频率。
26+
27+
```java
28+
Map<String, String> dimensions = new HashMap<String, String>();
29+
// Define ranges to bucket data points into meaningful segments
30+
dimensions.put("priceRange", "1000-1500");
31+
// Did the user filter the query?
32+
dimensions.put("source", "craigslist");
33+
// Do searches happen more often on weekdays or weekends?
34+
dimensions.put("dayType", "weekday");
35+
// Send the dimensions to Parse along with the 'search' event
36+
ParseAnalytics.trackEvent("search", dimensions);
37+
```
38+
39+
`ParseAnalytics` 甚至可以作为一个轻便的错误跟踪程序使用 - 只需调用以下内容,你将可以在您的应用程序中查看经过错误代码细分的出错率和出错频率:
40+
41+
```java
42+
Map<String, String> dimensions = new HashMap<String, String>();
43+
dimensions.put('code', Integer.toString(error.getCode()));
44+
ParseAnalytics.trackEvent('error', dimensions);
45+
```
46+
47+
注意,对于每次调用 `ParseAnalytics.trackEvent()`,Parse 目前只能储存前八个维度对。

‎cn/android/files.mdown‎

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# 文件
2+
3+
## ParseFile
4+
5+
`ParseFile` 让您可以把应用程序文件储存在云中,以应对文件太大或太多,不适宜放入普通 `ParseObject` 的情况。最常见的用例是储存图片,但是您还可以用它储存文件、视频、音乐以及其他任何二进制数据(大小不超过 10 MB)。
6+
7+
`ParseFile` 非常容易上手。首先,您需要拥有 `byte[]` 格式的数据,然后使用此数据创建 `ParseFile`。在该示例中,我们只使用一个字符串:
8+
9+
```java
10+
byte[] data = "Working at Parse is great!".getBytes();
11+
ParseFile file = new ParseFile("resume.txt", data);
12+
```
13+
14+
注意,在这个例子中,我们把文件命名为 `resume.txt`。这里要注意两点:
15+
16+
* 您不需要担心文件名冲突。每次上传都会获得一个唯一标识符,所以上传多个文件名为 `resume.txt` 的文件不同出现任何问题。
17+
* 重要的是,您要给文件命名(带文件扩展名)。这样 Parse 就能够判断文件类型,并对文件进行相应的处理。所以,若您要储存 PNG 图片,务必使文件名以 `.png` 结尾。
18+
19+
然后,您可以把文件保存到云中。与 `ParseObject` 相同,您可以根据回调类型和适合您的错误处理方式使用 `save` 方法的多种派生方法。
20+
21+
```java
22+
file.saveInBackground();
23+
```
24+
25+
最后,保存完成后,您可以像其他数据一样把 `ParseFile` 与 `ParseObject` 关联起来:
26+
27+
```java
28+
ParseObject jobApplication = new ParseObject("JobApplication");
29+
jobApplication.put("applicantName", "Joe Smith");
30+
jobApplication.put("applicantResumeFile", file);
31+
jobApplication.saveInBackground();
32+
```
33+
34+
重新获取此数据涉及对 `ParseObject` 调用任一 `getData` 变体。这里我们从另一 JobApplication 对象获取恢复文件:
35+
36+
```java
37+
ParseFile applicantResume = (ParseFile)anotherApplication.get("applicantResumeFile");
38+
applicantResume.getDataInBackground(new GetDataCallback() {
39+
public void done(byte[] data, ParseException e) {
40+
if (e == null) {
41+
// data has the bytes for the resume
42+
} else {
43+
// something went wrong
44+
}
45+
}
46+
});
47+
```
48+
49+
与 `ParseObject` 类似,您极有可能想要使用 `getData` 的后台版本。
50+
51+
## 进度
52+
53+
通过向 `saveInBackground` 和 `getDataInBackground` 传递 ProgressCallback,可使用 ParseFile 轻松获取上传和下载的进度。例如:
54+
55+
```java
56+
byte[] data = "Working at Parse is great!".getBytes();
57+
ParseFile file = new ParseFile("resume.txt", data);
58+
59+
file.saveInBackground(new SaveCallback() {
60+
public void done(ParseException e) {
61+
// Handle success or failure here ...
62+
}
63+
}, new ProgressCallback() {
64+
public void done(Integer percentDone) {
65+
// Update your progress spinner here. percentDone will be between 0 and 100.
66+
}
67+
});
68+
```
69+
70+
您可以用 [REST API](/docs/rest#files-deleting) 删除对象引用的文件。您需要提供主密钥才能删除文件。
71+
72+
如果您的文件未被应用中的任何对象引用,则不能通过 REST API 删除它们。您可以在应用的“设置”页面请求清理未使用的文件。请记住,该操作可能会破坏依赖于访问未被引用文件(通过其 URL 属性)的功能。当前与对象关联的文件将不会受到影响。

‎cn/android/geopoints.mdown‎

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# GeoPoint
2+
3+
Parse 让您可以把真实的纬度和经度坐标与对象关联起来。在 `ParseObject` 中添加 `ParseGeoPoint`,可以实现在查询时将对象与参考点的临近性纳入考虑。这可以让您轻松某些事情,如找出距离与某个用户最近的其他用户或者距离某个用户最近的地标。
4+
5+
## ParseGeoPoint
6+
7+
要将某个地点与对象联系起来,您首先要创建一个 `ParseGeoPoint`。例如,要创建一个纬度为 40.0 度,经度为 -30.0 的点:
8+
9+
```java
10+
ParseGeoPoint point = new ParseGeoPoint(40.0, -30.0);
11+
```
12+
13+
然后,该点被作为常规字段储存在对象中。
14+
15+
```java
16+
placeObject.put("location", point);
17+
```
18+
19+
## Geo 查询
20+
21+
有了一些具有空间坐标的对象后,找到哪些对象距离某个点最近将会产生很好的效应。这可以通过使用 `whereNear` 对 `ParseQuery` 添加另一限制条件完成。举例而言,找出距离某个用户最近的十个地点的方法如下:
22+
23+
```java
24+
ParseGeoPoint userLocation = (ParseGeoPoint) userObject.get("location");
25+
ParseQuery<ParseObject> query = ParseQuery.getQuery("PlaceObject");
26+
query.whereNear("location", userLocation);
27+
query.setLimit(10);
28+
query.findInBackground(new FindCallback<ParseObject>() { ... });
29+
```
30+
31+
此时,`nearPlaces` 是按照与 `userLocation` 的距离(由近及远)排列的一组对象。注意,若应用另一个 `orderByAscending()`/`orderByDescending()` 限制条件,该限制条件将优先于距离顺序。
32+
33+
若要用距离来限定获得哪些结果,请使用 `whereWithinKilometers`、`whereWithinMiles` 和 `whereWithinRadians`。
34+
35+
您还可以查询包含在特定区域内的对象集合。若要查找位于某个矩形区域内的对象,请将 `whereWithinGeoBox` 限制条件添加至您的 `ParseQuery`。
36+
37+
```java
38+
ParseGeoPoint southwestOfSF = new ParseGeoPoint(37.708813, -122.526398);
39+
ParseGeoPoint northeastOfSF = new ParseGeoPoint(37.822802, -122.373962);
40+
ParseQuery<ParseObject> query = ParseQuery.getQuery("PizzaPlaceObject");
41+
query.whereWithinGeoBox("location", southwestOfSF, northeastOfSF);
42+
query.findInBackground(new FindCallback<ParseObject>() { ... });
43+
```
44+
45+
## 注意事项
46+
47+
目前需要注意以下几点:
48+
49+
1. 每个 ParseObject 类可能仅有一个带 ParseGeoPoint 对象的键。
50+
2. 点不应等于或大于最大范围值。纬度不能为 -90.0 或 90.0。经度不能为 -180.0 或 180.0。若纬度或经度设置超出边界,会引起错误。

‎cn/android/getting-started.mdown‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Android 指南
2+
3+
如果您尚未安装 SDK,请[直接查看快速入门指南](/apps/quickstart#android/native/blank),安装 SDK 并使之在 Eclipse 中运行。您还可以查看 [API 参考](/docs/android/api)了解有关 SDK 的更多详细信息。
4+
5+
Parse 平台为您的移动应用程序提供完整的后台解决方案。我们的目标是彻底消除编写服务器代码或维护服务器的需要。
6+
7+
如果您熟悉 Ruby on Rails 等 Web 框架,就会发现我们的平台也采取和应用了许多与之相同原则。特别值得一提的是,我们的 SDK 几乎可供立即使用,您只需进行最简单的配置。
8+
9+
在 Parse 平台上,您可以为每个移动应用需求创建一个应用。每个应用均有自己的应用程序 id 以及供您用于 SDK 的客户端密钥。您的 Parse 账户可以容纳多个应用。即使您只有一个应用程序,这也很有用,因为您可以部署不同的版本用于测试和生产。

‎cn/android/handling-errors.mdown‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# 处理错误
2+
3+
`ParseObject` 上的许多方法(包括 `save()`、`delete()` 和 `get()`)将对无效请求丢出 `ParseException`,此类请求包括删除或编辑云中不存在的对象,或者在网络故障致使无法连接 Parse 云时删除或编辑对象。您需要获取和处理这些异常。
4+
5+
更多详细信息请查看 [Android API](/docs/android)。

‎cn/android/local-datastore.mdown‎

Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
# 本地数据存储库
2+
3+
Parse Android SDK 提供了本地数据存储库,可用于存储和检索 `ParseObject`,甚至在无网络的情况下。要启用此功能,只需调用 `Parse.enableLocalDatastore()`,然后再调用 `initialize`。
4+
5+
```java
6+
import com.parse.Parse;
7+
import android.app.Application;
8+
9+
public class App extends Application {
10+
@Override
11+
public void onCreate() {
12+
super.onCreate();
13+
14+
Parse.enableLocalDatastore(this);
15+
Parse.initialize(this, PARSE_APPLICATION_ID, PARSE_CLIENT_KEY);
16+
}
17+
}
18+
```
19+
20+
应注意,启用本地数据存储库会出现一些副效应。启用时,只存在任何给定 `ParseObject` 的一个实例。例如,假设您有一个 `"GameScore"` 类实例,带 `"xWMyZ4YEGZ"` 的 `objectId`,然后您向带此 `objectId` 的所有 `"GameScore"` 实例发送了 `ParseQuery`。结果会得到您记忆库中已有的对象的同一实例。
21+
22+
另一种副效应是,当前用户和当前安装的应用将存储在本地数据存储库中,所以您可以使用以下方法,在您应用程序不同运行次之间将未保存的更改保留到这些对象中。
23+
24+
对 `ParseObject` 调用 `saveEventually` 方法将会导致该对象被 pin 在本地数据存储库中,直到保存完成。所以现在,如果您更改当前的 `ParseUser` 并且调用 `ParseUser.getCurrent().saveEventually()`,则应用程序将总能看到您所做的更改。
25+
26+
## Pin 操作
27+
28+
您可以通过 pin 操作将 `ParseObject` 存储在本地数据存储库中。Pin 一个 `ParseObject` 是递归性操作,如同保存,所以被您 pin 的对象指向的任何其他对象也将被 pin。Pin 一个对象时,每次通过提取或保存新数据更新该对象时,本地数据存储库中的副本也会自动更新。您完全不必为此担心。
29+
30+
```java
31+
ParseObject gameScore = new ParseObject("GameScore");
32+
gameScore.put("score", 1337);
33+
gameScore.put("playerName", "Sean Plott");
34+
gameScore.put("cheatMode", false);
35+
36+
gameScore.pinInBackground();
37+
```
38+
39+
如果有多个对象,可采用 `pinAllInBackground` 便捷方法一次性将其全部 pin 起来。
40+
41+
```java
42+
ParseObject.pinAllInBackground(listOfObjects);
43+
```
44+
45+
## 从本地数据存储库检索
46+
47+
对象存储是一项好功能,但是只有在以后能再找回这些对象的情况下才有价值。从本地数据存储库检索对象与在网络上检索一样。唯一的不同在于要调用 `fromLocalDatastore` 方法,告知 `ParseQuery` 在何处查找其结果。
48+
49+
```java
50+
ParseQuery<ParseObject> query = ParseQuery.getQuery(“GameScore");
51+
query.fromLocalDatastore();
52+
query.getInBackground("xWMyZ4YE", new GetCallback<ParseObject>() {
53+
public void done(ParseObject object, ParseException e) {
54+
if (e == null) {
55+
56+
// object will be your game score } else {
57+
58+
// something went wrong } } });
59+
```
60+
61+
## 查询本地数据存储库
62+
63+
通常,您可能想查找符合一定标准的所有对象,而不是通过 ID 找到单个对象。为此,您可以使用 [ParseQuery](#queries). Any `ParseQuery` can be used with the local datastore just as with the network. The results will include any object you have pinned that matches the query. Any unsaved changes you have made to the object will be considered when evaluating the query. So you can find a local object that matches, even if it was never returned from the server for this particular query.
64+
65+
```java
66+
ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
67+
query.whereEqualTo("playerName", "Joe Bob");
68+
query.fromLocalDatastore();
69+
query.findInBackground(new FindCallback<ParseObject>() {
70+
public void done(List<ParseObject> scoreList, ParseException e) {
71+
if (e == null) {
72+
Log.d("score", "Retrieved " + scoreList.size());
73+
} else {
74+
Log.d("score", "Error: " + e.getMessage());
75+
}
76+
}
77+
});
78+
```
79+
80+
## 取消 pin
81+
82+
如果您已完成对某个对象的处理,不再需要将其保存在本地数据存储库中,您只需要取消 pin。这样能释放设备上的磁盘空间,从而保证您对本地数据存储库的查询快速运行。
83+
84+
```java
85+
gameScore.unpinInBackground();
86+
```
87+
88+
还有一种能够一次取消 pin 多个对象的方法。
89+
90+
```java
91+
ParseObject.unpinAllInBackground(listOfObjects);
92+
```
93+
94+
## 使用标签进行 pin 操作
95+
96+
手动 pin 和取消 pin 每个对象有点像使用 `malloc` 和 `free`。它是非常强大的工具,但是却很难实现在复杂情景中存储对象。例如,假设您正在制作一个游戏,其中的全球高分和好友高分分别使用不同列表。如果其中一位朋友恰好取得了全球高分,您需要确保在将这些朋友从某个缓存查询中清除时不会将他们完全取消 pin。为了简化这些情景,您也可以使用标签执行 pin 操作。标签将指示应存储在一起的一组对象。
97+
98+
```java
99+
// Add several objects with a label. ParseObject.pinAllInBackground("MyScores", someGameScores);
100+
101+
// Add another object with the same label. anotherGameScore.pinInBackground("MyScores");
102+
```
103+
104+
要使用同一个标签同时取消 pin 所有对象,您可以将标签传送至取消 pin 的方法。如此您便无需手动跟踪您关注的每组对象中有哪些对象。
105+
106+
```java
107+
ParseObject.unpinAllInBackground("MyScores");
108+
```
109+
110+
只要被任一标签 pin,任何对象均会保存在数据存储库中。也就是说,如果您用两个不同的标签 pin 一个对象,然后用其中一个标签取消了 pin,则该对象仍会保存在数据存储库中,只有用另外一个标签也取消 pin。
111+
112+
## 缓存查询结果
113+
114+
使用标签进行 pin 使得缓存查询结果很简单。您可以使用一个标签 pin 每个不同查询的结果。要从网络上获得新结果,只需要进行查询,然后更新 pin 的对象即可。
115+
116+
```java
117+
ParseQuery<ParseObject> query = ParseQuery.getQuery(“GameScore");
118+
query.orderByDescending(“score”);
119+
120+
// Query for new results from the network.
121+
query.findInBackground(new FindCallback<ParseObject>() {
122+
    public void done(List<ParseObject> scores, ParseException e) {
123+
// Remove the previously cached results.
124+
    ParseObject.unpinAllInBackground(“highScores”, new DeleteCallback() {
125+
public void done(ParseException e) {
126+
// Cache the new results.
127+
    ParseObject.pinAllInBackground(“highScores”, scores);
128+
129+
}
130+
});
131+
}
132+
});
133+
```
134+
135+
如果您想为查询获得缓存结果,随后可在本地数据存储库下执行相同的查询操作。
136+
137+
```java
138+
ParseQuery<ParseObject> query = ParseQuery.getQuery(“GameScore");
139+
query.orderByDescending(“score”);
140+
query.fromLocalDatastore();
141+
142+
query.findInBackground(new FindCallback<ParseObject>() {
143+
    public void done(List<ParseObject> scores, ParseException e) {
144+
// Yay! Cached scores!
145+
}
146+
});
147+
```
148+
149+
## 同步本地更改
150+
151+
您本地保存了一些更改后,可以通过一些不同的办法在网络上把那些更改保存到 Parse。要达到此目的最简单的方法是借助`saveEventually`。当您对 `ParseObject` 调用 `saveEventually` 时,前者将被 pin,直到能被保存。SDK 将确保在网络下次可用时保存此对象。
152+
153+
```java
154+
gameScore.saveEventually();
155+
```
156+
157+
如果您想更好地控制同步化各对象的方式,可以将它们保存在本地数据存储库中,直到您准备好使用 `saveInBackground` 亲自保存它们为止。想要管理一组需要保存的对象时,您可以再次使用标签。`ParseQuery` 上的 `fromPin` 方法让您能轻松提取您所关注的对象。
158+
159+
```java
160+
ParseQuery<ParseObject> query = ParseQuery.getQuery(“GameScore");
161+
query.fromPin(“myChanges”);
162+
query.findInBackground(new FindCallback<ParseObject>() {
163+
    public void done(List<ParseObject> scores, ParseException e) {
164+
for (ParseObject score in scores) {
165+
score.saveInBackground();
166+
score.unpinInBackground(“myChanges”);
167+
}    
168+
}
169+
});
170+
```
171+

0 commit comments

Comments
 (0)