Frage

Ich bin neu in Android Entwicklung, und ich habe mit ihm ein bisschen herumspielen. Ich habe versucht, ein Programm zu erstellen, die eine kleine Datenbank-ähnliche Sammlung von nie ändernden Daten hat. In C #, meine derzeit besten Sprache, werde ich eine Liste von einer benutzerdefinierten Klasse verwenden und serialize dass in eine XML-Datei, dann, dass zur Laufzeit in meine Anwendung lesen. Ich fand die / xml Ressourcenordner in Android, aber ich bin nicht sicher, wie ich gehen würde zu tun, was ich bin Absehen. Was wäre der beste Weg, um dies zu tun gehen?

Die Daten werden nie ändern müssen. Beispiel:

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

Ich weiß, dass wie ein Tisch ist angelegt, aber eine Datenbank mit nicht wirklich Sinn für mich, weil die Daten nie ändern, und ich würde einen Weg brauchen, es zu speichern, zunächst die Datenbank zu füllen sowieso .

Also im Grunde suche ich nach einer Möglichkeit, speichern etwas Komplex statischen Daten in meiner Anwendung. Irgendwelche Ideen?

EDIT: Ich sah auch die / raw Ordner. Also habe ich die Dinge in / res / raw oder / res / xml speichern könnte. Aber ich bin sicher nicht das, was zum Speichern der beste Weg wäre / analysiert die Daten ...

War es hilfreich?

Lösung

Der beste Weg ist, um die Android Ressourcen Hierarchie zu verwenden .

In der res / Werte / Verzeichnis können Sie speichern eine beliebige Anzahl von Schlüssel-Wert-Paare für mehrere grundlegende Datentypen. In der App, würden Sie sich auf sie beziehen eine automatisch generierte Ressource-ID verwendet (Name basierend auf Schlüssel Ihre Ressource). Siehe den Link oben für weitere Dokumentation und Details.

Android unterstützt auch roh Datendateien. Sie können Ihre Daten im Dateiverzeichnis speichern unter res / raw / yourfile.dat

Sie legen Sie Ihre Daten in welcher textbasierten Format, das Sie wollen und es dann auf Aktivität Inbetriebnahme lesen Sie den Ressourcenzugriff-APIs.

Andere Tipps

Ich denke, dies ist die beste Lösung, und ich bin schon mit diesem einer Static-Daten in meinem jedem Projekt zu speichern.

Für die ... Sie können eine Sache, eine XML-Datei machen nämlich „temp.xml“ ..und die Daten in temp.xml speichern, wie folgt:

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

und verwenden Sie dann XML PullParser Technik Parse Daten. Sie haben können Proben von PullParsing Codierungstechnik auf Beispiel finden diese Beispiel für eine bessere Idee.

Genießen Sie !!

Ich habe einfach für das Parsen von XML in der Vergangenheit verwendet. Ich denke, es ist die geringste Menge an Code hat, wenn Sie wissen, was in xml zu erwarten, die in Ihrem Fall, dass Sie tun.

http://simple.sourceforge.net/

Nach dem doc , /xml ist der Weg zu gehen.

Bereitstellung von Ressourcen

xml/ Willkürliche XML-Dateien, die durch den Aufruf zur Laufzeit gelesen werden können,

Resources.getXML().

Verschiedene XML-Konfigurationsdateien müssen hier, wie eine durchsuchbare Konfiguration gespeichert werden.

Dokumentation für getXML()

ich auch ein funktionierendes Beispiel gemacht:

  • Die XML-Struktur:

    <?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>
    
  • die Java-Klasse zu halten Daten analysiert:

    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();
        }
    
    }
    
  • der Parser selbst:

    /**
     * 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;
        }
    
    }
    
  • und schließlich den Aufruf des Parsers:

    //  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();
    }
    
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top