17

Soy nuevo en el desarrollo de Android, y he estado jugando un poco con él. Estaba tratando de crear un programa que tenga una pequeña colección similar a una base de datos de datos que nunca cambian. En C#, mi mejor lenguaje actual, usaría una lista de una clase personalizada y la serializaría en un archivo xml, y 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 haría lo que estoy visualizando. ¿Cuál sería la mejor manera de hacer esto?Almacenar datos estáticos en Android: ¿recurso personalizado?

Los datos nunca tendrán que cambiar. Ejemplo:

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

Sé que está diseñada como una mesa, pero el uso de una base de datos no tiene mucho sentido para mí debido a que los datos nunca van a cambiar, y yo necesitaría una forma de almacenarla para llenar inicialmente la base de datos de todos modos.

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 ...

Respuesta

13

La mejor manera es usar el Android Resource Heirarchy.

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, te referirías a ellos usando una identificación de recursos autogenerados (nombre basado en la clave de tu recurso). Vea el enlace de arriba para más documentación y detalles.

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

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

+0

habría que ser mejor o peor que su almacenamiento en un formato XML y la lectura en? y si utilicé un formulario xml, ¿cómo lo leería? – NickAldwin

+1

@NickAldwin Mejor en que podría almacenar en cualquier formato que desee, peor aún no tiene API integradas para analizar los datos. También puede usar la jerarquía de recursos que sería mejor. Editaré mi publicación con los detalles. – CodeFusionMobile

+1

Lo que me preocupa con res/values ​​/ es que no planeo solo almacenar datos en pares de uno a uno (como en el ejemplo anterior). Entonces, ¿está construido en apis para analizar archivos xml distintos a los de la jerarquía especificada en el enlace que publicaste? EDITAR: ¿TypedArray funcionaría para una clase personalizada (como el ejemplo "Blob" anterior)? ¿Ese sería el camino a seguir? – NickAldwin

16

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

Por eso ... Usted puede hacer una cosa, hacer un archivo XML a saber, "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 XML PullParser técnica para analizar datos. Puede tener ejemplos de codificación de la técnica PullParsing en Example, consulte este ejemplo para obtener una mejor idea.

¡Disfrútalo!

+0

Sí, esa es la técnica con la que terminé, como se discutió en los comentarios de la respuesta aceptada. De hecho, encontré las instrucciones aquí para ser el mejor para XmlPullParser: http://www.ibm.com/developerworks/opensource/library/x-android/index.html – NickAldwin

+0

Pensé que te había votado ... ¡oops! – NickAldwin

+0

no es posible actualizar este xml como valor de campo para cambiar cuando la persona lo modifique.Para ex Blob 1 a sumit Sharma

1

De acuerdo con la doc, /xml es el camino a seguir.

Providing Resources

xml/ archivos XML arbitrarios que pueden ser leídos en tiempo de ejecución llamando

Resources.getXML(). 

Varios archivos de configuración XML deben guardarse aquí, tal como una configuración de búsqueda.

Documentation for 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 Java para almacenar los datos y procesado:

    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 analizador en sí:

    /** 
    * 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, llamar 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(); 
    } 
    
Cuestiones relacionadas