17

我是Android新手,我一直在玩這個遊戲。我試圖創建一個具有小型數據庫的程序,就像收集不變數據一樣。在C#中,我目前最好的語言是,我使用一個自定義類的List並將其序列化爲一個xml文件,然後在運行時將其讀入我的應用程序。我在Android中找到了/ xml資源文件夾,但我不確定我會如何去做我想象中的事情。這樣做最好的方法是什麼?在Android中存儲靜態數據 - 自定義資源?

數據永遠不需要改變。例如:

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

我知道這是奠定了像一個表,但使用一個數據庫並沒有真正意義的我,因爲數據永遠不會改變的,我需要一種方法來存儲它最初填充數據庫總之

所以基本上我正在尋找一種方法來存儲我的應用程序中有點複雜的靜態數據。有任何想法嗎?

編輯:我還看到了/ raw文件夾。所以我可以將東西存儲在/ res/raw或/ res/xml中。但我不知道什麼是最好的方式來存儲/解析數據...

回答

13

最好的方法是使用Android Resource Heirarchy

在res/values /目錄中,可以爲幾種基本數據類型存儲任意數量的鍵值對。在您的應用程序中,您將使用自動生成的資源ID(基於資源密鑰的名稱)引用它們。請參閱上面的鏈接瞭解更多文檔和詳細信息。

Android還支持原始數據文件。您可以將數據存儲在res/raw/yourfile.dat下的文件目錄中

您可以使用任何基於文本的格式創建數據,然後在使用資源訪問API的活動啓動時讀取它。

+0

那會是好還是壞比XML格式存儲,並在閱讀呢?如果我確實使用了xml格式,我將如何閱讀它? – NickAldwin 2010-07-07 16:09:59

+1

@NickAldwin更好的是,你可以以任何你想要的格式存儲,更糟糕的是你沒有內置API來解析數據。您也可以使用更好的資源層次結構。我會用細節編輯我的帖子。 – CodeFusionMobile 2010-07-07 16:25:58

+1

我對res/values /所擔心的是,我不打算只以一對一的方式存儲數據(如上例所示)。那麼在apis中是否內置了用於解析您發佈的鏈接中指定的層次結構以外的xml文件?編輯:TypedArray會爲自定義類(如上面的「Blob」示例)工作嗎?這是否會走? – NickAldwin 2010-07-07 16:33:01

16

我認爲這是最好的解決方案,我已經在使用這個存儲靜態數據在我的每個項目中。

對於... 你可以做一兩件事,讓一個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技術來解析數據。 您可以在Example上使用PullParsing技術的編碼樣本,請參閱此示例以獲取更好的想法。

享受!

+0

是的,這就是我最終選擇的技巧,正如接受答案的評論所討論的那樣。實際上,我發現這裏的說明是XmlPullParser的最佳選擇:http://www.ibm.com/developerworks/opensource/library/x-android/index.html – NickAldwin 2010-07-08 13:52:15

+0

我以爲我已經提高了你......哎呀! – NickAldwin 2010-07-26 20:22:42

+0

豈不等於能夠更新這個XML等字段值時人修改以改變it.For前斑點1 SUMIT夏爾馬 2012-12-26 07:01:30

4

我過去曾使用Simple for xml解析。我認爲如果你知道在xml中會發生什麼,那麼你的代碼量最少,在你的情況下你會這樣做。

http://simple.sourceforge.net/

1

按照doc/xml是要走的路。可以在運行時通過調用

Resources.getXML(). 

各種XML配置文件中讀取

Providing Resources

xml/任意XML文件必須保存在這裏,如可搜索的配置。

Documentation for 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(); 
    }