سؤال

أنا جديد على Android Development ، وقد كنت ألعب معها قليلاً. كنت أحاول إنشاء برنامج يحتوي على مجموعة صغيرة تشبه قاعدة البيانات من البيانات التي لا تتغير أبدًا. في C#، أفضل لغة حاليًا ، كنت أستخدم قائمة بفصل مخصص وأقوم بتسلسل ذلك إلى ملف XML ، ثم اقرأ ذلك في طلبي في وقت التشغيل. لقد وجدت مجلد موارد /XML في Android ، لكنني لست متأكدًا من كيفية القيام بما أتخيله. ما هي أفضل طريقة للقيام بذلك؟

لن تحتاج البيانات أبدًا إلى التغيير. مثال:

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

أعلم أنه تم وضعه مثل جدول ، لكن استخدام قاعدة بيانات لا معنى لي حقًا لأن البيانات لن تتغير أبدًا ، وسأحتاج إلى وسيلة لتخزينها لملء قاعدة البيانات في البداية على أي حال.

لذلك أنا أبحث في الأساس عن وسيلة لتخزين بيانات ثابتة إلى حد ما في طلبي. أيه أفكار؟

تحرير: لقد رأيت أيضًا المجلد /الخام. لذلك يمكنني تخزين الأشياء في /الدقة /الخام أو /الدقة /XML. لكنني لست متأكدًا مما قد يكون أفضل طريقة لتخزين/تحليل البيانات ...

هل كانت مفيدة؟

المحلول

أفضل طريقة لاستخدام Android Resource Heirarchy.

في الدقة/ القيم/ الدليل ، يمكنك تخزين أي عدد من أزواج القيمة الرئيسية للعديد من أنواع البيانات الأساسية. في تطبيقك ، يمكنك الرجوع إليهم باستخدام معرف مورد للتمويل تلقائي (الاسم بناءً على مفتاح المورد الخاص بك). راجع الرابط أعلاه لمزيد من الوثائق والتفاصيل.

يدعم Android أيضًا ملفات البيانات الخام. يمكنك تخزين بياناتك في دليل الملفات ضمن Res/Raw/Yourfile.dat

يمكنك إنشاء بياناتك بتنسيق مستند إلى النص الذي تريده ، ثم تقرأه عند بدء تشغيل النشاط باستخدام واجهات برمجة تطبيقات الوصول إلى الموارد.

نصائح أخرى

أعتقد أن هذا هو الحل الأفضل وأنا أستخدم هذا الحديد بالفعل لتخزين عمليات البيانات الثابتة في كل مشروع.

لذلك ... يمكنك القيام بشيء واحد ، وصنع ملف XML واحد وهو "temp.xml" .. وتخزين البيانات في temp.xml على النحو التالي:

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

ثم استخدم XML Pullparser تقنية لتحليل البيانات. يمكنك الحصول على عينات ترميز من تقنية السحب مثال , ، راجع هذا المثال للحصول على فكرة أفضل.

يتمتع!!

لقد استخدمت بسيطة في تحليل XML في الماضي. أعتقد أنه يحتوي على أقل قدر من التعليمات البرمجية إذا كنت تعرف ما يمكن توقعه في XML ، وهو ما تفعله في حالتك.

http://simple.sourceforge.net/

بحسب ال مستند, /xml هو الطريق للذهاب.

توفير الموارد

xml/ ملفات XML التعسفية التي يمكن قراءتها في وقت التشغيل عن طريق الاتصال

Resources.getXML().

يجب حفظ ملفات تكوين XML المختلفة هنا ، مثل التكوين القابل للبحث.

وثائق ل getXML()

لقد قدمت أيضًا مثالًا يعمل:

  • هيكل 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>
    
  • فئة Java لعقد البيانات المتوسطة:

    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();
        }
    
    }
    
  • المحلل نفسه:

    /**
     * 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;
        }
    
    }
    
  • وأخيرا ، استدعاء المحلل:

    //  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();
    }
    
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top