studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android xml android-resources android-parser android-pullparser

para - manual de programacion android pdf



¿Almacenar datos estáticos en Android-recurso personalizado? (4)

Soy nuevo en el desarrollo de Android, y he estado jugando un poco con él. Estaba intentando crear un programa que tiene una pequeña base de datos de datos que nunca cambian, como una base de datos. En C #, mi mejor idioma actualmente, usaría una Lista de una clase personalizada y la serializaría en un archivo xml, luego lo leería en mi aplicación en tiempo de ejecución. Encontré la carpeta de recursos / xml en Android, pero no estoy seguro de cómo iría haciendo lo que estoy imaginando. ¿Cuál sería la mejor manera de hacer esto?

Los datos nunca tendrán que cambiar. Ejemplo:

Blob | A | B ---------------- Blob 1 | 23 | 42 Blob 2 | 34 | 21

Sé que está dispuesto como una tabla, pero usar una base de datos realmente no tiene sentido para mí porque los datos nunca cambiarán, y de todos modos necesitaría una forma de almacenarlos para llenar inicialmente la base de datos.

Básicamente, estoy buscando una manera de almacenar datos estáticos algo complejos en mi aplicación. ¿Algunas ideas?

EDITAR: También vi la carpeta / raw. Así que podría almacenar cosas en / res / raw o / res / xml. Pero no estoy seguro de cuál sería la mejor manera de almacenar / analizar los datos ...


Creo que esta es la MEJOR solución y ya la estoy usando para almacenar datos estáticos en cada uno de mis proyectos.

Para eso ... Puedes hacer una cosa, hacer un archivo xml llamado "temp.xml" ... y almacenar los datos en temp.xml de la siguiente manera:

<?xml version="1.0" encoding="utf-8"?> <rootelement1> <subelement> Blob 1 <subsubelement> 23 </subsubelement> <subsubelement> 42 </subsubelement> </subelement> <subelement>Blob 2 <subsubelement> 34 </subsubelement> <subsubelement> 21 </subsubelement> </subelement> </rootelement1>

y luego usar la técnica XML PullParser para analizar datos. Puede tener ejemplos de codificación de la técnica PullParsing en Example , consulte este ejemplo para una mejor idea.

¡¡Disfrutar!!


He utilizado Simple para el análisis XML en el pasado. Creo que tiene la menor cantidad de código si sabes qué esperar en xml, que en tu caso lo haces.

http://simple.sourceforge.net/


La mejor manera es usar la jerarquía de recursos de Android .

En el directorio res / values ​​/, puede almacenar cualquier número de pares clave-valor para varios tipos de datos básicos. En tu aplicación, deberías consultarlos usando un ID de recurso generado automáticamente (nombre basado en la clave de tu recurso). Vea el enlace de arriba para más documentación y detalles.

Android también admite archivos de datos en bruto. Puede almacenar sus datos en el directorio de archivos en res / raw / yourfile.dat

Usted crea sus datos en el formato de texto que desee y luego los lee en el inicio de la actividad utilizando las apis de acceso a recursos.


Según el doc , /xml es el camino a seguir.

Proporcionar recursos

xml/ archivos XML arbitrarios que se pueden leer en tiempo de ejecución llamando

Resources.getXML().

Aquí se deben guardar varios archivos de configuración XML, como una configuración de búsqueda.

Documentación para getXML()

También hice un ejemplo de trabajo:

  • la estructura XML:

    <?xml version="1.0" encoding="utf-8"?> <quizquestions> <quizquestion> <header_image_src>ic_help_black_24dp</header_image_src> <question>What is the Capital of U.S.A.?</question> <input_type>Radio</input_type> <answer correct="false">New York City</answer> <answer correct="true">Washington D.C.</answer> <answer correct="false">Chicago</answer> <answer correct="false">Philadelphia</answer> </quizquestion> <quizquestion> <header_image_src>ic_help_black_24dp</header_image_src> <question>What is the family name of the famous dutch painter Vincent Willem van .... ?</question> <input_type>EditText</input_type> <answer correct="true">Gogh</answer> </quizquestion> </quizquestions>

  • la clase de Java para mantener los datos analizados:

    public class QuizQuestion { private int headerImageResId; private String question; private String inputType; private ArrayList<String> answers; private ArrayList<Boolean> answerIsCorrect; private ArrayList<Integer> correctAnswerIndexes; /** * constructor for QuizQuestion object */ QuizQuestion() { headerImageResId = 0; question = null; inputType = null; answers = new ArrayList<>(); answerIsCorrect = new ArrayList<>(); correctAnswerIndexes = new ArrayList<>(); } public void setHeaderImageResId(int headerImageResId) { this.headerImageResId = headerImageResId; } public int getHeaderImageResId() { return headerImageResId; } void setQuestion(String question) { this.question = question; } public String getQuestion() { return question; } void setInputType(String inputType) { this.inputType = inputType; } public String getInputType() { return inputType; } void addAnswer(String answer, boolean isCorrect) { if (isCorrect) correctAnswerIndexes.add(answers.size()); answers.add(answer); answerIsCorrect.add(isCorrect); } public ArrayList<String> getAnswers() { return answers; } public String getAnswer(int index) { // check index to avoid out of bounds exception if (index < answers.size()) { return answers.get(index); } else { return null; } } public int size() { return answers.size(); } }

  • el propio analizador:

    /** * Created by bivanbi on 2017.02.23.. * * class to parse xml resource containing quiz data into ArrayList of QuizQuestion objects * */ public class QuizXmlParser { public static String lastErrorMessage = ""; /** * static method to parse XML data into ArrayList of QuizQuestion objects * @param activity is the calling activity * @param xmlResourceId is the resource id of XML resource to be parsed * @return null if parse error is occurred or ArrayList of objects if successful * @throws XmlPullParserException * @throws IOException */ public static ArrayList<QuizQuestion> parse(Activity activity, int xmlResourceId) throws XmlPullParserException, IOException { String logTag = QuizXmlParser.class.getSimpleName(); Resources res = activity.getResources(); XmlResourceParser quizDataXmlParser = res.getXml(R.xml.quiz_data); ArrayList<String> xmlTagStack = new ArrayList<>(); ArrayList<QuizQuestion> quizQuestions = new ArrayList<>(); QuizQuestion currentQuestion = null; boolean isCurrentAnswerCorrect = false; quizDataXmlParser.next(); int eventType = quizDataXmlParser.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { // begin document if(eventType == XmlPullParser.START_DOCUMENT) { Log.d(logTag,"Begin Document"); } // begin tag else if(eventType == XmlPullParser.START_TAG) { String tagName = quizDataXmlParser.getName(); xmlTagStack.add(tagName); Log.d(logTag,"Begin Tag "+tagName+", depth: "+xmlTagStack.size()); Log.d(logTag,"Tag "+tagName+" has "+quizDataXmlParser.getAttributeCount()+" attribute(s)"); // this is a beginning of a quiz question tag so create a new QuizQuestion object if (tagName.equals("quizquestion")){ currentQuestion = new QuizQuestion(); } else if(tagName.equals("answer")) { isCurrentAnswerCorrect = quizDataXmlParser.getAttributeBooleanValue(null,"correct",false); if (isCurrentAnswerCorrect == true) { Log.d(logTag, "Tag " + tagName + " has attribute correct = true"); } else { Log.d(logTag, "Tag " + tagName + " has attribute correct = false"); } } } // end tag else if(eventType == XmlPullParser.END_TAG) { String tagName = quizDataXmlParser.getName(); if (xmlTagStack.size() < 1) { lastErrorMessage = "Error 101: encountered END_TAG "+quizDataXmlParser.getName()+" while TagStack is empty"; Log.e(logTag, lastErrorMessage); return null; } xmlTagStack.remove(xmlTagStack.size()-1); Log.d(logTag,"End Tag "+quizDataXmlParser.getName()+", depth: "+xmlTagStack.size()); // reached the end of a quizquestion definition, add it to the array if (tagName.equals("quizquestion")){ if (currentQuestion != null) quizQuestions.add(currentQuestion); currentQuestion = null; } } // text between tag begin and end else if(eventType == XmlPullParser.TEXT) { String currentTag = xmlTagStack.get(xmlTagStack.size()-1); String text = quizDataXmlParser.getText(); Log.d(logTag,"Text: "+text+", current tag: "+currentTag+", depth: "+xmlTagStack.size()); if (currentQuestion == null) { Log.e(logTag,"currentQuestion is not initialized! text: "+text+", current tag: "+currentTag+", depth: "+xmlTagStack.size()); continue; } if (currentTag.equals("header_image_src")) { int drawableResourceId = activity.getResources().getIdentifier(text, "drawable", activity.getPackageName()); currentQuestion.setHeaderImageResId(drawableResourceId); } else if (currentTag.equals("question")) { currentQuestion.setQuestion(text); } else if (currentTag.equals("answer")) { currentQuestion.addAnswer(text, isCurrentAnswerCorrect); } else if (currentTag.equals("input_type")) { currentQuestion.setInputType(text); } else { Log.e(logTag,"Unexpected tag "+currentTag+" with text: "+text+", depth: "+xmlTagStack.size()); } } eventType = quizDataXmlParser.next(); } Log.d(logTag,"End Document"); return quizQuestions; } }

  • y finalmente, llamando al analizador:

    // read quiz data from xml resource quiz_data try { quizQuestions = QuizXmlParser.parse(this,R.xml.quiz_data); Log.d("Main","QuizQuestions: "+quizQuestions); } catch (XmlPullParserException e) { // TODO Auto-generated catch block e.printStackTrace(); quizQuestions = null; } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); quizQuestions = null; } if (quizQuestions == null) { Toast.makeText(this,"1001 Failed to parse Quiz XML, sorry", Toast.LENGTH_LONG).show(); finish(); }