C#的Bmob使用指南(1)-数据存储

来源:互联网 发布:js车牌是什么单位 编辑:程序博客网 时间:2024/06/05 08:01

适用:初接触Bmob的新人,5分钟上手Bmob开发

1.官网的文档是使用Unity的实例,不久前有Bmob新人问我Winform项目如何使用,所以才想着写本篇教程
2.想了想,还是写成一个系列吧。目前使用过Bmob的功能有:数据存储,短信,文件服务等。但是各个功能又有一些区别,比如说短信,Bmob并没有提供C#的SDK,这时候可以选择下载其他SDK(比如JavaSDK),对其进行封装,或者使用ResetApi …. 总之路有很多种,每个人都会走出一条自己的路

切入正题
本篇只涉及数据存储部分
关于BmobSDK去官网下载即可https://www.bmob.cn/downloads

下载完毕后,发现C#的SDK是一个压缩包,解压后如下图所示,我们选择Windows文件夹下.dll
这里写图片描述

将其引入到VS的项目中(不会引用我也很绝望啊,不知道怎么给你说,百度吧少年~),我这里以Winform项目为例

因为Bmob的交互对象不需要多个实例,所以建议使用单例模式,对其进行一下简单的封装。
1.新建一个类,起名BmobManager。代码如下:

class BmobManager{    static BmobManager instance = null;    BmobWindows mgr = null;    private BmobManager()    {        mgr = new BmobWindows();        mgr.initialize("your appkery", "your restkey");    }    /// <summary>    /// 获取BmobManager的单例    /// </summary>    /// <returns></returns>    public static BmobManager GetInstance()    {        if (instance == null)        {            instance = new BmobManager();        }        return instance;    }    public delegate void ReigsterFinished(string strResult);    public delegate void LoginFinished(string strResult);    public delegate void UpdateFinished(string strResult);    public delegate void InsertFinished(string strResult);    /// <summary>    /// 注册用户    /// </summary>    /// <param name="user"></param>    /// <returns></returns>    public void RegisterUser(BmobUser user, ReigsterFinished callBack)    {        string result = "";        mgr.Signup(user, (resp, exception) =>        {            if (exception != null)            {                result = "error:" + exception.Message;            }            else            {                result = "success:" + resp.sessionToken;            }            if (callBack != null)            {                callBack(result);            }        });    }    /// <summary>    /// 注册用户    /// </summary>    /// <param name="user"></param>    /// <returns></returns>    public void LoginUser(BmobUser user, LoginFinished callBack)    {        string result = "";        mgr.Login<BmobUser>(user.username, user.password, (resp, exception) =>         {             if (exception != null)             {                 result = "error:" + exception.Message;             }             else             {                 result = "success:" + resp.sessionToken;             }             if (callBack != null)             {                 callBack(result);             }         });    }    /// <summary>    /// 要修改用户的信息,必须获取CurrentUser,使用CurrentUser.objectId 和 CurrentUser.sessionToken验证身份    /// </summary>    /// <returns></returns>    public BmobUser GetCurUser()    {        return BmobUser.CurrentUser;    }    public void UpdateUser(BmobUser user, UpdateFinished callBack)    {        string result = "";        mgr.UpdateUser(GetCurUser().objectId, user, GetCurUser().sessionToken, (resp, exception) =>        {            if (exception != null)            {                result = "保存失败, 失败原因为: " + exception.Message;            }            else            {                result = "保存成功, @" + resp.updatedAt;            }            if (callBack != null)            {                callBack(result);            }        });    }    public void InsertScore(MyScore score, InsertFinished callBack)    {        string result = "";        mgr.Create("MyScore", score, (resp, exception) =>        {            if (exception != null)            {                result = "保存失败, 失败原因为: " + exception.Message;            }            else            {                result = "插入分数成功";            }            if (callBack != null)            {                callBack(result);            }        });    }}

这样封装之后,调用很简单,只需要 BmobManager.GetInstance().XXX方法名(参数)就可以。

public delegate void ReigsterFinished(string strResult);

在BmobManager定义了很简单的委托,全部是只有一个参数的委托(你可以定义多个参数),用来回调方法。(不知道委托的童鞋请先理解为:委托可以使得把函数当作参数传进来)

    private BmobManager()    {        mgr = new BmobWindows();        mgr.initialize("your appkey", "your resetkey");    }

其中BmobWindows 的实例用来和Bmob进行交互,实现数据库的增删查改工作,我们在BmobManager实例化的时候对这个对象mgr进行初始化。
BmobManager的构造函数之所以声明为私有,是为了使用单例模式,避免其他地方误调用构造函数。
因此获取BmobManager对象的函数只有一种方式 :

    public static BmobManager GetInstance()    {        if (instance == null)        {            instance = new BmobManager();        }        return instance;    }

即通过BmobManager .GetInstance()的方式。(单例模式)

    public void RegisterUser(BmobUser user, ReigsterFinished callBack)    {        string result = "";        mgr.Signup(user, (resp, exception) =>        {            if (exception != null)            {                result = "error:" + exception.Message;            }            else            {                result = "success:" + resp.sessionToken;            }            if (callBack != null)            {                callBack(result);            }        });    }

BmobManager中的RegisterUser(BmobUser user, ReigsterFinished callBack)方法用来注册用户,且在完成注册后,通过result字符串记录结果,并调用回调函数,返回该结果。
我们通过如下界面进行演示:
这里写图片描述
当用户输入好账号密码后,点击注册按钮,执行如下代码:

    private void button1_Click(object sender, EventArgs e)    {        BmobUser user = new BmobUser();        user.username = textBox1.Text;        user.password = textBox2.Text;        BmobManager.GetInstance().RegisterUser(user, OnRegisterFinished);    }

其中BmobUser需要引入命名空间cn.bmob.io,它对应了Bmob后台的User表。OnRegisterFinished函数是回调函数。代码如下:

    private void OnRegisterFinished(string strResult)    {        MessageBox.Show(strResult);    }

只是简单的通过MessageBox.Show()打印了返回的结果。
登录和修改的方法这里不做演示了。(另外需要扩展User增添字段看官方文档,写的很清楚,再介绍就多余了,而且和接下来讲的其他数据表超级类似,类比就可以理解)

接下来要介绍一下如果是想使用其他数据表怎么办?很简单
1.在Bmob后台创建数据表,添加好字段,保存。如数据表名:MyScore,字段:string playerName, string score
2.在VS中新建一个类,起名MyScore(必须与1中的数据表名称完全一致!!!)
然后代码如下:

class MyScore : BmobTable{    /// <summary>    /// 玩家名称    /// </summary>    public string playerName { get; set; }    /// <summary>    /// 游戏分数    /// </summary>    public string score { get; set; }    public override void readFields(BmobInput input)    {        base.readFields(input);        //读取属性值        this.playerName = input.getString("playerName");        this.score = input.getString("score");    }    public override void write(BmobOutput output, bool all)    {        base.write(output, all);        //写到发送端        output.Put("playerName", this.playerName);        output.Put("score", this.score);    }}

MyScore必须继承自BmobTable类,且必须实现readFields和write方法(从文档赋值粘贴最好,不会出错)。代码很好理解,不做解释(不理解也不影响使用,比葫芦画瓢就好)。接下来看如何使用。
界面还是如图二,当登录后,输入插入的分数,点击插入按钮,则执行如下代码:

    private void button3_Click(object sender, EventArgs e)    {        MyScore myScore = new MyScore();        myScore.playerName = BmobManager.GetInstance().GetCurUser().username;        myScore.score = textBox3.Text;        BmobManager.GetInstance().InsertScore(myScore, OnAddScoreFinished);    }    private void OnAddScoreFinished(string strResult)    {        MessageBox.Show(strResult);    }

声明MyScore 对象,字段赋值,调用BmobManager.GetInstance().InsertScore(myScore, OnAddScoreFinished);方法执行插入操作。返回结果调用OnAddScoreFinished。
这个时候我们看Bmob后台,发现数据已经存储成功:
这里写图片描述

有问题请邮件: wff_1994@126.com 联系我,或者QQ:2062930374
Class over , 同学们再见

博客原创 转载请注明出处