Androidの学習をはじめて21日くらいの人の問題集

Android


SQLiteを使ってデータの保存をしてみよう。

プロジェクトの作成

1.新規プロジェクトとしてPrefAppを作成する。

Assetsフォルダの作成

2.新しいプロジェクトを作成したらまずassetsフォルダを作ろう。
appをオプションクリックしてNew->Folder->AssetsFolderを選択する。

3.Assetsフォルダはsrc/main/の直下に配置されなければならない。そこに置くか?というダイアログがでるのでチェックしてfinish

4.フォルダが配置されたことを確認

5.今回はcsvファイルを元にデータベースを作成する。以下のファイルをダウンロードしAssetsフォルダに配置する。

レイアウトの作成

6.activity_main.xmlを以下のように編集する。

01<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
02    xmlns:tools="http://schemas.android.com/tools"
03    android:layout_width="match_parent"
04    android:layout_height="match_parent"
05 
06    tools:context=".MainActivity" >
07 
08    <LinearLayout
09        android:id="@+id/linearLayout1"
10        android:layout_width="match_parent"
11        android:layout_height="wrap_content"
12        android:background="@android:drawable/btn_default"
13        android:orientation="vertical" >
14 
15        <LinearLayout
16            android:layout_width="match_parent"
17            android:layout_height="wrap_content" >
18 
19            <TextView
20                android:id="@+id/textView1"
21                android:layout_width="wrap_content"
22                android:layout_height="match_parent"
23                android:background="@android:drawable/btn_default"
24                android:gravity="center"
25                android:text="県番号"
26                android:textAppearance="?android:attr/textAppearanceLarge" />
27 
28            <LinearLayout
29                android:layout_width="match_parent"
30                android:layout_height="match_parent"
31                android:orientation="vertical" >
32 
33                <ImageButton
34                    android:id="@+id/imageButton1"
35                    android:layout_width="match_parent"
36                    android:layout_height="wrap_content"
37                    android:background="@android:drawable/btn_default"
38                    android:onClick="btUp"
39                    android:src="@android:drawable/arrow_up_float" />
40 
41                <TextView
42                    android:id="@+id/tvId"
43                    android:layout_width="match_parent"
44                    android:layout_height="wrap_content"
45                    android:background="@android:drawable/edit_text"
46                    android:gravity="center"
47                    android:text="1"
48                    android:textSize="32sp" />
49 
50                <ImageButton
51                    android:id="@+id/imageButton2"
52                    android:layout_width="match_parent"
53                    android:layout_height="wrap_content"
54                    android:background="@android:drawable/btn_default"
55                    android:onClick="btDown"
56                    android:src="@android:drawable/arrow_down_float" />
57            </LinearLayout>
58        </LinearLayout>
59 
60        <Button
61            android:id="@+id/button1"
62            android:layout_width="match_parent"
63            android:layout_height="wrap_content"
64            android:background="@android:drawable/btn_default"
65            android:onClick="btSearch"
66            android:text="GO" />
67    </LinearLayout>
68 
69    <TextView
70        android:id="@+id/tvResult"
71        android:layout_width="match_parent"
72        android:layout_height="match_parent"
73        android:layout_alignLeft="@+id/linearLayout1"
74        android:layout_below="@+id/linearLayout1"
75        android:background="@android:drawable/alert_dark_frame"
76        android:gravity="center"
77        android:text=""
78        android:textColor="@android:color/white"
79        android:textSize="20sp" />
80 
81</RelativeLayout>

7.以下のようになればOKだ。

クラスの作成

8.Pref.javaを以下のように作成する。(パッケージを環境に合わせて付与すること)

01package com.example.xxxxxx;
02public class Pref {
03    public int id;
04    public String name;
05    public String cap;
06 
07    public Pref(int id,String name,String cap){
08        this.id=id;
09        this.name=name;
10        this.cap=cap;
11    }
12 
13    public String toString(){
14        return String.format("県名:%s\n県庁所在地%s", name,cap);
15    }
16}

DAOの作成

9.PrefDAO.javaを以下のように作成

01import android.database.Cursor;
02import android.database.sqlite.SQLiteDatabase;
03import android.database.sqlite.SQLiteException;
04import android.database.sqlite.SQLiteStatement;
05 
06import java.util.List;
07 
08public class PrefDAO {
09    private SQLiteDatabase db;
10 
11    public void setDb(SQLiteDatabase db) {
12        this.db = db;
13    }
14    //prefsテーブル作成
15    public void createTable() {
16        String sql = "CREATE TABLE prefs( " +
17                "id INTEGER, " +
18                "name TEXT," +
19                "cap TEXT );";
20        db.execSQL(sql);
21    }
22    //リストを元にDB挿入
23    public void createData(List<Pref> list) {
24        try {
25            SQLiteStatement stt =
26                    this.db.compileStatement("INSERT INTO prefs VALUES(?,?,?)");
27            //トランザクション開始
28            this.db.beginTransaction();
29            for (Pref p : list) {
30                stt.bindLong(1, p.id);
31                stt.bindString(2, p.name);
32                stt.bindString(3, p.cap);
33                stt.executeInsert();
34            }
35            //ここまでくれば成功なので成功フラグを立てる
36            this.db.setTransactionSuccessful();
37        }catch(SQLiteException e){
38            e.printStackTrace();
39        }finally{
40            //成功フラグが立っていればここでコミット(確定)させる。
41            db.endTransaction();
42        }
43 
44    }
45    //idからPrefインスタンスを一つ返却
46    public Pref findOne(int id){
47        String sql="SELECT * FROM prefs WHERE id=?";
48        String[] param={String.valueOf(id)};
49        Cursor cursor=this.db.rawQuery(sql,param);
50        //moveToFirst()は1件目のレコードに移動。0件ならばfalse;
51        if(cursor.moveToFirst()){
52            String name=cursor.getString(cursor.getColumnIndex("name"));
53            String cap=cursor.getString(cursor.getColumnIndex("cap"));
54           return new Pref(id,name,cap);
55        }else{
56            return null;
57        }
58 
59    }
60    //テーブル削除
61    public void dropTable(){
62        String sql = "DROP TABLE IF EXISTS prefs";
63        db.execSQL(sql);
64    }
65}

SQLiteOpenHelperの作成

10.SQLiteOpenHelperクラスを継承したOpenHelper.javaを以下のように作成する。

01import android.content.Context;
02import android.content.res.AssetManager;
03import android.database.sqlite.SQLiteDatabase;
04import android.database.sqlite.SQLiteOpenHelper;
05 
06import java.io.BufferedReader;
07import java.io.IOException;
08import java.io.InputStream;
09import java.io.InputStreamReader;
10import java.util.ArrayList;
11import java.util.List;
12 
13 
14public class OpenHelper extends SQLiteOpenHelper {
15    //csvファイル名
16    private String csv="prefecture.csv";
17    //assetsにアクセスするのに必要(コンスラクタで受け取る)
18    private Context context;
19    //DAO
20    private PrefDAO dao;
21    //コンストラクタ
22    public OpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
23        super(context, name, factory, version);
24        this.context=context;
25        //DAOをnew
26        dao=new PrefDAO();
27    }
28    //コンストラクタで指定されたDBがなかった時に通る。
29    @Override
30    public void onCreate(SQLiteDatabase db) {
31        //DAOにdbをセット
32        dao.setDb(db);
33        //テーブル作成
34        dao.createTable();
35        //csvを渡してリストを得る
36        List<Pref> list=getListFromCSV(csv);
37        //テーブルにデータ挿入
38        dao.createData(list);
39 
40    }
41    //dbのバージョンが上がった時に通る。
42    @Override
43    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
44        dao.setDb(db);
45        //一度破棄する。
46        dao.dropTable();
47        this.onCreate(db);
48    }
49    //Assetsにあるcsvファイルからリストを返却するメソッド
50    private List<Pref> getListFromCSV(String csv){
51        List<Pref> list=new ArrayList<>();
52        //AssetManager取得
53        AssetManager am=context.getAssets();
54        try {
55            InputStream is=am.open(csv);
56            InputStreamReader isr=new InputStreamReader(is);
57            BufferedReader br=new BufferedReader(isr);
58            String line;
59            while((line=br.readLine()) !=null){
60                String[] data=line.split(",");
61                Pref pref=new Pref(Integer.parseInt(data[0]),data[1],data[2]);
62                list.add(pref);
63            }
64            br.close();
65        } catch (IOException e) {
66            e.printStackTrace();
67        }
68        return list;
69 
70    }
71}

MainActivity

11.MainActivity.javaを以下のように作成する。

01import android.database.sqlite.SQLiteDatabase;
02import android.os.Bundle;
03import android.support.v7.app.AppCompatActivity;
04import android.view.View;
05import android.widget.TextView;
06 
07public class MainActivity extends AppCompatActivity {
08    static final int MIN=1,MAX=47;
09    TextView tvId,tvResult;
10    PrefDAO dao;
11    int id=1;
12    @Override
13    protected void onCreate(Bundle savedInstanceState) {
14        super.onCreate(savedInstanceState);
15        setContentView(R.layout.activity_main);
16        tvId=(TextView)findViewById(R.id.tvId);
17        tvResult=(TextView)findViewById(R.id.tvResult);
18        OpenHelper helper=new OpenHelper(this,"pref.db",null,1);
19        SQLiteDatabase db=helper.getWritableDatabase();
20        dao=new PrefDAO();
21        dao.setDb(db);
22    }
23    public void btUp(View v){
24        id=id==MAX? MIN:++id;
25        tvId.setText(String.valueOf(id));
26    }
27    public void btDown(View v){
28        id=id==MIN? MAX:--id;
29        tvId.setText(String.valueOf(id));
30    }
31    public void btSearch(View v){
32        tvResult.setText(dao.findOne(id).toString());
33    }
34}

実行

12.実行してみよう。県番号を選んでGOボタンを押して、県庁所在地が表示されれば成功だ。

コメント

タイトルとURLをコピーしました