{"id":1661,"date":"2018-10-24T15:42:05","date_gmt":"2018-10-24T20:42:05","guid":{"rendered":"http:\/\/naps.com.mx\/blog\/?p=1661"},"modified":"2020-03-03T13:15:06","modified_gmt":"2020-03-03T19:15:06","slug":"primeros-pasos-en-realm-con-android","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/primeros-pasos-en-realm-con-android\/","title":{"rendered":"Primeros pasos en Realm con Android"},"content":{"rendered":"<p><em><strong>Veremos c\u00f3mo trabajar Realm con Android. Realm es una base de datos para aplicaciones m\u00f3viles que es una excelente alternativa a SQLite. Veremos c\u00f3mo instalar Realm en Android, y c\u00f3mo configurar la base de datos.<\/strong><\/em><\/p>\n<p><!--more--><\/p>\n<h2>C\u00f3mo instalar Realm con Android<\/h2>\n<p>Veamos c\u00f3mo instalar Realm como un plugin de Gradle.<\/p>\n<p>Ve al archivo build.gradle que est\u00e1 dentro de app -&gt; src -&gt; build.gradle<\/p>\n<div id=\"attachment_1662\" style=\"width: 574px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-gradle-realm-flecha.jpeg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1662\" class=\"size-full wp-image-1662\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-gradle-realm-flecha.jpeg\" alt=\"Archivo Build.gradle\" width=\"564\" height=\"686\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-gradle-realm-flecha.jpeg 564w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-gradle-realm-flecha-247x300.jpeg 247w\" sizes=\"auto, (max-width: 564px) 100vw, 564px\" \/><\/a><p id=\"caption-attachment-1662\" class=\"wp-caption-text\">Archivo Build.gradle<\/p><\/div>\n<p>&nbsp;<\/p>\n<p>Abre el archivo y \u00a0a\u00f1ade \u00e9sta l\u00ednea:<\/p>\n<p><strong>apply plugin: \u2018realm-android&#8217;<\/strong><\/p>\n<p>Ir \u00a0al archivo build.gradle que est\u00e1 dentro de tu proyecto:<\/p>\n<p><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-b-gradle-otro-flechas.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1664\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-b-gradle-otro-flechas.jpeg\" alt=\"\" width=\"1160\" height=\"264\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-b-gradle-otro-flechas.jpeg 1160w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-b-gradle-otro-flechas-300x68.jpeg 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-b-gradle-otro-flechas-768x175.jpeg 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/01-b-gradle-otro-flechas-1024x233.jpeg 1024w\" sizes=\"auto, (max-width: 1160px) 100vw, 1160px\" \/><\/a><\/p>\n<p>En la secci\u00f3n de dependencies a\u00f1ade \u00e9sta l\u00ednea:<\/p>\n<p><strong>classpath \u201cio.realm:realm-gradle-plugin:5.7.0&#8243;<\/strong><\/p>\n<p>Si tienes dudas o problemas puedes leer la documentaci\u00f3n de Realm en <a href=\"https:\/\/realm.io\/docs\/java\/latest\">https:\/\/realm.io\/docs\/java\/latest<\/a><\/p>\n<p><strong>Actualiza las dependencias<\/strong>. Da clic en el enlace Sync Now.<\/p>\n<h2>Crear paquetes en la aplicaci\u00f3n<\/h2>\n<p>Vamos a crear los siguientes paquetes:<\/p>\n<p>Activities,\u00a0App,\u00a0Adapters y\u00a0Models.<\/p>\n<p>Da clic derecho sobre el equivalente a \u00abcom.example.gibgarcia.gibdata\u00bb en tu proyecto y elige New -&gt; Package. A cada <em><strong>package<\/strong><\/em> dale el nombre ya indicado.<\/p>\n<p>Mueve el <em><strong>MainActivity<\/strong><\/em> al paquete <em><strong>Activities<\/strong><\/em> (solo arrastra el archivo). Deber\u00e1 verse todo as\u00ed:<\/p>\n<p><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/02-paquetes.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1666\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/02-paquetes.jpeg\" alt=\"\" width=\"662\" height=\"354\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/02-paquetes.jpeg 662w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/02-paquetes-300x160.jpeg 300w\" sizes=\"auto, (max-width: 662px) 100vw, 662px\" \/><\/a><\/p>\n<p>Vamos a crear dentro de models los archivos: Board y Note.<\/p>\n<h2>Crear las clases que definen la base de datos<\/h2>\n<p>En el paquete <strong>models<\/strong> agrega una clase llamada <strong>Board<\/strong> y luego una clase llamada <strong>Note<\/strong> (Click derecho sobre models, luego en New -&gt; Java Class. Indica el nombre de Board, y repite para Note). La estructura deber\u00eda quedar de la siguiente manera:<\/p>\n<p><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/03-clases-de-models.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1665 \" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/03-clases-de-models-300x156.jpeg\" alt=\"\" width=\"265\" height=\"138\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/03-clases-de-models-300x156.jpeg 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/03-clases-de-models.jpeg 600w\" sizes=\"auto, (max-width: 265px) 100vw, 265px\" \/><\/a><\/p>\n<p>La clase Board (tablero) nos permitir\u00e1 crear notas (Note). Veamos el c\u00f3digo de cada clase.<\/p>\n<h2>C\u00f3digo de la clase Note<\/h2>\n<pre class=\"lang:java decode:true  \">public class Note extends RealmObject {\r\n    @PrimaryKey   \/\/import io.realm.annotations.PrimaryKey\r\n    private int id;\r\n    @Required\r\n    private String description;\r\n    @Required\r\n    private Date createdAt;  \/\/imports java.util.Date\r\n\r\n    public Note(String description){\r\n        this.id = MyApplication.NoteId.incrementAndGet();\r\n        this.description = description;\r\n        this.createdAt = new  Date();\r\n\r\n    }\r\n\r\n    public int getId() {\r\n        return id;\r\n    }\r\n\r\n    public String getDescription() {\r\n        return description;\r\n    }\r\n\r\n    public void setDescription(String description) {\r\n        this.description = description;\r\n    }\r\n\r\n    public Date getCreatedAt() {\r\n        return createdAt;\r\n    }\r\n\r\n\r\n}\r\n<\/pre>\n<p>\u00c9sta clase hereda de RealmObject y define un modelo de datos para nuestra aplicaci\u00f3n.<\/p>\n<p>Observa que la clase (y el objeto de Base de Datos) <em><strong>Note<\/strong><\/em> contendr\u00e1 un id, una descripci\u00f3n y la fecha en la que fue creada la nota.<\/p>\n<p>Con anotaciones de Realm, le podemos indicar si es clave primaria o si el dato es requerido.<\/p>\n<h2>C\u00f3digo de la clase Board<\/h2>\n<p>La clase Board es muy parecida, solo que se programar\u00e1 para que un Board tenga varios Notes.<\/p>\n<pre class=\"lang:java decode:true\">public class Board  extends RealmObject{\r\n    @PrimaryKey   \/\/import io.realm.annotations.PrimaryKey\r\n    private int id;\r\n    @Required\r\n    private String title ;\r\n    @Required\r\n    private Date createdAt;  \/\/imports java.util.Date\r\n\r\n    private RealmList&lt;Note&gt; notes; \/\/Un tablero puede tener muchas notas.\r\n\r\n\r\n    \/\/Realm requiere este constructor vac\u00edo.\r\n    public Board(){\r\n\r\n    }\r\n\r\n    public Board(String title){\r\n        this.id = MyApplication.BoardId.incrementAndGet();\r\n        this.title = title;\r\n        this.createdAt = new Date();\r\n        this.notes = new RealmList&lt;Note&gt;();\r\n    }\r\n\r\n    public int getId() {\r\n        return id;\r\n    }\r\n\r\n\r\n\r\n    public String getTitle() {\r\n        return title;\r\n    }\r\n\r\n    public void setTitle(String title) {\r\n        this.title = title;\r\n    }\r\n\r\n    public Date getCreatedAt() {\r\n        return createdAt;\r\n    }\r\n\r\n\r\n    public RealmList&lt;Note&gt; getNotes() {\r\n        return notes;\r\n    }\r\n\r\n\r\n}\r\n<\/pre>\n<p>Recuerda que puedes generar los setter y getter dado clic auxiliar y luego en generate. Nota que no estamos utilizando el setter de id ni el de createdAt.<\/p>\n<h2>Configuraci\u00f3n de Realm con Android<\/h2>\n<p>Crea una nueva clase llamada MyApplication dentro del package app.<\/p>\n<p>C\u00f3digo de la clase MyApplication<\/p>\n<pre class=\"lang:java decode:true \">public class MyApplication extends Application {\r\n\r\n    public static AtomicInteger BoardId  = new AtomicInteger();\r\n    public static AtomicInteger NoteId = new AtomicInteger();\r\n\r\n\r\n    @Override\r\n    public void onCreate() {\r\n        \/\/Esta clase ser\u00e1 ejecutada antes de nuestro ManinActivity\r\n        \/\/Aqui leemos de la BD cu\u00e1l es el m\u00e1ximo valor de ID que tenemos\r\n        super.onCreate();\r\n        setUpRealConfig(); \/\/ M\u00e9todo para configurar la BD\r\n        Realm realm = Realm.getDefaultInstance();\r\n        BoardId = getIdByTable(realm, Board.class);\r\n        NoteId = getIdByTable(realm, Note.class);\r\n        realm.close();\r\n\r\n\r\n    }\r\n\r\n    private void setUpRealConfig(){\r\n        Realm.init(getApplicationContext());\r\n        RealmConfiguration config = new RealmConfiguration.Builder()\r\n                .deleteRealmIfMigrationNeeded()\r\n                .build();\r\n        Realm.setDefaultConfiguration(config);\r\n    }\r\n\r\n    private &lt;T extends RealmObject&gt; AtomicInteger getIdByTable (Realm realm , Class&lt;T&gt; anyClass){\r\n       RealmResults&lt;T&gt; results = realm.where(anyClass).findAll();\r\n       return (results.size()&gt;0) ? new AtomicInteger(results.max(\"id\").intValue()) : new AtomicInteger();\r\n\r\n    }\r\n}\r\n<\/pre>\n<p>\u00c9sta clase se ejecutar\u00e1 antes de que se ejecute nuestro MainActivitiy (la primera interfaz de la aplicaci\u00f3n), por lo que nos sirve para realizar la configuraci\u00f3n por defecto de Realm, y para recuperar el \u00faltimo id de cada una de las tablas.<\/p>\n<p>Para que la aplicaci\u00f3n reconozca \u00e9sta clase, debemos incluirla en el archivo AndroidManifest.xml. Por ejemplo:<\/p>\n<p><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/Agregar-MyApplication-a-manifest.jpeg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1699\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/Agregar-MyApplication-a-manifest.jpeg\" alt=\"\" width=\"1124\" height=\"428\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/Agregar-MyApplication-a-manifest.jpeg 1124w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/Agregar-MyApplication-a-manifest-300x114.jpeg 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/Agregar-MyApplication-a-manifest-768x292.jpeg 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/10\/Agregar-MyApplication-a-manifest-1024x390.jpeg 1024w\" sizes=\"auto, (max-width: 1124px) 100vw, 1124px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>En el siguiente art\u00edculo continuaremos \u00e9sta aplicaci\u00f3n.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Veremos c\u00f3mo trabajar Realm con Android. Realm es una base de datos para aplicaciones m\u00f3viles que es una excelente alternativa a SQLite. Veremos c\u00f3mo instalar Realm en Android, y c\u00f3mo configurar la base de datos.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[234],"tags":[198,235,243],"class_list":["post-1661","post","type-post","status-publish","format-standard","hentry","category-aplicaciones-moviles","tag-android","tag-desarrollo-de-aplicaciones-moviles","tag-realm"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=1661"}],"version-history":[{"count":11,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1661\/revisions"}],"predecessor-version":[{"id":1904,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1661\/revisions\/1904"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=1661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=1661"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=1661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}