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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です