前回のページからの続きです。
見てない方は下記をご参照ください^^
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