
AndroidでXMLの保存/読み込み/追加書き込みサンプル#tryXml00


ローカルファイルにXML形式でデータを保存する。
読み込んだデータにそのまま追加書き込みみたいなことはできないみたいなので、読み込んだデータに新しく追加したデータを加えてあたらしくXMLファイルに書き出している。
やっぱしSQLite使った方が楽だし使い勝手もいいんだろうか…。
●検索した事
SharedPreferences
android ローカルファイル 削除
java 今の時間 文字列
XmlPullParser next
●開発環境
Eclipse IDE バージョン: 3.7 Indigo Service Release 2
ターゲットプラットフォーム: 2.1
API レベル: 7
package junkcode.sample.tryxml00; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.sql.Date; import java.text.SimpleDateFormat; import java.util.ArrayList; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlSerializer; import android.net.NetworkInfo.DetailedState; import android.os.Bundle; import android.app.Activity; import android.util.Xml; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.EditText; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { // ファイル名はパスなすで指定する。パスはOSが勝手にアプリごとに勝手に決めてくるので指定することはできない。 private static final String FILE_NAME = "trylocalfile00.txt"; private ArrayList<XmlItem> mItemList = new ArrayList<XmlItem>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 保存されたデータの最初の読み込み this.readXml(); this.printXmlData(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } // //////////////////////////////////////////////////////////// // 書き込みが押されたときに呼ばれる public void onClick_buttonWrite(View view) { // 入力されたモノを取り出す EditText editText = (EditText)this.findViewById(R.id.editText_input); String text = editText.getText().toString().trim(); // 何か値が入ってるときは書き込む if (0 < text.length()) { // テキストを追加する XmlItem item = new XmlItem(); item.no = this.mItemList.size(); item.text = text; this.mItemList.add(item); // XMLファイルに書き出す this.writeXml(); // 内容を再読込する this.readXml(); this.printXmlData(); } } // //////////////////////////////////////////////////////////// // ファイルに書き込む public void writeXml() { try { // ファイル出力ストリームを作る BufferedWriter bufferWriter = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(FILE_NAME, false))); // ストリームを作って保存する // 下のやり方だとパスに"/"が入ってる時にエラー吐いて落ちるから↑のようにストリームを // 作ってやるほうが落ちなくていい。 //OutputStream out = this.openFileOutput(FILE_NAME, MODE_PRIVATE); //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); XmlSerializer xmlse = Xml.newSerializer(); xmlse.setOutput(bufferWriter); OutputStream out = this.openFileOutput(FILE_NAME, MODE_PRIVATE); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); XmlSerializer xmlse = Xml.newSerializer(); xmlse.setOutput(writer); // ドキュメントのスタート xmlse.startDocument(null, Boolean.TRUE); xmlse.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true); // ここらへんで好きなモノ入力する xmlse.startTag(null, "rootNode"); // バッファにためてあるモノを書き込む for (int i = 0; i < this.mItemList.size(); i++) { XmlItem curr = this.mItemList.get(i); // Itemノードを書き出す xmlse.startTag(null, "item"); xmlse.attribute(null, "no", curr.no + ""); xmlse.text(curr.text); xmlse.endTag(null, "item"); } xmlse.endTag(null, "rootNode"); // タグの終了と書き出し xmlse.endDocument(); xmlse.flush(); out.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // //////////////////////////////////////////////////////////// // EditTextにXMLのデータを表示する public void printXmlData() { // 読み込まれた内容で、EditTextを更新する EditText editTextLocalfile = (EditText)this.findViewById(R.id.editText_localfile); // ファイル内の内容を表示する editTextLocalfile.setText(""); XmlItem item; // バッファにためてあるモノを書き込む for (int i = 0; i < this.mItemList.size(); i++) { item = this.mItemList.get(i); editTextLocalfile.append("no:" + item.no + " text: " + item.text + "\n"); } } // //////////////////////////////////////////////////////////// // ファイルから読み込む public void readXml() { mItemList.clear(); try { InputStream is = this.openFileInput(FILE_NAME); BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); /* // 内容を確認するときここを使う StringBuffer buf = new StringBuffer(); String str; while ((str = reader.readLine()) != null) { buf.append(str); buf.append("\n"); } String s = buf.toString(); */ // XMLの読み込みの開始 XmlPullParser xmlpl = Xml.newPullParser(); xmlpl.setInput(reader); String name = ""; // ドキュメントの最後まで順番に int eventType = xmlpl.getEventType(); while (eventType != XmlPullParser.END_DOCUMENT) { eventType = xmlpl.getEventType(); name = xmlpl.getName(); // タグが開いたり閉じたりのイベントごとに処理を分ける switch (eventType) { // XMLドキュメントの開始 case XmlPullParser.START_DOCUMENT: break; // 何かタグが開かれた case XmlPullParser.START_TAG: // itemノードの始まり if (name.equals("item")) { // 読み込む XmlItem newItem = new XmlItem(); newItem.no = Integer.parseInt(xmlpl.getAttributeValue(null, "no")); newItem.text = xmlpl.nextText(); this.mItemList.add(newItem); } break; // 何かタグが閉じられた case XmlPullParser.END_TAG: break; // タグに挟まれたテキスト case XmlPullParser.TEXT: break; // ドキュメントが終了した case XmlPullParser.END_DOCUMENT: break; } // 次のイベントタイプへ // コレを呼び出すと1行下へ下がっていくイメージ xmlpl.next(); } } catch (IOException e) { e.printStackTrace(); // ↓setInput使うのにコレがいるみたい。 } catch (XmlPullParserException e) { e.printStackTrace(); } } } // //////////////////////////////////////////////////////////// // XMLに書き込まれたモノ class XmlItem { public int no; public String text; }
Androidでローカルファイルにデータを保存するサンプル#tryLocalFile00 AndroidでSQLiteのデータベースで読み書きサンプル#trySqLite00