{"id":1717,"date":"2018-11-14T15:07:38","date_gmt":"2018-11-14T21:07:38","guid":{"rendered":"http:\/\/naps.com.mx\/blog\/?p=1717"},"modified":"2018-11-25T11:27:46","modified_gmt":"2018-11-25T17:27:46","slug":"editar-y-eliminar-elementos-en-realm","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/editar-y-eliminar-elementos-en-realm\/","title":{"rendered":"Editar y eliminar elementos en Realm"},"content":{"rendered":"<p><em><strong>Realizaremos una aplicaci\u00f3n Android que permita editar y eliminar elementos en <a href=\"https:\/\/realm.io\">Realm<\/a>. Utilizaremos para esto un men\u00fa colocado en el Action Bar de la app, as\u00ed como un men\u00fa contextual relacionado con un ListView que muestra los elementos guardados en una base de datos Realm.<\/strong><\/em><\/p>\n<p><!--more--><\/p>\n<h2>Creaci\u00f3n de un directorio de recursos<\/h2>\n<p>Vamos a crear un directorio de recursos para colocar all\u00ed nuestros men\u00fas.<span class=\"Apple-converted-space\">\u00a0<\/span><\/p>\n<p>Da clic derecho en <em>res<\/em><\/p>\n<p>Selecciona <strong>New-&gt;Android Resource Directory<\/strong><\/p>\n<p>En <strong>resource type<\/strong> elige <em>menu<\/em>, en<strong> directory name <\/strong>deja la opci\u00f3n: <em>menu<\/em><\/p>\n<p>Notaremos que se cre\u00f3 una carpeta llamada <strong>menu<\/strong> dentro de <em>res<\/em><\/p>\n<h2>Creaci\u00f3n de los men\u00fas<\/h2>\n<h3>Creaci\u00f3n del men\u00fa que ir\u00e1 en el Action Bar<\/h3>\n<p>Da clic derecho sobre la carpeta menu (creada anteriormente)<\/p>\n<p>Selecciona <strong>New-&gt;menu resource file<\/strong><\/p>\n<p>En <strong>File name\u00a0<\/strong>escribe: <em>menu_main_activity<\/em><\/p>\n<p>El c\u00f3digo de \u00e9ste archivo ser\u00e1 el siguiente:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;menu xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"&gt;\r\n    &lt;item\r\n        android:id=\"@+id\/delete_all\"\r\n        android:title=\"Borrar todo\"\r\n        \/&gt;\r\n&lt;\/menu&gt;<\/pre>\n<p>Vamos a crear a continuaci\u00f3n el <strong>men\u00fa contextual<\/strong> que aparecer\u00e1 cuando demos una pulsaci\u00f3n larga sobre un elemento del ListView.<\/p>\n<p>Da clic derecho sobre la carpeta menu<\/p>\n<p>Selecciona <strong>New-&gt;menu resource file<\/strong><\/p>\n<p>En <strong>File name<\/strong>\u00a0escribe: \u00a0context_menu_main_activity<\/p>\n<p>El c\u00f3digo de \u00e9ste archivo ser\u00e1:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;menu xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"&gt;\r\n    &lt;item\r\n        android:id=\"@+id\/edit_board\"\r\n        android:title=\"Editar\" \/&gt;\r\n    &lt;item\r\n        android:id=\"@+id\/delete_board\"\r\n        android:title=\"Borrar\" \/&gt;\r\n&lt;\/menu&gt;<\/pre>\n<p>Vamos ahora a <strong>MainActivity.java<\/strong><\/p>\n<p>(Consideramos que ya has realizado la parte previa de \u00e9ste proyecto, que puedes consultar <a href=\"http:\/\/naps.com.mx\/blog\/creacion-de-una-aplicacion-padre-hijo-en-realm-con-android\/\">aqu\u00ed<\/a>)<\/p>\n<h2>Men\u00fa de opciones que ir\u00e1 en el Action Bar<\/h2>\n<p>En MainActivity vamos a escribir el c\u00f3digo necesario para mostrar el men\u00fa que tiene la opci\u00f3n de <em>Borrar todo.<\/em><\/p>\n<p>Escribe el siguiente c\u00f3digo:<\/p>\n<pre class=\"lang:java decode:true \">@Override\r\n    public boolean onCreateOptionsMenu(Menu menu){\r\n        getMenuInflater().inflate(R.menu.menu_main_activity,menu);\r\n        return super.onCreateOptionsMenu(menu);\r\n    }\r\n\r\n    @Override\r\n    public boolean onOptionsItemSelected(MenuItem item) {\r\n        switch (item.getItemId()){\r\n            case R.id.delete_all:\r\n                deleteAll();\r\n                return true;\r\n            default:\r\n                return super.onOptionsItemSelected(item);\r\n        }\r\n    }<\/pre>\n<h2>Men\u00fa contextual relacionado con el ListView<\/h2>\n<p>Haremos lo mismo pero ahora con el men\u00fa contextual que tiene las opciones de <em>Editar<\/em> y <em>Borrar<\/em>.<\/p>\n<pre class=\"lang:java decode:true \">@Override\r\n    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {\r\n        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;\r\n        menu.setHeaderTitle(boards.get(info.position).getTitle());\r\n        getMenuInflater().inflate(R.menu.context_menu_main_activity,menu);\r\n    }\r\n\r\n    @Override\r\n    public boolean onContextItemSelected(MenuItem item) {\r\n        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();\r\n        switch (item.getItemId()){\r\n            case R.id.delete_board:\r\n                deleteBoard(boards.get(info.position));\r\n                return true;\r\n            case R.id.edit_board:\r\n                showAlertForEditingboard(\"Editar tablero\", \"Cambia el nombre del tablero\", boards.get(info.position));\r\n                return true;\r\n            default:\r\n                return super.onContextItemSelected(item);\r\n        }\r\n    }<\/pre>\n<h2>Editar y eliminar elementos en Realm<\/h2>\n<p>Como puedes observar los men\u00fas que hemos creado invocan las siguientes operaciones: Borrar todo, Borrar un elemento y Editar un elemento.<\/p>\n<p>Vamos a crear los m\u00e9todos que realizan \u00e9stas acciones.<\/p>\n<h2>Eliminar elementos en Realm<\/h2>\n<p>Agrega los siguientes m\u00e9todos a nuestro c\u00f3digo de MainActivity<\/p>\n<pre class=\"lang:java decode:true \">    private void deleteAll() {\r\n        realm.beginTransaction();\r\n        realm.deleteAll();\r\n        realm.commitTransaction();\r\n    }\r\n\r\n    private void deleteBoard(Board board) {\r\n        realm.beginTransaction();\r\n        board.deleteFromRealm();\r\n        realm.commitTransaction();\r\n    }<\/pre>\n<h2>Editar elementos en Realm<\/h2>\n<p>Para el proceso de editar un registro, primero creamos un m\u00e9todo que abra un cuadro de di\u00e1logo donde el usuario puede editar el nombre de un \u201ctablero\u201d. Si el nuevo nombre cumple los requisitos, se invoca la instrucci\u00f3n para editar elementos en Realm.<\/p>\n<h3>Cuadro di\u00e1logo para editar el nombre de un tablero<\/h3>\n<pre class=\"lang:java decode:true \">public void showAlertForEditingboard(String title, String message, final Board board){\r\n        AlertDialog.Builder builder = new AlertDialog.Builder(this);        \r\n        if (title != null) builder.setTitle(title);\r\n        if (message != null) builder.setMessage(message);        \r\n        View viewInflated = LayoutInflater.from(this).inflate(R.layout.dialog_create_board, null);        \r\n        builder.setView(viewInflated);\r\n        final EditText input = (EditText) viewInflated.findViewById(R.id.editTextNewBoard);\r\n        input.setText(board.getTitle());        \r\n        builder.setPositiveButton(\"Guardar\", new DialogInterface.OnClickListener() {\r\n            @Override\r\n            public void onClick(DialogInterface dialogInterface, int i) {        \r\n                String boardName = input.getText().toString().trim();\r\n                if (boardName.length()== 0)\r\n                    Toast.makeText(getApplicationContext(), \"Debe escribir un nombre\", Toast.LENGTH_LONG).show();\r\n                else if (boardName.equals(board.getTitle())){\r\n                    Toast.makeText(getApplicationContext(), \"El nombre es el mismo\", Toast.LENGTH_LONG).show();\r\n                }\r\n                else{\r\n                    editBoard(boardName, board);\r\n                }\r\n            }\r\n        });        \r\n        AlertDialog dialog = builder.create();\r\n        dialog.show();\r\n    }<\/pre>\n<h3>M\u00e9todo que edita elementos en realm<\/h3>\n<p>Agregamos adem\u00e1s el siguiente m\u00e9todo:<\/p>\n<pre class=\"lang:java decode:true \">    private void editBoard(String newName, Board board) {\r\n        realm.beginTransaction();\r\n        board.setTitle(newName);\r\n        realm.copyToRealmOrUpdate(board);\r\n        realm.commitTransaction();\r\n    }<\/pre>\n<p>Ya solo nos queda registrar el menu contextual para que sea utilizado por el <em>ListView<\/em>, por lo que agregamos la siguiente l\u00ednea a nuestro m\u00e9todo onCreate:<\/p>\n<pre class=\"lang:java decode:true \">registerForContextMenu(listview);<\/pre>\n<p>La apariencia de los men\u00fas es similar a lo que vemos a continuaci\u00f3n:<\/p>\n<div id=\"attachment_1723\" style=\"width: 452px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/12-borrar-todo.jpeg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1723\" class=\"size-full wp-image-1723\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/12-borrar-todo.jpeg\" alt=\"Men\u00fa en el Action Bar\" width=\"442\" height=\"316\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/12-borrar-todo.jpeg 442w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/12-borrar-todo-300x214.jpeg 300w\" sizes=\"auto, (max-width: 442px) 100vw, 442px\" \/><\/a><p id=\"caption-attachment-1723\" class=\"wp-caption-text\">Men\u00fa en el Action Bar<\/p><\/div>\n<div id=\"attachment_1724\" style=\"width: 448px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/13-editar-y-eliminar-elementos-en-Realm.jpeg\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1724\" class=\"size-full wp-image-1724\" src=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/13-editar-y-eliminar-elementos-en-Realm.jpeg\" alt=\"Men\u00fa para Editar y eliminar elementos en Realm\" width=\"438\" height=\"386\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/13-editar-y-eliminar-elementos-en-Realm.jpeg 438w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/13-editar-y-eliminar-elementos-en-Realm-300x264.jpeg 300w\" sizes=\"auto, (max-width: 438px) 100vw, 438px\" \/><\/a><p id=\"caption-attachment-1724\" class=\"wp-caption-text\">Men\u00fa para Editar y eliminar elementos en Realm<\/p><\/div>\n<p>Si deseas ver el resultado final, da clic <a href=\"http:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2018\/11\/14-gif-Editar-y-eliminar-elementos-en-Realm.gif\">aqu\u00ed<\/a>.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Realizaremos una aplicaci\u00f3n Android que permita editar y eliminar elementos en Realm. Utilizaremos para esto un men\u00fa colocado en el Action Bar de la app, as\u00ed como un men\u00fa contextual relacionado con un ListView que muestra los elementos guardados en una base de datos Realm.<\/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-1717","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\/1717","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=1717"}],"version-history":[{"count":8,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1717\/revisions"}],"predecessor-version":[{"id":1737,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1717\/revisions\/1737"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=1717"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=1717"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=1717"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}