[android] SQLiteを実装(DB Browser for SQLiteでDBを作成)
目次
SQLiteを実装(DB Browser for SQLiteでDBを作成)
AndroidにSQLiteを実装する
DBはDB Browser for SQLiteで作成したものを使用する
DB Browser for SQLite
DB Browser for SQLiteを下記URLからダウンロード・インストール
http://sqlitebrowser.org/
DB Browser for SQLiteでDBを作成
下記サイトが参考になるので、参考にしながらDBを作成
http://www.dbonline.jp/sqlite-db-browser/
DBファイルをAssetフォルダに移動
作成したDBファイル「例:MyDatabase.db」をAndroid ProjectのAssetフォルダに移動。
もしAssetフォルダがなければ、Android-Studio上でフォルダを作成する
Main→Resと同じ場所に作成される
DBAdapterクラスを作成
DBデータを扱いコードをクラスにまとめる
Assetフォルダにおいただけではアプリ上ではアクセスできないため、アプリで使用できるようにアプリ起動時などにデバイスにコピーするコードも実装する
public class DBAdapter{
static final String KEY_ID = "_id";
static final String KEY_DAY = "day";
static final String KEY_DAYTIME = "dayTime";
static final String KEY_LAT = "lat";
static final String KEY_LNG = "lng";
static final String TAG = "DBAdapter";
static final String DATABASE_NAME = "MyDatabase.db";
static final String DATABASE_TABLE ="history";
static final int DATABASE_VERSION = 1;
private final Context context;
DatabaseHelper DBHelper;
SQLiteDatabase db;
Calendar currentDate;
SimpleDateFormat dayFormatter;
SimpleDateFormat dayTimeFormatter;
File mDatabasePath;
String[] cols = {KEY_ID,KEY_DAY,KEY_DAYTIME, KEY_LAT, KEY_LNG}; //検索アイテム
public DBAdapter(Context ctx){
this.context = ctx;
this.mDatabasePath = context.getDatabasePath(DATABASE_NAME);
DBHelper = new DatabaseHelper(context);
currentDate = Calendar.getInstance();
dayFormatter = new SimpleDateFormat("yyyy-MM-dd");
dayTimeFormatter = new SimpleDateFormat("HH:mm:ss");
}
private class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
try {
if (! databaseExists()) {
copyDb();
}
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onCreate(SQLiteDatabase db){
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion,
int newVersion){}
}
//---opens the database---
public DBAdapter open() throws SQLException {
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close(){
DBHelper.close();
}
//---insert a lacation into the database---
public long insertLocation(String lat, String lng){
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_DAY, dayFormatter.format(currentDate.getTime()));
initialValues.put(KEY_DAYTIME, dayTimeFormatter.format(currentDate.getTime()));
initialValues.put(KEY_LAT, lat);
initialValues.put(KEY_LNG, lng);
Log.d(TAG,":"+lat+" : "+lng);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//---retrieves all the locations---
public Cursor getAllLocations(){
return db.query(DATABASE_TABLE, cols, null, null, null, null, null);
}
public Cursor getLatestLocation(){
//queryメソッドでデータを取得
//引数distinctには、trueを指定すると検索結果から重複する行を削除します。
//引数tableには、テーブル名を指定します。
//引数columnsには、検索結果に含める列名を指定します。nullを指定すると全列の値が含まれます。
//引数selectionには、検索条件を指定します。
//引数selectionArgsには、検索条件のパラメータ(?で指定)に置き換わる値を指定します。
//引数groupByには、groupBy句を指定します。
//引数havingには、having句を指定します。
//引数orderByには、orderBy句を指定します。
//引数limitには、検索結果の上限レコードを数を指定します。
String selection = null; //検索条件
String[] selectionArgs = null;
String groupBy = null;
String having = null;
String orderBy = KEY_ID+" DESC";
String limit = "1";
return db.query(DATABASE_TABLE, cols, selection, selectionArgs, groupBy, having, orderBy ,limit);
}
public Cursor getDayLocation(int day){
String date = getDayString(day);
String selection = KEY_DAY+" = ?"; //検索条件
String[] selectionArgs = {date};
String groupBy = null;
String having = null;
String orderBy = KEY_ID;
String limit = null;
return db.query(DATABASE_TABLE, cols, selection, selectionArgs, groupBy, having, orderBy ,limit);
}
public String getDayString(int day){
currentDate.add(Calendar.DATE, day);
String date = dayFormatter.format(currentDate.getTime());
return date;
}
/**
* dbファイルの存在チェック
*/
private boolean databaseExists() {
File dbFile = new File(this.context.getFilesDir().getParent() + "/databases/" + DATABASE_NAME);
return dbFile.exists();
}
/**
* assetのdbファイルをコピーする
*/
private void copyDb() throws IOException {
// コピー先フォルダ
String copyFolder = this.context.getFilesDir().getParent() + "/databases/";
// フォルダがない場合は作成
File checkDirectory = new File(copyFolder);
if (! checkDirectory.exists()) {
checkDirectory.mkdir();
}
// ファイルのインプット、アウトプットのセット
InputStream in = this.context.getAssets().open(DATABASE_NAME);
OutputStream out = new FileOutputStream(copyFolder + DATABASE_NAME);
// ファイルのコピー
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
// インプット、アウトプットのクローズ
in.close();
out.close();
}
}
Activityに実装
DBAdapter db = new DBAdapter(context); db.open(); db.insertLocation(String.valueOf(loc.getLatitude()),String.valueOf(loc.getLongitude())); db.close();
*insertLocationメソッドで位置情報をDBに日付を付けて保存している