プロジェクトの作成
1.新規プロジェクトとしてEJAppを作成する。
Assetsフォルダの作成
2.新しいプロジェクトを作成したらまずassetsフォルダを作ろう。
appをオプションクリックしてNew->Folder->AssetsFolderを選択する。
3.Assetsフォルダはsrc/main/の直下に配置されなければならない。そこに置くか?というダイアログがでるのでチェックしてfinish
4.フォルダが配置されたことを確認
5.今回はtsvファイルを元にデータベースを作成する。以下のファイルをダウンロードしAssetsフォルダに配置する。
(ファイル名をejdic-hand-utf8.tsvとすること)
ejdic-hand-utf8
1 ファイル 4.30 MB
レイアウトの作成
6.activity_main.xmlを以下のように編集する。
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.mjpurin.ejapp.MainActivity"> <ProgressBar android:id="@+id/pb" style="@android:style/Widget.DeviceDefault.Light.ProgressBar" android:layout_width="0dp" android:layout_height="16dp" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> <EditText android:id="@+id/et" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:ems="10" android:hint="@android:string/search_go" android:inputType="textPersonName" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toBottomOf="@+id/pb" /> <Spinner android:id="@+id/sp" android:layout_width="0dp" android:layout_height="wrap_content" app:layout_constraintLeft_toRightOf="@+id/et" android:layout_marginLeft="8dp" android:layout_marginTop="8dp" app:layout_constraintTop_toBottomOf="@+id/pb" android:layout_marginRight="8dp" app:layout_constraintRight_toRightOf="parent" android:layout_marginStart="8dp" android:layout_marginEnd="8dp" /> <Button android:id="@+id/button" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginEnd="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" android:onClick="btClick" android:text="検索" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/et" /> <ListView android:id="@+id/lv" android:layout_width="0dp" android:layout_height="0dp" android:layout_marginBottom="8dp" android:layout_marginLeft="8dp" android:layout_marginRight="8dp" android:layout_marginTop="0dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@+id/button" /> </android.support.constraint.ConstraintLayout>
7.以下のようになればOKだ。
クラスの作成
8.Word.javaを以下のように作成する。(パッケージを環境に合わせて付与すること)
package com.example.xxxxxx; import java.io.Serializable; public class Word implements Serializable{ public int id; public String title; public String body; @Override public String toString() { String summary; if(this.body.length() > 14){ summary=this.body.substring(0,14)+"..."; }else{ summary=this.body; } return String.format("%s %s",this.title,summary); } }
DAOの作成
9.WordDAO.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 WordDAO { private SQLiteDatabase db; public void setDb(SQLiteDatabase db){ this.db=db; } public void createTable(){ String sql="CREATE TABLE words("+ "id INTEGER PRIMARY KEY AUTOINCREMENT,"+ "title TEXT,"+ "body TEXT)"; this.db.execSQL(sql); } public void createData(List<Word> list){ String sql="INSERT INTO words(title,body) VALUES(?,?)"; SQLiteStatement stt=this.db.compileStatement(sql); this.db.beginTransaction(); try{ for(Word word:list){ stt.bindString(1,word.title); stt.bindString(2,word.body); stt.executeInsert(); } this.db.setTransactionSuccessful(); }catch(SQLiteException e){ e.printStackTrace(); }finally { this.db.endTransaction(); } } public void findAll(String searchWord,List<Word> list){ list.clear(); String sql="SELECT * FROM words WHERE title LIKE ?"; String[] param={searchWord}; Cursor cursor=this.db.rawQuery(sql,param); while(cursor.moveToNext()){ Word word=new Word(); word.id=cursor.getInt(cursor.getColumnIndex("id")); word.title=cursor.getString(cursor.getColumnIndex("title")); word.body=cursor.getString(cursor.getColumnIndex("body")); list.add(word); } } public void dropTable(){ String sql="DROP TABLE IF EXISTS words"; this.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{ private Context context; private WordDAO dao; private String tsv= "ejdic-hand-utf8.tsv"; public OpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); this.context=context; dao=new WordDAO(); } @Override public void onCreate(SQLiteDatabase db) { dao.setDb(db); dao.createTable(); dao.createData(getListFromTSV(tsv)); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { dao.setDb(db); dao.dropTable(); this.onCreate(db); } private List<Word> getListFromTSV(String tsv){ List<Word> list=new ArrayList<>(); AssetManager am=context.getAssets(); try { InputStream is=am.open(tsv); InputStreamReader isr=new InputStreamReader(is); BufferedReader br=new BufferedReader(isr); String line; while((line=br.readLine()) != null){ Word word=new Word(); String[] vals=line.split("\t"); word.title=vals[0]; word.body=vals[1]; list.add(word); } br.close(); } catch (IOException e) { e.printStackTrace(); } return list; } }
詳細表示ようダイアログの作成
11.ResultDialog.javaを以下のように作成する。
import android.app.Dialog; import android.app.DialogFragment; import android.content.DialogInterface; import android.os.Bundle; import android.support.v7.app.AlertDialog; public class ResultDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Word item=(Word)getArguments().getSerializable("word"); AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); builder.setTitle(item.title); builder.setMessage(item.body); builder.setPositiveButton("close", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); return builder.create(); } }
MainActivityの作成
12.MainActivity.javaを以下のように編集する。
import android.app.DialogFragment; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.ProgressBar; import android.widget.Spinner; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { public ProgressBar pb; private EditText et; private Spinner sp; private ListView lv; private Button bt; private WordDAO dao; private List<Word> list=new ArrayList<>(); private ArrayAdapter<Word> lvAdapter; private Handler handler=new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pb=(ProgressBar)findViewById(R.id.pb); et=(EditText)findViewById(R.id.et); et.setVisibility(View.GONE); sp=(Spinner)findViewById(R.id.sp); sp.setVisibility(View.GONE); bt=(Button)findViewById(R.id.button); bt.setVisibility(View.GONE); lv=(ListView)findViewById(R.id.lv); //DB登録作業は時間がかかるので裏で処理する。 new Thread(new Runnable() { @Override public void run() { //初回のみここでDBを生成するので時間がかかる OpenHelper helper=new OpenHelper(getApplicationContext(),"ejword.db",null,1); SQLiteDatabase db=helper.getWritableDatabase(); dao=new WordDAO(); dao.setDb(db); //処理完了したらhandlerにビューの更新処理をキューイングする。 handler.post(new Runnable() { @Override public void run() { pb.setVisibility(View.GONE); et.setVisibility(View.VISIBLE); sp.setVisibility(View.VISIBLE); bt.setVisibility(View.VISIBLE); } }); } }).start(); //spinner生成 String[] items={"前方一致","一致","後方一致"}; ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, items); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); sp.setAdapter(adapter); //lv生成 lvAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,this.list); lv.setAdapter(lvAdapter); lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Word word=list.get(position); Bundle bundle=new Bundle(); bundle.putSerializable("word",word); DialogFragment dialog=new ResultDialog(); dialog.setArguments(bundle); dialog.show(getFragmentManager(),"TAG"); } }); } public void btClick(View v){ String mode=sp.getSelectedItem().toString(); String searchWord=et.getText().toString(); if(mode.equals("前方一致")){ searchWord=searchWord+"%"; }else if(mode.equals("後方一致")){ searchWord="%"+searchWord; } dao.findAll(searchWord,this.list); lvAdapter.notifyDataSetChanged(); } }
実行
13.実行してみよう。最初に見た動画のように動けば成功だ。
コメント