【Androidアプリ作成】SQLiteを使うには?(後編)

前回のページからの続きです。
見てない方は下記をご参照ください^^
http://blogs.yahoo.co.jp/hiro5_188/21863869.html

前回に引き続き、SQLiteのDBファイルからの読み込みです。
大体以下のようになります。

[1] アプリ起動時

(1-1) DBが既にあれば何もしない

(1-2) DBがなければ空のDBを作る

(1-3) assetsからコンテキストデフォルトのDBパスへコピー

(1-4) DB作成に失敗したらDB削除

[2] SQLite使用時

(2-1) DBを開く

(2-2) 自由に操作

(2-3) DBを閉じる

上記の処理を実際にプログラムすると
以下のような感じになります。
長いですが、全部書きます。

[1] アプリ起動時

public static boolean onCreate( Context context, String dbname )

{

if ( isExistsDataBase( context, dbname ) )

// (1-1)

{

// 既にDBが存在するなら何もしない

return true;

}

try

{

createEmptyDataBase( context, dbname );

// (1-2)

copyDataBaseFromAsset( context, dbname );

// (1-3)

return true;

}

catch ( IOException e )

{

try

{

deleteDataBase( context, dbname );

// (1-4)

}

catch ( Exception ignore ) {}

return false;

}

}

(1-1) DBが既にあれば何もしない

private static boolean isExistsDataBase( Context context, String dbname )

{

SQLiteDatabase con = null;

try

{

con = openDataBase( context, dbname );

// (2-1)

return true;

}

catch ( IOException ignore )

{

// 例外は飲み込む

return false;

}

finally

{

if ( con != null )

{

try { con.close(); } catch ( Exception ignore ) {}

con = null;

}

}

}

(1-2) DBがなければ空のDBを作る

private static void createEmptyDataBase( Context context, String dbname ) throws IOException

{

SQLiteOpenHelper openHelper = new SQLiteOpenHelper( context, dbname, null, 1 )

{

@Override

public void onUpgrade( SQLiteDatabase sqlitedatabase, int i, int j ) {}

@Override

public void onCreate( SQLiteDatabase sqlitedatabase ) {}

};

SQLiteDatabase db = null;

try

{

// このメソッドを呼ぶことで、空のデータベースが

// アプリのデフォルトシステムパスに作られる

db = openHelper.getReadableDatabase();

}

finally

{

if ( db != null )

{

try { db.close(); } catch ( Exception ignore ) {}

db = null;

}

}

}

(1-3) assetsからコンテキストデフォルトのDBパスへコピー

private static void copyDataBaseFromAsset( Context context, String dbname ) throws IOException

{

InputStream in = null;

OutputStream out = null;

try

{

// asset 内のデータベースファイルにアクセス

in = context.getAssets().open( dbname + ".sqlite" );

// デフォルトのデータベースパスに作成した空のDB

String dbpath = context.getDatabasePath( dbname ).getPath();

out = new FileOutputStream( dbpath );

// コピー

byte[] buffer = new byte[ 4 * 1024 ];

int size;

while ( ( size = in.read( buffer ) ) >= 0 )

{

out.write( buffer, 0, size );

}

out.flush();

}

finally

{

if ( out != null )

{

try { out.close(); } catch ( Exception ignore ) {}

out = null;

}

if ( in != null )

{

try { in.close(); } catch ( Exception ignore ) {}

in = null;

}

}

}

(1-4) DB作成に失敗したらDB削除

private static void deleteDataBase( Context context, String dbname )

{

String dbpath = context.getDatabasePath( dbname ).getPath();

File db = new File( dbpath );

if ( db.exists() )

{

db.delete();

}

}

[2] SQLite使用時
(2-1) DBを開く

public static SQLiteDatabase openDataBase( Context context, String dbname ) throws IOException

{

// Open the database

SQLiteDatabase db;

try

{

String dbpath = context.getDatabasePath( dbname ).getPath();

db = SQLiteDatabase.openDatabase( dbpath, null, SQLiteDatabase.OPEN_READONLY );

}

catch ( SQLiteException e )

{

// あえて検査例外で投げ直す

throw new IOException( e.toString() );

}

return db;

}

(2-2) 自由に操作

Cursor rs = con.rawQuery( "select ITEM_ID, ITEM_NAME from ITEM_INFO", null );

rs.moveToFirst();

int len = rs.getCount();

ArrayList<ItemDao> list = new ArrayList<ItemDao>( len );

while ( 0 <= (–len) )

{

int offset = 0;

int id = rs.getInt( offset++ );

String name = rs.getString( offset++ );

list.add( new ItemDao( id, name ) );

rs.moveToNext();

}

return list;

(2-3) DBを閉じる

db.close();

結構手軽に扱えるので、お試しください^^

2011.12.23
NECO

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA

*