[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に日付を付けて保存している