プレリファレンスを置き換えてみるテスト

 セーブデータを扱うには、SharedPreferences がお手軽でお気軽。
 だけど、格納場所がdataディレクトリと、固定なのが難点。
 というのも。
 いま作成中のアプリでは、dataディレクトリに作らないから。

 作成中のアプリは、ノベル・リーダー。
 複数の作品データを切り替えることになる。
 そのため、各作品ごとに、セーブデータが必要になり、その場所は作品データのある場所に置こうと考えている。

	1. 作品ごとにデータを作る。
	2. 場所は作品データと同じ。( not dataディレクトリ )

 なので、SharedPreferences の仕様は、ちと困るのである。

置き換えてみよう

 格納場所が固定なら、置き換えてしまえばいいんじゃない?
 しかし、そんなことが可能なのだろうか…?

 ということで、このテストをやってみた。
 単純にこういう実験である。

	1. pref.xml を記録
	2. pref.xml をSDへコピー
	3. pref.xml のデータ変更
	4. SDからpref.xml をコピー
	5. pref.xml を読み込む
 5.で元データの内容が読み込めれば、置き換え成功!

 さて、その結果はというと…失敗である。
 読み込んだ内容は、3で書き換えたものであった。
 なにが原因だろう?

仮説 a. 読み込みmethod に不具合がある。
 これはない。
 まず、1の直後に記録内容のチェックに使用し、正常動作している。
 それと単純に失敗している場合、デフォルト値が返ってくるハズなのだが、それとは異なり、3で記録した値である。

仮説 b. ファイルのコピーに失敗している。
 まぁ、コレであろう。
 そう思って、ターミナルから/data/data へ潜ってみる。
 pref.xml は存在し、more で中身を表示したところ、それは1の時の内容だった。
 はて?
 これはどういうことだろう?
 読み込みmethod に原因はなく、ファイルもちゃんと置き換わってる。
 なのに、値は元に戻らない…。
 摩訶不思議である。
 Android、おまえはドコから、ナニを読んでいるのだ?

消してみよう

 pref.xml を読んでいないことはまず確実である。
 では、その値はドコから?

 そこで4の時点で、pref.xml を消してみることにした。
 読み込めないので、デフォルト値が返ってくるハズだ。
 しかし、結果は変わらず、3の時の内容だ。
 まったくもって面妖ナリ。
 ファイルがないのに、その値をひっぱってきていることになる。
 まるで、
「あなたの後ろに幽霊がいますよ?
 私には見えるんです…ククク…」

 なんていわれた気分。
 う~む…。
 ファイルの消し方がマズイのだろうか?

 ならばと、Editerから値をクリアすることにしてみた。
 Editerとはオブジェクトのひとつで、値を記録するときに使用する。
 先程はファイルごとを削除する方法。
 今回は内容を消してしまう方法。
 さて、結果はというと…成功である。
 いや、読み込みには失敗、値はデフォルト値を返してきた。
 つまり想定した動作だ。

 では、今度は書き込まず、いきなり読んでみよう。
 つまり再起動直後にはどうなるか?
 結果は再起動前に、コピーした内容が正常に読み込めた。
 なるほど。
 なんとなくわかりかけてきた…。

ということは、どういうことなのだろう?

 ここから先は確かめるつもりもないので、推論の域である。

推論 a. Androidが整合性をチェックしている。
「メモリー上のなにかとファイルが異なる場合、メモリー上のデータを信頼する」
 セキュリティからするとありそうな話しではある。
 しかし大げさなので、ちと眉唾な気も。

推論 b. なんらかのlockがかかっている。
 ファイルは削除や置き換えが可能なので、メモリー上のlockだろう。
 手続き上のミスか、またはキャッシュの類かもしれない。
 aよりはありえそうな話しだね。

 ともかくも。
 確実な結論はただひとつ。
 SharedPreferences を使う計画は見直し。
 手間をかけて読み込むしかなさそう…くすん。

by the way…

 ついでに、色々と見て回っての発見を書いておこう。

 SharedPreferences は/data/data/%Package Name%/shared_prefs/ に格納される。
 でも、ファイル・マネージャーの類で見ても、/data/data はないのである…。
 そんじゃと、ターミナルから入ってsuしてみたら…
 あった!!
 なるほど。 /data/data のオーナーはsystemで、ユーザーには不可視になってる。
 で、/shared_prefs のオーナーは、app_29。
 おそらく、作ったアプリなんだろうね。
 中のxmlも、同じくapp_29 だった。
 ちなみに、/shared_prefs と同列に /lib なんてのがある。
 オーナーは system。中身はカラ。
 他のアプリと共有するようなclassが入るんだろうかね。

Comments are closed.