Genta Hirauchi

公開日:2020/07/02
更新日:2020/08/03

【Kotlin】Roomで作成したデータベースに、初期データを投入する方法を解説

  • データベース作成時に、初期データを投入したい
  • CSVファイルを読み込み、大量のデータを投入したい

RoomによるSQLiteデータベースへのアクセス処理を実装する際、データベース作成時に、あらかじめデータを投入しておきたいということがあると思います。

本記事では、初期データの投入方法と、CSVファイルを読み込み、大量の初期データを投入する方法について解説致します。

目次

初期データを投入する方法

初期データの投入方法を解説するにあたり、以下のようなUserエンティティを使用することにします。

初期データの投入は、データベースが作成されたタイミングで行います。

データベースが作成されるタイミングを知るため、17行目のaddCallback()で、RoomDatabase.Callbackを実装しております。

これにより、データベースが作成されたタイミングで、onCreate()が呼ばれるので、その時にデータの投入を行います。

上記のサンプルでは、データ挿入用のSQL文を作成た後、execSQL()でSQL文を実行することで、初期データの投入を行なっております。

CSVファイルを読み込み、大量のデータを取り込む

CSVファイルの作成

続いては、初期データをあらかじめCSVファイルで用意しておき、データベース作成時にCSVファイルを読み込んで初期データを投入する方法を解説致します。

まずは、CSVファイルを作成する方法をについて紹介致します。今回は、Googleのスプレッドシートで作成致します。

スプレッドシートを開きデータを入力していきます。列をテーブルのカラムのように入力していきます。1行1行が1つのデータとなります。

データが入力できましたら、CSVファイルとして出力します。CSVファイルとして出力するには、ファイル -> ダウンロード -> カンマ区切りの値を選択します。

これで以下のようなCSVファイルが出力されると思います。各データは、カンマで区切られております。

最後に、出来上がったCSVファイルを、Assets Folderに格納しておきます。Assets Folderは、src/mainフォルダを右クリックし、New -> Folder -> Assets Folderから作成できます。Assets Folderの作成場所が指定できますので、main直下に作成されるようにしておきましょう。

CSVファイルの読み込み

では、作成したCSVファイルを読み込んで、初期データを投入する処理を実装してみましょう。先ほどの実装に、CSVファイルを読み込む処理を追加致します。

21行目の、context.resources.assetsで、AssetManagerを取得しております。

22行目では、データ挿入のSQL文の冒頭部分を格納しておきます。

24行目から26行目では、CSVファイルからBufferedReaderの生成を行なっております。

そして、27行目のreadLine()で、ファイルの読み込みを行なっております。readLine()は、CSVファイルの1行分の情報を読み込む関数です。

29行目から33行目は、while文となっております。readLine()でデータが読み込めなくなるまで繰り返されます。while文の中では、カンマでデータを区切り、Userエンティティのカラムにマッチするよう、SQL文として追加しております。

CSVファイルのデータを全て読み込むと、while文を抜け、SQL文が完成します。しかし、最後にカンマが付いた状態となり、エラーとなってしまうので、39行目で最後の文字を取り除いております。

最後に、execSQL()でSQL文を実行することで、CSVファイルのデータを投入することができます。
以上、CSVファイルから大量のデータを取り込む方法でした。