人気ブログランキング | 話題のタグを見る

書評、アプリ開発、他
by Plateaua
カテゴリ
全体
WikiLeaks
Android
iOS
mac
その他
未分類
最新の記事
sqlite3でテーブル内の..
at 2012-04-23 21:12
解析メモ
at 2012-01-12 14:28
[WikiLeaks][20..
at 2011-10-14 20:25
読売新聞のWikiLeaks..
at 2011-10-02 09:30
[WikiLeaks][20..
at 2011-09-29 23:18
以前の記事
2012年 04月
2012年 01月
2011年 10月
2011年 09月
2011年 06月
最新のトラックバック
検索
タグ
その他のジャンル
Twitter
外部リンク
ファン
記事ランキング
ブログジャンル
画像一覧

既存のsqliteファイルをAndroidに組み込む

大量の名簿が入ったSQLiteファイルをAndroidに入れて使おうと思っていたのですが、
色々躓いてきつかったので記そうと思います。

<androidでsqliteを扱う上での注意点>
①assetsフォルダとresフォルダの違い
②assetsフォルダからandroid内作業領域へのコピーは、通常のファイルコピーではなくInputstream→Outputstreamで行う。
③assetsフォルダからコピーできるファイルのサイズの上限は1M
④Zip解凍
http://android.migimaki.com/302/file/zipfile-%E3%81%A8-zipentry-%EF%BD%9Eandroid%E3%81%A7zip%E3%82%92%E8%A7%A3%E5%87%8D%E3%81%99%E3%82%8B

→①assetsフォルダとresフォルダの違い
assets:コピー後、androidからデータの変更が可能
res:データの変更不可
例えば、updateやinsetを行うdbファイルの場合はassetsへ、画像ファイルはresへという感じです。

→②assetsフォルダからandroid内作業領域へのコピー
assetsフォルダ内から作業フォルダ(私の場合は/data/data/パッケージ名/databases)へのコピーは通常のio.Fileでは行えません。以下のようにInputstream-Outputstream方式で行う必要があります。

try {
InputStream assetsFile = context.getAssets().open(F_NAME);//sqliteの場合

File f = new File(DEST_PATH + F_NAME);
File parent = f.getParentFile();
if (parent != null && parent.canWrite()) { parent.mkdirs(); }
FileOutputStream destFile = new FileOutputStream(f);

byte[] buffer = new byte[1024];
int length;
while ((length = assetsFile.read(buffer)) > 0) {
destFile.write(buffer, 0, length);
}
destFile.flush();
destFile.close();
assetsFile.close();

} catch (Exception e) {
}

→③assetsフォルダからコピーできるファイルのサイズの上限は1M
これには本当に泣かされました!
以下のサイトのやりとりにそのようなことが書いてあり、

http://stackoverflow.com/questions/1273300/ioexception-while-reading-from-inputstream

試しにファイルを1.2M→50kbに削ってみてやったところ、コピーもdbからのデータ取得も出来たので、おそらく正しいと思います。

→④Zip解凍
sqliteの場合はvacuumという最適化コマンドがあるのですが、私の場合はそれをやってもdbのサイズが1M以下にならなかったので、
1:assets内にzipで1M以下に圧縮して保存
2:assets→作業フォルダにコピー
3:作業フォルダ内でzipを解凍
という手順で行ったところ上手く行きました。
Javaでのzipの解凍方法は色々とあるのですが、以下のサイトに記されているコードが非常に簡潔で分かりやすかったのでお勧めです。感謝!
http://android.migimaki.com/302/file/zipfile-%E3%81%A8-zipentry-%EF%BD%9Eandroid%E3%81%A7zip%E3%82%92%E8%A7%A3%E5%87%8D%E3%81%99%E3%82%8B
by Plateaua | 2011-09-27 18:48 | Android