SQLiteを使ってデータの保存をしてみよう。
プロジェクトの作成
1.新規プロジェクトとしてPrefAppを作成する。
Assetsフォルダの作成
2.新しいプロジェクトを作成したらまずassetsフォルダを作ろう。
appをオプションクリックしてNew->Folder->AssetsFolderを選択する。
3.Assetsフォルダはsrc/main/の直下に配置されなければならない。そこに置くか?というダイアログがでるのでチェックしてfinish
4.フォルダが配置されたことを確認
5.今回はcsvファイルを元にデータベースを作成する。以下のファイルをダウンロードしAssetsフォルダに配置する。
Prefecture
1 ファイル 2.07 KB
レイアウトの作成
6.activity_main.xmlを以下のように編集する。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:drawable/btn_default" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="match_parent" android:background="@android:drawable/btn_default" android:gravity="center" android:text="県番号" android:textAppearance="?android:attr/textAppearanceLarge" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageButton android:id="@+id/imageButton1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:drawable/btn_default" android:onClick="btUp" android:src="@android:drawable/arrow_up_float" /> <TextView android:id="@+id/tvId" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:drawable/edit_text" android:gravity="center" android:text="1" android:textSize="32sp" /> <ImageButton android:id="@+id/imageButton2" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:drawable/btn_default" android:onClick="btDown" android:src="@android:drawable/arrow_down_float" /> </LinearLayout> </LinearLayout> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@android:drawable/btn_default" android:onClick="btSearch" android:text="GO" /> </LinearLayout> <TextView android:id="@+id/tvResult" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignLeft="@+id/linearLayout1" android:layout_below="@+id/linearLayout1" android:background="@android:drawable/alert_dark_frame" android:gravity="center" android:text="" android:textColor="@android:color/white" android:textSize="20sp" /> </RelativeLayout>
7.以下のようになればOKだ。
クラスの作成
8.Pref.javaを以下のように作成する。(パッケージを環境に合わせて付与すること)
package com.example.xxxxxx; public class Pref { public int id; public String name; public String cap; public Pref(int id,String name,String cap){ this.id=id; this.name=name; this.cap=cap; } public String toString(){ return String.format("県名:%s\n県庁所在地%s", name,cap); } }
DAOの作成
9.PrefDAO.javaを以下のように作成
import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteStatement; import java.util.List; public class PrefDAO { private SQLiteDatabase db; public void setDb(SQLiteDatabase db) { this.db = db; } //prefsテーブル作成 public void createTable() { String sql = "CREATE TABLE prefs( " + "id INTEGER, " + "name TEXT," + "cap TEXT );"; db.execSQL(sql); } //リストを元にDB挿入 public void createData(List<Pref> list) { try { SQLiteStatement stt = this.db.compileStatement("INSERT INTO prefs VALUES(?,?,?)"); //トランザクション開始 this.db.beginTransaction(); for (Pref p : list) { stt.bindLong(1, p.id); stt.bindString(2, p.name); stt.bindString(3, p.cap); stt.executeInsert(); } //ここまでくれば成功なので成功フラグを立てる this.db.setTransactionSuccessful(); }catch(SQLiteException e){ e.printStackTrace(); }finally{ //成功フラグが立っていればここでコミット(確定)させる。 db.endTransaction(); } } //idからPrefインスタンスを一つ返却 public Pref findOne(int id){ String sql="SELECT * FROM prefs WHERE id=?"; String[] param={String.valueOf(id)}; Cursor cursor=this.db.rawQuery(sql,param); //moveToFirst()は1件目のレコードに移動。0件ならばfalse; if(cursor.moveToFirst()){ String name=cursor.getString(cursor.getColumnIndex("name")); String cap=cursor.getString(cursor.getColumnIndex("cap")); return new Pref(id,name,cap); }else{ return null; } } //テーブル削除 public void dropTable(){ String sql = "DROP TABLE IF EXISTS prefs"; db.execSQL(sql); } }
SQLiteOpenHelperの作成
10.SQLiteOpenHelperクラスを継承したOpenHelper.javaを以下のように作成する。
import android.content.Context; import android.content.res.AssetManager; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class OpenHelper extends SQLiteOpenHelper { //csvファイル名 private String csv="prefecture.csv"; //assetsにアクセスするのに必要(コンスラクタで受け取る) private Context context; //DAO private PrefDAO dao; //コンストラクタ public OpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); this.context=context; //DAOをnew dao=new PrefDAO(); } //コンストラクタで指定されたDBがなかった時に通る。 @Override public void onCreate(SQLiteDatabase db) { //DAOにdbをセット dao.setDb(db); //テーブル作成 dao.createTable(); //csvを渡してリストを得る List<Pref> list=getListFromCSV(csv); //テーブルにデータ挿入 dao.createData(list); } //dbのバージョンが上がった時に通る。 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { dao.setDb(db); //一度破棄する。 dao.dropTable(); this.onCreate(db); } //Assetsにあるcsvファイルからリストを返却するメソッド private List<Pref> getListFromCSV(String csv){ List<Pref> list=new ArrayList<>(); //AssetManager取得 AssetManager am=context.getAssets(); try { InputStream is=am.open(csv); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String line; while((line=br.readLine()) !=null){ String[] data=line.split(","); Pref pref=new Pref(Integer.parseInt(data[0]),data[1],data[2]); list.add(pref); } br.close(); } catch (IOException e) { e.printStackTrace(); } return list; } }
MainActivity
11.MainActivity.javaを以下のように作成する。
import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity { static final int MIN=1,MAX=47; TextView tvId,tvResult; PrefDAO dao; int id=1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvId=(TextView)findViewById(R.id.tvId); tvResult=(TextView)findViewById(R.id.tvResult); OpenHelper helper=new OpenHelper(this,"pref.db",null,1); SQLiteDatabase db=helper.getWritableDatabase(); dao=new PrefDAO(); dao.setDb(db); } public void btUp(View v){ id=id==MAX? MIN:++id; tvId.setText(String.valueOf(id)); } public void btDown(View v){ id=id==MIN? MAX:--id; tvId.setText(String.valueOf(id)); } public void btSearch(View v){ tvResult.setText(dao.findOne(id).toString()); } }
実行
12.実行してみよう。県番号を選んでGOボタンを押して、県庁所在地が表示されれば成功だ。
コメント