Android:使用 Parse 时使用服务器端

标签 android database parse-platform client-side server-side

我和我的 friend 正在开发一个应用程序,我们希望使用 Parse.com 作为我们可以从中检索信息的数据库。 我们无法决定在 Parse 上访问数据的最佳方式是什么。为了这个例子,我们的应用程序。 (即客户端)需要存储在 Parse 数据库中的东西(比如一些数字)——它应该直接使用 Parse API 运行查询,还是应该向服务器端发出请求,让它从 Parse 中检索该数字,以及发回给客户?

我们知道没有确定的答案,但我们找不到关于这种具体情况的答案。我们读了这篇文章:When to use client-side or server-side? , 但这并不完全相同。

我声称我们应该尽可能地与客户端和数据库分开,并让负责人(服务器)运行这些查询,我的 friend 声称这会增加不必要的复杂性,因为这很自然使用 Parse 提供的工具从客户端访问数据库,无需协议(protocol)等。

我们很乐意接受任何建议,

谢谢。

最佳答案

一般来说,直接调用普通电话

在任何情况下,我都鼓励您首先这样做,以使两端都正常工作。

然后如有必要,请转到 Cloud Code。

如果您打算多个平台(即 iOS 和 Android),云代码可以节省大量时间

但是不要忘记,对于简单的调用,云代码是浪费时间。 “正常”Parse 调用非常、令人难以置信、令人惊奇、快速且易于使用。

使用普通的 Parse 调用绝对没有任何“错误” - 所以就这样做吧。

关于这个问题,你什么时候真的必须使用云代码调用——你会知道的,因为你不能用普通的调用来做:)

不要忘记,您经常可以在云代码中简单地使用“afterSave”或“beforeSave”来完成大量工作。您通常不需要在云代码中进行“自定义调用”。

这是一个很棒的

Parse 云代码的经验法则-------->

如果您必须做“不止一件事”……在这种情况下,您可能必须将其设为云代码功能。 如果您必须做“三件或更多的事情”,那么一定要将其设为云代码功能。

这是一个很好的经验法则。

(再一次,就像我说的,通常只是一个“afterSave”或类似的作品非常出色......而不是字面上写一个完整的自定义调用。)

这是一个典型的云调用示例,它在互联网覆盖的所有平台上节省了 180 亿行代码。首先是云代码...

Parse.Cloud.define("clientRequestHandleInvite", function(request, response)
{
// called from the client, to accept an invite from invitorPerson

var thisUserObj = request.user;
var invitorPersonId = request.params.invitorPersonId;
var theMode = request.params.theMode;

// theMode is likely "accept" or "ignore"

console.log( "clientRequestAcceptInvite called....  invitorPersonId " + invitorPersonId + " By user: " + thisUserObj.id );
console.log( "clientRequestAcceptInvite called....  theMode is " + theMode );

if ( invitorPersonId == undefined || invitorPersonId == "" )
  {
  response.error("Problem in clientRequestAcceptInvite, 'invitorPersonId' missing or blank?");
  return;
  }

var query = new Parse.Query(Parse.User);
query.get(
  invitorPersonId,
    {
    success: function(theInvitorPersonObject)
      {
      console.log("clientRequestFriendRemove ... internal I got the userObj ...('no response' mode)");
      
      if ( theMode == "accept" )
        {
        createOneNewHaf( thisUserObj, theInvitorPersonObject );
        createOneNewHaf( theInvitorPersonObject, thisUserObj );
        }
      
      // in both cases "accept" or "ignore", delete the invite in question:
      // and on top of that you have to do it both ways
      
      deleteFromInvites( theInvitorPersonObject, thisUserObj );
      deleteFromInvites( thisUserObj, theInvitorPersonObject );
      
      // (those further functions exist in the cloud code)
      
      // for now we'll just go with the trick of LETTING THOSE RUN
      // so DO NOT this ........... response.success( "removal attempt underway" );
      // it's a huge problem with Parse that (so far, 2014) is poorly handled:
      // READ THIS:
      // parse.com/questions/can-i-use-a-cloud-code-function-within-another-cloud-code-function
      },
    error: function(object,error)
      {
      console.log("clientRequestAcceptInvite ... internal unusual failure: " + error.code + " " + error.message);
      response.error("Problem, internal problem?");
      return;
      }
    }
  );

}
);

如果您是 Parse 的新手,那么很难弄清楚如何从 Android 或 iOS 调用它们!这是从 Android 调用的那个...

这会节省你一天的时间来处理 HashMaps :)

private static void handleInvite( ParseUser invitor, final boolean accepted )
    {
    String invitorId = invitor.getObjectId();
    // you must SEND IDs, NOT PARSEUSER OBJECTS to cloud code. Sucks!

    String cloudKode;
    cloudKode = (accepted? "accept" : "ignore");

    HashMap<String, Object> dict = new HashMap<String, Object>();
    dict.put( "invitorPersonId", invitorId );
    dict.put( "theMode", cloudKode );

    Toast.makeText(State.mainContext, "contacting...", Toast.LENGTH_SHORT).show();

    ParseCloud.callFunctionInBackground(
        "clientRequestHandleInvite",
         dict,
         new FunctionCallback<Object>()
    {
    @Override
    public void done(Object s, ParseException e)
        {
        Toast.makeText(State.mainContext, "blah", Toast.LENGTH_SHORT).show();
        // be careful with handling the exception on return...
        }
    });

    }

这是来自 iOS 的相同云调用......现在好了,直到您必须在 SWIFT 中执行此操作

-(void)tableView:(UITableView *)tableView
        commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
        forRowAtIndexPath:(NSIndexPath *)indexPath
    {
    int thisRow = indexPath.row;
    PFUser *delFriend = [self.theFriends objectAtIndex:thisRow];
    
    NSLog(@"you wish to delete .. %@", [delFriend fullName] );
    
    // note, this cloud call is happily is set and forget
    // there's no return either way. life's like that sometimes
    
    [PFCloud callFunctionInBackground:@"clientRequestFriendRemove"
            withParameters:@{
                            @"removeThisFriendId":delFriend.objectId
                            }
            block:^(NSString *serverResult, NSError *error)
            {
            if (!error)
                {
                NSLog(@"ok, Return (string) %@", serverResult);
                }
            }];
    
    [self back];    // that simple
    }

注意 如需 iOS/Swift 体验,请点击:How to make this Parse.com cloud code call?其中包括来自 Parse.com 团队的评论。希望它可以节省一些打字时间,干杯

关于Android:使用 Parse 时使用服务器端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24004276/

相关文章:

android - 自定义 ActionBar 和 RoboGuice 注入(inject)

java - 我应该使用哪个函数来访问 Android Crypto 插件?

mongodb - 如何从 MongoDB 文档中完全删除字段?

php - symfony 发生错误:通知:未定义的属性:::$容器

ios - 使用 parse.com 在后台注销

ios - 使用 PFQuery 获取所有 PFUser

javascript - 为 Parse.com 设置云代码

android - 如何在 ORMLite 中通过 random() 进行排序

android - 带 AppCompatActivity 的 ActionBarDrawerToggle 和带 fragment 的工具栏后退按钮

java - 数据结构 : Checking if a record exists in a database?