Omet navegació

5.2 - MongoDB

L'única dificultat que tindrem és que l'últim driver de MongoDB no funciona bé en Android, així que senzillament agafarem un driver anterior adaptat per a que funcione. No és l'oficial, sinó un adaptat per a que no done un error de javax.security.sasl

Aquest és l'enllaç d'aquest driver:

https://github.com/matfur92/mongo-java-driver/blob/gh-pages/JARs/mongo-java-driver-3.4.0-SNAPSHOT.jar?raw=true

Anem a provar-lo sobre un projecte nou.

  • Creeu un nou projecte d'Android, que el podeu anomenar per exemple MongoDB_Accedir
  • Incorporeu el driver de MongoDB comentat més amunt. El millor seria incorporar-lo en la vista de Project en app -> libs, i després apretar damunt amb el botó de la dreta i triar Add as library
  • Doneu el permís d'accedir a Internet. En el AndroidManifest.xml, afegiu la següent línia, dins de manifest però fora de application:
    <uses-permission android:name="android.permission.INTERNET" />
  • Afegiu el id 'kotlin-android-extensions' al build.gradle de la app, per a que els components que posem en el layout estiguen directament disponibles des del programa
  • Creeu el següent activity_main.xml, on tindrem únicament un TextView per a poder visualitzar el resultat
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text=""
        android:id="@+id/text"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

A continuació copieu el següent codi en el MainActivity.kt, on sezillament ens connectem al MongoDB del servidor de l'Institut, i agafem el títol i preu dels llibres de la col·lecció libro ordenats per preu de forma descendent. Recordeu que no el podem fer en el programa principal, per això muntem un thread.

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.mongodb.MongoClient
import com.mongodb.MongoClientURI
import kotlinx.android.synthetic.main.activity_main.*
import org.bson.Document
import com.mongodb.DBCursor

class MainActivity : AppCompatActivity() {
    internal var cont: String = ""


    private var sqlThread: Thread = object : Thread() {
        override fun run() {

            val con = MongoClient(MongoClientURI("mongodb://ad:ieselcaminas@89.36.214.106/?authSource=test"))
            val bd = con.getDatabase("test")

            val ordenar = Document()
            ordenar.put("precio", -1)

            val llibres = bd.getCollection("libro").find().sort(ordenar)

            for (llibre in llibres)
                cont += llibre.get("titulo").toString() + " --> " + llibre.get("precio") + "\n"

            con.close()

        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Des de la versió 3 d'Android, no es permet obrir una connexió des del thread principal.
        // Per tant s'ha de crear un nou.
        sqlThread.start()

        // i ara esperem a que finalitze el thread fill unint-lo (join)
        try {
            sqlThread.join()
        } catch (e: InterruptedException) {
            e.printStackTrace()
        }

        text.setText(cont)

    }
}

Aquest seria el resultat: