在Android中存储静态数据 – 自定义资源?

我是Android新手,我一直在玩这个游戏。 我试图创build一个程序,它有一个类似于数据库的非常小的数据库集合。 在C#中,我目前最好的语言,我会使用一个自定义类的列表,并将其序列化到一个XML文件,然后在运行时读入我的应用程序。 我在Android中find了/ xml资源文件夹,但我不知道如何去做我想象中的事情。 什么是最好的方式去做这件事?

数据将永远不需要改变。 例:

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

我知道这是一个表格,但使用数据库对我来说并没有什么意义,因为数据永远不会改变,我需要一种方法来存储它,最初填充数据库。

所以基本上我正在寻找一种方法来存储在我的应用程序中有点复杂的静态数据。 有任何想法吗?

编辑:我也看到了/原始文件夹。 所以我可以把东西存放在/ res / raw或/ res / xml中。 但我不知道什么是最好的方式来存储/parsing数据…

Related of "在Android中存储静态数据 – 自定义资源?"

最好的方法是使用Android资源Heirarchy 。

在res / values /目录中,可以为几种基本数据types存储任意数量的键值对。 在您的应用程序中,您将使用自动生成的资源ID(基于您的资源密钥的名称)引用它们。 请参阅上面的链接了解更多文档和详细信息。

Android也支持原始数据文件。 您可以将数据存储在res / raw / yourfile.dat下的文件目录中

您可以使用任何基于文本的格式创build数据,然后使用资源访问apis在活动启动时读取它。

我认为这是最好的解决scheme,我已经使用这个存储静态数据在我的每个项目。

对于这个…你可以做一件事,做一个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技术来parsing数据。 你可以在例子中使用PullParsing技术的编码样例,参考这个例子来获得更好的想法。

请享用!!

过去我使用Simple for xmlparsing。 我认为如果你知道在XML中会发生什么,那么你的代码量最less。

http://simple.sourceforge.net/

根据文档 , /xml是要走的路。

提供资源

xml/任意XML文件,可以通过调用在运行时读取

 Resources.getXML(). 

必须在这里保存各种XMLconfiguration文件,例如可search的configuration。

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 USA?</question> <input_type>Radio</input_type> <answer correct="false">New York City</answer> <answer correct="true">Washington DC</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类保存parsing的数据:

     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(); } } 
  • parsing器本身:

     /** * 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; } } 
  • 最后,调用parsing器:

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