SharedPreferencesモドキを作ろう

 XmlSerializer なんかをイジって、xml 関係がだいたい飲み込めた。
 しかし、データ・フォーマットを考えるのはめんどくさい。読み込み部が専用になるのも、なんかアレよね。
 読み込みは遅いが、やっぱ融通の効くSharedPreferences は便利だ。
 しかし、SharedPreferences は外部ファイルを読み込めない…。
 なら作ってしまえ、というワケ。
 どうせint とString しか使う予定もないし。
 そんなに面倒でもないだろう。

package com.migimaki.android;

import android.content.Context;

import java.io.FileInputStream;
import android.util.Xml;
import org.xmlpull.v1.XmlPullParser;

import android.util.Log;


/*
 * Preferences Reader クラス
 * 
 */
public class PrefReader {

	private Context context;
	public String fPath = "/";

//====================
//初期化
//====================
	/**
	 * コンストラクタ
	 */
	public PrefReader( Context c, String fPath ){
		context = c;
		this.fPath = fPath;
		//--
	}


//====================
// read method
//====================

	////////////
	/// Read Int
	public int getInt( String key, int default_i ){

		int result = default_i;
		//--

		try{
			FileInputStream is = new FileInputStream( fPath );
			XmlPullParser xmlPullParser = Xml.newPullParser();
			xmlPullParser.setInput( is, "UTF-8" );

			
			int i = xmlPullParser.getEventType();
			do{
				if( i == XmlPullParser.START_TAG 
						&& xmlPullParser.getName().equals( "int" )
							&& xmlPullParser.getAttributeValue( null, "name" ).equals( key )
					){

						result = Integer.parseInt( xmlPullParser.getAttributeValue( null, "value" ) );
						break;
				}
				i = xmlPullParser.next();
			}while ( i != XmlPullParser.END_DOCUMENT );

			is.close();

		}catch( Exception ex ){
			Log.d( "Err", "PrefReader : getInt" );
		}
		//--
	//	Log.d( "TEST", "PrefReader " +key +":" +result );
		return result;
	}
	///==
	
	////////////
	/// Read String
	public String getString( String key, String default_s ){

		String result = default_s;
		//--

		try{
			FileInputStream is = new FileInputStream( fPath );
			XmlPullParser xmlPullParser = Xml.newPullParser();
			xmlPullParser.setInput( is, "UTF-8" );

			
			int i = xmlPullParser.getEventType();
			do{				
				if( i == XmlPullParser.START_TAG 
						&& xmlPullParser.getName().equals( "string" )
							&& xmlPullParser.getAttributeValue( null, "name" ).equals( key )
					){

						result = xmlPullParser.nextText();
						break;
				}
				i = xmlPullParser.next();
			}while ( i != XmlPullParser.END_DOCUMENT );

			is.close();
			
		}catch( Exception ex ){
			Log.d( "Err", "PrefReader : getString" );
		}
		//--
	//	Log.d( "TEST", "PrefReader " +key +":" +result );
		return result;
	}
	///==
	
}

 できた。int とString だけだけど。(w

 各method でFileInputStream を設定しているのは、そうしないと読み込み位置が保持されてしまうため。

 SharedPreferences には、int とString の他に、boolean, float などなどがある。
 それらはおそらく、int とほぼ変わりがないだろうと思う。
 必要になったら、作るとしよう。

Posted in File, XML. Tags: , . SharedPreferencesモドキを作ろう はコメントを受け付けていません。 »

任意のXMLファイルの作成

 Androidアプリから、任意フォーマットのxmlを作成してみた。
 使用するのは、XmlSerializer

XmlSerializer って?

 XMLの作成には、XmlSerializerを使用しなくても行える。
 しかし、XML規格に沿って作成するには、それなりの知識も必要だし、ヘッダー等を整備するのも面倒くさい。
 XmlSerializer はそこらへんの面倒を引き受けて、XML の編集を行えるものらしい。
 また、書き込みの他に、読み込みmethod も用意されているようだ。

 ここでは書き込みのみXmlSerializer で行い、読み込みはXmlPullParser で行った。

XMLの書き出し

 書き出す内容は、以下の内容とすることにした。

	<xml? …>
	<gdat id="1">
	<Int>
	0
	</Int>
	<key>
	Kanon
	</key>
	</gdat>

 ※.xmlヘッダーは面倒なので略している。

 ソースでは以下のようになる。

//====================
// save method
//====================

	public void save( String fPath ){

		int i = 0;
		String key = "Kanon";
		//--
		
		XmlSerializer serializer = Xml.newSerializer();
		try {
			FileOutputStream os = new FileOutputStream( fPath );
			serializer.setOutput( os, "UTF-8" );
			
			serializer.startDocument("UTF-8", true);	// ヘッダー

			//<gdat id="1">
			serializer.startTag("", "gdat");
			serializer.attribute("", "id", "1" );
			//--

			//
				serializer.startTag("", "Int");	//<Int>
					serializer.text( ""+i );
				serializer.endTag("", "Int");	//</Int>
				
				serializer.startTag("", "key");	//<key>
					serializer.text( key );
				serializer.endTag("", "key");	//</key>
			//--

			serializer.endTag("", "gdat");	//</gdat>
			serializer.endDocument();	// フッター
			
			serializer.flush();	// 出力
			os.close();
		} catch (Exception e) {
		}
	}
	

 XmlSerializer は、それ自身でファイルにする能力はないようだ。
 そのため、FileOutputStream を出力先として指定している。( setOutput )
 また、出力先には、StringWriter 等も指定できる。

 編集自体は単純なので、ソースからわかるかと思う。

 編集が終われば、flush() で出力。
 FileOutputStream の出力先にファイルが作られる。

 なお、出力されたファイルを見てみると、改行コードが一切省かれていた。
 それでも機能するし、データも小さくなるからいいんだけど。(^_^;

XMLの読み込み

 読み込み方は、それぞれの効率性などから、色々とやり方が考えられる。
 サンプルでは、単純な順番読み込みをやってみた。

//====================
// load method
//====================

	public void load( String fPath ){
		
		try{
			FileInputStream is = new FileInputStream( fPath );

			XmlPullParser xmlPullParser = Xml.newPullParser();
			xmlPullParser.setInput( is, "UTF-8" );
			
			String buf_s = "";
			int buf_i = 0;
			
			Log.d( "TEST", "---- load start ----" );

			int i = xmlPullParser.next();
			if( i == XmlPullParser.START_TAG ){

				Log.d( "TEST", "Parser.getName : " +xmlPullParser.getName() );	// gat

				if ( xmlPullParser.getName().equals("gdat") ){
						buf_s = xmlPullParser.getAttributeValue( null, "id" );	// idの値
						buf_i = Integer.parseInt( buf_s );

						Log.d( "TEST", "" +buf_i );
				}
				xmlPullParser.next();

				if ( xmlPullParser.getName().equals("Int") ){	//Int
						buf_s = xmlPullParser.nextText();
						buf_i = Integer.parseInt( buf_s );

						Log.d( "TEST", "" +buf_i );
				}
				xmlPullParser.nextTag();	// -><END_TAG>
				xmlPullParser.nextTag();	// -><START_TAG>
			
				if ( xmlPullParser.getName().equals("key") ){	//key
						buf_s = xmlPullParser.nextText();

						Log.d( "TEST", "" +buf_s );
				}

			}
			Log.d( "TEST", "---- load over ----" );

			is.close();
		}catch( Exception ex ){
			Log.d( "Deb", "load error...(game data)" );
		}
		//--

	}

 非常にお莫迦なサンプルなので、実用的ではないね。(笑

 XmlPullParser は一行ごとに読み込みを行うようだ。
 next…とついているmethod は、「行送りをする」と考えていい。

	next()  … 一行送り。
	nextText()  … タグのtextを読み込み、一行送る。
	nextTag()  … 次の START_TAG か END_TAG まで送る

 getAttributeValue でタグのパラメータの値を取り出せる。
 パラメータ名の他にも、要素位置で読む方法もある。

	getAttributeValue(0)

 getName でタグの名前を取得。
 .equals で、文字列の比較を行える。
 .equals(“gdat”) だとしたら、==”gdat” と読み替えると理解しやすい。


 ここで取り上げた使用方法はほんの一例。
 他にも色々なmethod ややり方があるので、それぞれ調べてみてほしい。

Posted in File, XML. Tags: , , . 任意のXMLファイルの作成 はコメントを受け付けていません。 »