[Java] String.split()を使って、区切り文字で分割する

CSVファイル(","区切り)などのデータを分割する場合、Stringクラスの
splitメソッドを使うことで切り分けることができる。

【サンプル】
String str = "AAA,BBB,CCC";
String s[] = str.split(",");


配列でそれぞれ、以下のように格納される。
s[0] : "AAA"
s[1] : "BBB"
s[2] : "CCC"


簡単に切り分けることができた。


[Android] assetsフォルダに格納したテキストファイルを読み込む

「assetsフォルダのファイルパスは??」と思い、調べてみたら
"file:///android_asset/"
というのが見当たったが、このパスを元にファイルを開こうとしても
上手くいかなかった。
#このパスはWebViewでLoadするときなどに使用することが可能なのかな??


ということで、テキストファイルを読み込むときは AssetManager.open() を
使用するようにする。


AssetManager assetManager = getResources().getAssets();
InputStream is = null;
BufferedReader br = null;

try {
is = assetManager.open("xxx.txt");
br = new BufferedReader(new InputStreamReader(is));

String str;
while((str = br.readLine()) != null){
// 1行ずつ読み込む
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
br.close();
}
}


open()メソッドだと、InputStreamで返されるのですが、
上記でなんとか読み込めた。



[Android][DB] SQLite Database Browser

Android でアプリを作っていると、
データベースの中をのぞきたいことがしばしばとある。

adbコマンド叩いて、DBにアクセスしてSQLを実行すれば、
テーブルの中身など確認することはできるが、
ちょっと面倒だし、コンソール上だと見にくい。。。

そんなときに、GUIツールとして、テーブルの中身を
見やすくしてくれるツール
SQLite Database Browser
がある。

ダウンロードは以下
SQLite Database Browser

ダウンロードしたzipファイル(sqlitebrowser_200_b1_win.zip)を
解凍するだけで使用することができる。


ちなみに通常Androidのアプリは以下の
内部ディレクトリに拡張子dbのデータベース
ファイルが格納される。
/data/data/パッケージ名/databases/xxx.db

エミュレータなら、そのままアクセスできるが、
実機だとROOT権限がないためアクセスすることができない。
#無理やりROOTとれば可能だが。。。

このファイルをPCに落として、"SQLite Database Browser"
で読み込むと、以下のように簡単にテーブルを確認できる。



sqldbbrowser.jpg



また、SQLの構文を入力してSELECTやINSERTなどの実行も
簡単にできる。

sqldbbrowser2.jpg

[SQLite] データ型

AndroidのDBなどで使用されているSQLite3。
利用可能な型は少ない(単純?)であった。

・NULL
  ⇒ NULL値、データ無し
・INTEGER
  ⇒ 符号付き整数、1~8 バイト
・REAL
  ⇒ 浮動小数点数、8バイトのIEEE
・TEXT
  ⇒ データベースのエンコーディングでエンコードした文字列
    (UTF-8、UTF-16BE、UTF-16-LE)
・BLOB
  ⇒ 入力された文字列をそのまま
    バイナリデータそのまま
    エンコードされない文字列



ちなみに、通常のデータベースで使用されている CHAR や VARCHAR は TEXT として扱われるように、型が置き換えられる。


[アプリ作成][Android] 内部メモリの操作アプリ

[Android] メモリの不足と不足回復を検知」で端末の内部メモリが少なくなった場合に
通知されるBroadcastについて実装してみましたが、
どうやって動作を確認しようかなと考えていて、エミュレータなら、
"/data/data"あたりに大きなサイズのファイルを配置すればメモリ不足にすることは
用意ですが、実機だとroot権限無いとできないから、何かいい方法を検討してみた。

結論として、内部メモリを無駄に使ったり、キープした部分を開放したりできるような
アプリを作ってしまおうと、作ってみました。


作ったのは以下のもの。

2012-07-18.png


操作したいサイズを入力してボタンを押下するだけ。
一応、内部メモリの使用量やこのアプリで取得しているメモリサイズを
可視化して状態がわかるようにしています。


[Java] プリミティブ型

プリミティブ型とは、Javaにおいては、値を扱う基本的な方で、
値以外を持たない。


・byte
・short
・int
・long
・float
・double
・char
・boolean



これらの方は、メソッドを持たないのです。

ちなみに、上記以外の型はクラス型といって、Stringなど
メソッドを含んだ型となる。


[SQL] 内部結合と外部結合(JOIN句)

内部結合は両方のテーブルに共通するデータを抽出して、
どちらか片方にしかないデータ(行)は削除される。
それに対して外部結合は右側のテーブル(RIGHT JOIN)または、
左側のテーブル(LEFT JOIN)のどちらかのデータをすべて表示して、
データがない片方のテーブルのカラムにはNULLを入れる。

20120714_1.jpg


■内部結合(INNER JOIN)

SELECT * FROM TableA INNER JOIN TableB
  ON TableA.Type = TableB.Type;


20120714_2.jpg

※下記SELECT文と同じ結果が得られる

SELECT * FROM TableA, TableB WHERE TableA.Type = TableB.Type;



■外部結合(LEFT JOIN、 RIGHT JOIN)

SELECT * FROM TableB LEFT JOIN TableB.Type = TableA.Type;
もしくは、
SELECT * FROM TableA RIGHT JOIN TableA.Type = TableB.Type;

20120714_3.jpg

20120714_4.jpg


■OUTERについて

外部結合については、LEFT OUTER JOIN、RIGHT OUTER JOINというように
OUTERを付けることができるが、省略してLEFT JOIN、RIGHT JOINとすることもできる。


■その他の結合
【完全結合(FULL OUTER JOIN)】
LEFT JOIN と RIGHT JOIN を合わせた感じの外部結合で
左だけに存在する、または右だけに存在する行の両方を取得できる。

SELECT * FROM TableA FULL OUTER JOIN TableB
  ON TableA.Type = TableB.Type;


【交差結合(CROSS JOIN)】
テーブルAとテーブルBを交差結合すると、テーブルAの全行に
テーブルBの全行を付けた結果が取得できる。

SELECT * FROM TableA CROSS JOIN TableB;
※交差結合には結合条件が無い

以下でも同様の結果を得られる。
SELECT * FROM TableA, TableB;


[SQL] 集合演算子 UNION

UNIONを使用することで複数のSELECT文をつなげて
和集合を取得することができる。

20120713_1.jpg

※ 重複する行は1行にまとめられる
 ((上記の場合、IDの101、102 が該当する)

※ 各SELECT文の抽出する列は数と型が一致していないとエラーになる。

  SELECT ID, Name FROM TableA UNION SELECT ID, Name, Code FROM TableB;

  ⇒抽出する列の数が一致していないのでNG
  ⇒NULLを使って数を一致させればOK
   SELECT ID, Name, NULL FROM TableA UNION SELECT ID, Name, Code FROM TableB;

重複する行を1行にまとめさせない
 「UNION」は重複した行を1行にまとめて出力させるが、すべての行を出力したい場合は
 「UNION ALL」を使用する。

20120713_2.jpg

[Java] 任意のディレクトリのファイル(フォルダ)一覧を表示

ファイル一覧を表示するメモ。

/**
* 指定したディレクトリのファイル(フォルダ)一覧を表示
* @param path 指定ディレクトリ
*/
public static void showDirList(String path) {
File dir = new File(path);
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
System.out.println(file.getName());
}
}

ファイル名だけ、ディレクトリ(フォルダ)名だけを表示したい場合、
以下のような if 分を追加してあげればよい。

■ファイル判定
if (file.isFile()) {
  // ファイルの場合の処理
}

■ディレクトリ(フォルダ)判定
if (file.isDirectory()) {
  // ディレクトリの場合の処理
}


[Android] メモリの不足と不足回復を検知

内部ストレージの空き容量が少なくなった場合と、十分な空き容量に回復した場合の
状態をBroadcastを使用して検知してみた。

実装は以下の2つ。

①BroadcastReceiver を継承したクラスを定義
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();

if (action.equals(Intent.ACTION_DEVICE_STORAGE_LOW)) {
// 空き容量が少なくなった場合の処理
} else if (action.equals(Intent.ACTION_DEVICE_STORAGE_OK)) {
// 十分な空き容量に回復した場合の処理
}
}


②AndoroidManifestファイルに以下を追加









[Android] 画面の向きを固定する

横画面はレイアウトが崩れるので、縦画面の固定にしたいなど、
アプリ都合で画面の自動回転を抑止したいシーンはたまにあるかも。

アプリ側で抑止する場合、以下の指定をすればできました。

■コード中に記載する場合

Activityクラスを継承したクラスの onCreate() に以下の1行を追加。

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);



■Manifestファイルに記載する場合
activity 要素に以下の属性を追加。

android:screenOrientation="portrait"


[Android] 外部メモリがマウントされているかチェックする処理


import android.os.Environment;

public class ExternalStorageCheck {

// 外部メモリのマウント状態
public static boolean isMountExternalStorage() {
boolean result;
String state = Environment.getExternalStorageState();
result = state.equals(Environment.MEDIA_MOUNTED);
return result;
}

}
"Environment.getExternalStorageState()"で外部メモリの状態を取得して、
取得した文字列が"Environment.MEDIA_MOUNTED"の場合、マウントされている
ことになります。


[Android] バックキー押下時の onBackPressed()

Backキーが押下されたときに何か処理を行いたい。
そんな時、Activity クラスの onBackPressed() をオーバーライドして
処理を追加してあげれば実現できるようだ。

onBackPressed ()

今まで、dispatchKeyEvent() で KeyEvent.KEYCODE_BACK を判断して
処理しないといけないと思ってたが・・・

ただ、 onBackPressed() は"API Level 5"(Android 2.0)からのサポートだから
Android1.6以前を考慮する場合は注意が必要。


ちなみに、実装は以下。
==============================================
public void onBackPressed() {
if (!mFragments.popBackStackImmediate()) {
finish();
}
}
==============================================

ただ、finish() して Activity を閉じるだけだね。



[Android] InputFilterとTextWatcherのタイミング

それぞれ、EditTextに設定して、ログを埋め込んで
タイミングを確認してみた。

=========================
06-30 16:26:32.969: D/sample(279): SampleInputFilter::filter
06-30 16:26:32.969: D/sample(279): TextWatcher::beforeTextChanged
06-30 16:26:32.969: D/sample(279): TextWatcher::onTextChanged
06-30 16:26:32.969: D/sample(279): TextWatcher::afterTextChanged
=========================

InputFilterの方が先に実行されるようだ。
EditTextの中身が書き換えられる度に1回呼び出される。

実行される回数的には同じのようだ。
プロフィール

hiiro

Author:hiiro

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Counter