• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用 MongoDB Stitch为Android创建一个笔记应用程序

如果您正在寻找一个功能丰富且具有成本效益的安全无服务器平台,您可能想尝试一下mongodb Stitch除了提供便捷的服务器端功能(如功能、服务 webhook 和用户身份验证)外,它还与强大且成熟的基于云的数据存储解决方案MongoDB Atlas紧密集成。

在本教程中,我将向您展示如何使用 MongoDB Stitch 和 MongoDB Atlas 集群从头开始为 android 创建一个笔记应用程序我还将向您介绍如何将 Stitch 支持的身份验证提供程序 Google Sign-In 集成到应用程序中。

先决条件

要充分利用本教程,您需要:

  • Android Studio 3.1 或更高版本

  • 一个MongoDB Atlas帐户

  • 运行 Android 5.0 或更高版本的设备或模拟器

如果您还没有这样做,我还建议您先阅读上一篇关于在 Android 应用程序中使用 Stitch 的教程 。

1.创建一个 Stitch 应用程序

您需要一个 Stitch 应用程序才能在您的 Android 项目中使用 Stitch 平台提供的服务。所以登录到您的 MongoDB Atlas 帐户并导航到Stitch Apps 部分。


创建新应用程序 按钮。在弹出的对话框中,为应用程序指定一个有意义的名称,从下拉列表中选择一个 MongoDB Atlas 集群,然后按Create 按钮。


如果您目前没有任何集群,您可以在此处了解如何创建和配置集群:

  • 使用 MongoDB Stitch为Android创建一个笔记应用程序  第1张MongoDB 使用 MongoDB Atlas Ashraff Hathibelagal 在云中创建数据库集群

应用程序准备好后,转到客户端 部分并切换到java (Android) 选项卡以确定其应用程序 ID 是什么。在本教程的后面部分,您将需要该 ID。

2.设置认证

您将使用 Google 作为您今天将要创建的应用程序的身份验证提供程序。换句话说,您将允许您的最终用户使用他们的 Google 帐户登录应用程序。

在 Stitch 的管理控制台中,设置任何身份验证提供程序只需片刻。但是,在您执行此操作之前,您必须从身份验证提供商处获取一些重要的详细信息。要从 Google 获取详细信息,请在浏览器中打开一个新选项卡,登录您的 Google 帐户,然后转到 Google Cloud Platform api Dashboard

Create Project 按钮创建一个新的 Google Cloud 项目。为项目命名后,按创建 按钮。

使用 MongoDB Stitch为Android创建一个笔记应用程序  第2张

项目准备就绪后,转到凭据 部分并打开oauth 同意屏幕 选项卡。在这里,现在,您只能填写应用程序名称 字段并按保存 按钮。


然后,按创建凭据 按钮,选择OAuth 客户端 ID 选项,然后选择Android 作为应用程序类型。

现在将提示您输入要用于 Android 应用程序的包名称和 SHA-1 指纹。对于本教程,我建议您使用调试证书的指纹。要获取它,请打开终端并运行以下命令:

keytool -exportcert -alias androiddebugkey \
-keystore ~/.android/debug.keystore \
-list


复制指纹并将其粘贴到表单中后,按创建 按钮。

使用 MongoDB Stitch为Android创建一个笔记应用程序  第3张

此时,您的 Android 应用将能够使用 Google 登录。但是,您也必须允许 Stitch 应用程序使用它。因此,再次按创建凭据 按钮。这一次,选择Web 应用程序 作为应用程序的类型。

当提示输入授权重定向 URI 时,使用 Stitch 的回调 URL:https ://stitch.mongodb.com/api/client/v2.0/auth/callback

现在按下Create 按钮,您将看到一个包含两个字符串的弹出窗口:一个客户端 ID 和一个客户端密码。记下它们并返回 Stitch 管理控制台。

使用 MongoDB Stitch为Android创建一个笔记应用程序  第4张

在控制台的用户 部分,切换到Providers 选项卡并选择Google启用后,输入客户端 ID 和客户端密码,然后按保存 按钮。

使用 MongoDB Stitch为Android创建一个笔记应用程序  第5张

3.添加规则

您应用的用户不能看到彼此的笔记。只能允许他们查看自己创建的笔记。要执行此规则,请转到“规则” 部分并按“添加集合” 按钮。

您现在可以为 MongoDB 数据库命名,并指定将存储所有笔记的集合的名称。让数据库的名称为notes_db  ,集合的名称为notes

使用 MongoDB Stitch为Android创建一个笔记应用程序  第6张

接下来,选择用户只能读取和写入自己的数据 规则模板,它符合您的应用程序的要求,并说您将存储用户身份验证 ID 的字段名称是user_id

使用 MongoDB Stitch为Android创建一个笔记应用程序  第7张

最后,按添加收藏 按钮。

如果您想仔细查看刚刚创建的规则,请随时按高级模式 按钮,它会显示与规则等效的 JSON。

4.配置 Android 项目

现在 Stitch 应用程序已准备就绪,您可以开始构建您的 Android 应用程序。因此,创建一个带有空活动的新 Android Studio 项目,确保其包名称与您之前键入的名称匹配。

为了能够在项目中使用 Stitch SDK,请implementation 在应用级build.gradle 文件中添加以下依赖项:

implementation 'org.mongodb:stitch-android-sdk:4.0.5'


要支持 Google 登录,还需要为 Google Play 服务添加依赖项。

implementation 'com.google.android.gms:play-services-auth:15.0.1'


您将需要应用程序中的一些 Material Design 小部件,例如卡片和浮动操作按钮。所以也添加以下依赖项:

implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.afollestad.material-dialogs:core:0.9.6.0'


最后,将您在 Stitch 管理控制台中提到的 Stitch 应用程序的 ID 和客户端 ID 添加为strings.xml 文件中的项目。

<string name="stitch_client_app_id">YOUR_APP_ID</string>
<string name="google_client_id">YOUR_CLIENT_ID</string>


5.创建布局

用户必须只有在登录后才能使用笔记应用程序。因此,一旦打开应用程序,您必须向他们显示一个登录按钮。最快的方法是SignInButton 在主活动的布局中使用小部件:

<com.google.android.gms.common.SignInButton
        android:id="@+id/sign_in_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>


成功登录后,您会将用户重定向到另一个活动,其中包含一个 ListView 小部件,该小部件将显示用户的笔记,以及一个 FloatingActionButton 小部件,用户可以按下该小部件来创建新笔记。因此,创建另一个空活动并将以下代码添加到其布局 XML 文件中:

<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/notes_container"
        android:dividerHeight="16dp"
        android:divider="@android:color/transparent"/>

    <android.support.design.widget.FloatingActionButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:src="@drawable/ic_add_black_24dp"
        android:id="@+id/add_note_button"
        android:tint="@android:color/white"/>

</RelativeLayout>


小部件的每个项目都ListView 将是一个注释。为了简单起见,假设笔记的布局只有一个CardView 包含一个小部件的TextView 小部件。因此,创建一个名为layout_note.xml的新布局 XML 文件,并向 其中添加以下代码:

<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/note_text"
        style="@style/TextAppearance.AppCompat.Body1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp" />

</android.support.v7.widget.CardView>


6.实现谷歌登录

当用户按下登录按钮时,您必须启动 Google 的登录工作流程。因此,在第一个活动中,为按钮添加一个单击事件处理程序。

在处理程序中,您可以继续创建一个GoogleSignInOptions 配置为使用默认登录选项的对象。因为您的 Stitch 应用程序(可以被视为您的后端服务器)也必须是登录过程的一部分,因此请确保您调用该requestServerAuthCode() 方法并将您的客户端 ID 传递给它。以下代码向您展示了如何:

val signInOptions =
    GoogleSignInOptions.Builder(
        GoogleSignInOptions.DEFAULT_SIGN_IN
    ).requestServerAuthCode(
        getString(R.string.google_client_id)
    ).build()


您现在可以GoogleSignIn 通过调用该getClient() 方法并将GoogleSignInOptions 对象作为参数传递给它来创建客户端。使用客户端,您可以通过从客户端获取登录意图并将其传递给活动的startActivityForResult() 方法来轻松启动登录工作流。就是这样:

val signInClient = GoogleSignIn.getClient(
        this@MainActivity, signInOptions
)

startActivityForResult(
        signInClient.signInIntent,
        1 // request code
)


要接收您刚刚触发的活动的结果,您必须重写该 onActivityResult() 方法。在其中,您将可以访问一个新Intent 对象,您可以将其传递给getSignedInAccountFromIntent() 方法来识别您的用户。

override fun onActivityResult(requestCode: Int, 
                              resultCode: Int, 
                              data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    val signedInAccount = 
            GoogleSignIn.getSignedInAccountFromIntent(data)

    // More code here
}


如果用户登录失败或拒绝登录,您现在将遇到异常。通过显示信息toast 性消息并关闭应用程序来处理它。

if(signedInAccount.exception != null) {
    Toast.makeText(this,
            "You must sign in first", Toast.LENGTH_LONG).show()
    finish()
    return
}


但是,如果登录成功,您将有权访问可用于创建GoogleCredential 对象的服务器身份验证代码。通过将对象传递给项目默认 Stitch 客户端的 loginWithCredential() 方法,您可以注册和登录用户到您的应用程序。

一旦该方法成功完成,应用程序应该切换到第二个活动,该活动具有用户界面元素来显示笔记和添加新笔记。以下代码简明扼要地向您展示了如何做到这一点:

Stitch.getDefaultAppClient().auth
    .loginWithCredential(
        GoogleCredential(signedInAccount.result.serverAuthCode)
    )
    .addOnSuccessListener {
        // Open activity that shows the notes
        startActivity(
            Intent(this@MainActivity,
                    NotesActivity::class.java
            )
        )
    }


如果您现在构建并运行该应用程序,您应该可以使用您的 Google 帐户之一登录它。


使用 MongoDB Stitch为Android创建一个笔记应用程序  第8张    

7.添加注释

在第二个活动中,您将需要一个 Stitch 客户端和一个 MongoDB Atlas 客户端。您将需要前者来获取用户的身份验证 ID,而后者则需要在您的 MongoDB Atlas 集群上执行读写操作。因此,将它们都添加为活动的私有字段。

private val stitchClient = Stitch.getDefaultAppClient()

private val atlasClient  = stitchClient.getServiceClient(
                                RemoteMongoClient.factory,
                                "mongodb-atlas"
                          )


当用户按下浮动操作按钮时,您必须显示一个对话框,提示他们输入笔记。使用之前作为依赖项添加的Material Dialogs 库,这样做非常直观。

以下代码向您展示了如何向按钮添加点击监听器并创建基本输入对话框:

add_note_button.setOnClickListener {
    val dialog = MaterialDialog.Builder(this@NotesActivity)
            .title("New Note")
            .input("Type something", null, false,
                { _, note ->

                    // More code here

                }
            ).build()
    dialog.show()
}


在对话框的事件处理程序中,您可以访问用户输入的注释。要将其存储在 MongoDB Atlas 集群中,您必须将其放入新的 MongoDB 文档中。此外,为了确保注释仅对创建它的用户可见,文档必须包含一个user_id 字段,其值与用户的身份验证 ID 匹配。以下代码位于事件处理程序中,向您展示了如何创建文档:

val document = Document()
document["text"] = note.toString()
document["user_id"] = stitchClient.auth.user!!.id


现在文档已准备就绪,您必须将其插入到notes 属于notes_db 数据库的集合中。以下是获取对数据库和集合的引用并使用该insertOne() 方法插入文档的方法:

val collection = atlasClient.getDatabase("notes_db")
                            .getCollection("notes")

collection.insertOne(document).addOnSuccessListener {
    Toast.makeText(this@NotesActivity,
            "One note saved", Toast.LENGTH_LONG).show()
}


如果您现在运行该应用程序,您应该能够创建新笔记并保存它们。

使用 MongoDB Stitch为Android创建一个笔记应用程序  第9张    

8.显示注释

为了能够显示用户创建的注释,您必须首先获取notes 集合中属于该用户的所有文档。不过,您不必编写复杂的查询来执行此操作。由于您之前创建的规则,Stitch 自动确保您在集合上运行的任何查询都将仅返回用户拥有的那些文档。

创建一个新方法来显示注释。

private fun showNotes() {
    // More code here
}


在方法内部,您可以直接调用集合上的find() 方法notes 来创建可以获取用户笔记的查询。要异步执行查询,您必须调用该into() 方法并将一个空列表传递给它。成功完成后,查询结果将显示在列表中。

val notes = mutableListOf<Document>()

atlasClient.getDatabase("notes_db")
        .getCollection("notes")
        .find()
        .into(notes)
        .addOnSuccessListener {
            
            // More code here

        }


在 on-success 监听器中,您现在必须创建ArrayAdapter 该类的一个实例来呈现笔记列表。但是,您不能将Document 对象列表直接传递给类的构造函数。您必须首先将其转换为String 对象列表。以下代码向您展示了如何使用该map() 方法执行此操作:

val adapter = ArrayAdapter<String>(this@NotesActivity,
        R.layout.layout_note, R.id.note_text,
        notes.map {
            it.getString("text") // Extract only the 'text' field
                                // of each document
        }
)

适配器准备好后,您可以通过将其分配给小部件的adapter 属性来使其工作ListView 。

notes_container.adapter = adapter


showNotes() 方法现已准备就绪。在方法中添加对它的调用,onCreate() 以便用户可以在活动打开后立即看到他们的笔记。此外,如果您希望列表在创建新注释后立即显示它们,我建议您还在附加到该insertOne() 方法的成功***器中添加对它的调用。

通过上述更改,如果您再次运行该应用程序,您将能够添加新笔记并查看现有笔记。

使用 MongoDB Stitch为Android创建一个笔记应用程序  第10张

结论

在本教程中,您看到了创建一个由 MongoDB Stitch 支持的简单移动应用程序是多么容易。您还学习了如何使用 Google 作为身份验证提供商和 Stitch 的声明式访问规则来确保最终用户数据的安全和私密。

文章目录
  • 先决条件
  • 1.创建一个 Stitch 应用程序
  • 2.设置认证
  • 3.添加规则
  • 4.配置 Android 项目
  • 5.创建布局
  • 6.实现谷歌登录
  • 7.添加注释
  • 8.显示注释
  • 结论