戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
10

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SQLiteで他のデータベースに接続する:attach database

AndroidのデータベースはSQLiteになっています。
そのSQLiteで他のデータベースに接続してテーブルを参照などする方法。

SQLiteコマンドの attach database を使います。

以下、サンプルソース。
データベースもテーブルもすでに作成されているものとしてみてください。
public static boolean copyUserTable(Context context) {

SQLiteDatabase db = null;
try {
// メインデータベースを開く
db = context.openOrCreateDatabase("main.db", MODE_PRIVATE, null);

// サブデータベースのパスを取得する
String subPath = context.getDatabasePath("sub.db").getPath();

// サブデータベースに接続する(※Honeycombを対象にするならステートメントは使わない)
db.execSQL("attach database '" + subPath + "' as sub_db");

// トランザクションを開始する
db.beginTransaction();

// SQLを実行する
db.execSQL("INSERT OR REPLACE INTO T_USER SELECT * FROM sub_db.T_USER");

// コミットする
db.setTransactionSuccessful();

return true;

} catch (Exception e) {
return false;

} finally {
if (db != null) {
// トランザクションを終了する
db.endTransaction();

// データベースを閉じる
db.close();
}
}
}
データベースの接続には SQLiteOpenHelper を使う方がいいのですが、ざっくり説明するために Context から接続。
attach database 以外の所は気にしないでいただけると助かります…。

さて、このサンプルソースコードで注意するところは attach database を行っているところです。
// サブデータベースに接続する(※Honeycombを対象にするならステートメントは使わない)
db.execSQL("attach database '" + subPath + "' as sub_db");
subPath は接続するデータベースファイルのフルパスになります。

このパスを指定するときにステートメントを使っていないところに注目してください。
どうやら HoneyComb (Android 3.*) ではステートメントの処理に不具合があるようで、ステートメントを使用するとアタッチしてくれません

× db.execSQL("attach database ? as sub_db", new String[] { subPath });

参考(英語):stack overflow - Attached databases in Honeycomb

実際にAndroid 3.2 で試したところ、アタッチされませんでした。
(Android 2.3、Android 4.0 ではアタッチされます)

なので、仕方なく文字列結合を使用しています。

HoneyComb はソースコードが公開されていないので中で何をしているかはわかりません…。
今後アップデートされる可能性も低い(無い?)ですし、あったとしても今障害が出ている、また、ユーザーがアップデートするとは限らないのでステートメントを使用している方は文字列結合にすることをお勧めします。
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。