スワイプ機能とデータベースにデータ保存を同時に実装する事に失敗します。
こんにちはです。。
データベースを使ったデータ保存とスワイプ機能の実装はそれぞれ単独ではある程度理解しているつもりなのですが、同時に実装しようとするとうまくいきません。どなたかアドバイスお願いします。
私がチャレンジした具体的なコードは次のようになっています。結果としては、「保存ボタン」をクリックしても「検索ボタン」をクリックしても「繰り返しアプリケーションが閉じてしまいます」と表示されてしまいます。
「商品名」と「使用期限」のところに文字を入力して、保存するとその商品名に使用期限が登録されるような仕組みになっています。検索する場合も、商品名を入力して検索を押すと対応する使用期限が表示される仕組みです。スワイプして2ページ目のところにあります。
コードは、
「DatabaseHelper.java」
public class DatabaseHelper extends SQLiteOpenHelper {
static final private String DBNAME="sample.sqlite";
static final private int VERSION=1;
//コンストラクター
public DatabaseHelper(Context context){
super(context, DBNAME,null,VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE data_of_expiration_date("+
"pn TEXT PRIMARY KEY,ed TEXT)");
db.execSQL("INSERT INTO data_of_expiration_date(pn,ed)"+
"VALUES('肉','D+3')");
db.execSQL("INSERT INTO data_of_expiration_date(pn,ed)"+
"VALUES('卵','D+5')");
db.execSQL("INSERT INTO data_of_expiration_date(pn,ed)"+
"VALUES('マヨネーズ','D+10')");
}
@Override
public void onUpgrade(SQLiteDatabase db, int old_v, int new_v) {
db.execSQL("DROP TABLE IF EXISTS data_of_expiration_date");
onCreate(db);
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
}
}
「MainActivity.java」
public class MainActivity extends AppCompatActivity {
private DatabaseHelper helper=null;
private EditText txtName=null;
private EditText txtDate=null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager mViewPager = (ViewPager)findViewById(R.id.viewpager);
PagerAdapter mPagerAdapter = new MyPagerAdapter();
mViewPager.setAdapter(mPagerAdapter);
helper=new DatabaseHelper(this);
txtName=(EditText) findViewById(R.id.txtName_id);
txtDate=(EditText) findViewById(R.id.txtDate_id);
}
//[保存]
public void onSave(View view){
SQLiteDatabase db =helper.getWritableDatabase();
try{
ContentValues cv=new ContentValues();
cv.put("pn",txtName.getText().toString());
cv.put("ed",txtDate.getText().toString());
db.insertWithOnConflict("data_of_expiration_date",null,cv,SQLiteDatabase.CONFLICT_REPLACE);
Toast.makeText(this,"データの登録に成功しました",
Toast.LENGTH_SHORT).show();
}finally{
db.close();
}
}
//[検索]
public void onSearch(View view){
SQLiteDatabase db=helper.getReadableDatabase();
Cursor cs=null;
try{
String[] cols={"pn","ed"};
String[] params={txtName.getText().toString()};
cs=db.query("data_of_expiration_date",cols,"pn=?",params,null,null,null,null);
if(cs.moveToFirst()){
txtDate.setText(cs.getString(1));
}else{
Toast.makeText(this,"データがありません",
Toast.LENGTH_SHORT).show();
}
}finally{
cs.close();
db.close();
}
}
private class MyPagerAdapter extends PagerAdapter {
@Override
public Object instantiateItem(ViewGroup container, int position) {
// レイアウトファイル名を配列で指定します。
int[] pages = {R.layout.page1, R.layout.page2, R.layout.page3};
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout ;
layout = inflater.inflate(pages[position], null);
((ViewPager) container).addView(layout);
return layout;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager)container).removeView((View)object);
}
@Override
public int getCount() {
// ページ数を返します。
return 3;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view.equals(object);
}
}
}
「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.wixsite.tobirayt.myapplication.MainActivity">
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/viewpager"
/>
</android.support.constraint.ConstraintLayout>
「page2.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">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="64dp"
android:onClick="onSearch"
android:text="@string/search_text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.535" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:layout_marginLeft="36dp"
android:onClick="onSave"
android:text="@string/save_text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.535" />
<MultiAutoCompleteTextView
android:id="@+id/txtName_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:text="@string/product_name_text"
app:layout_constraintBottom_toTopOf="@+id/txtDate_id"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<MultiAutoCompleteTextView
android:id="@+id/txtDate_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="144dp"
android:layout_marginTop="8dp"
android:text="@string/expiration_date_text"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button2"
app:layout_constraintVertical_bias="1.0" />
</android.support.constraint.ConstraintLayout>
「page1.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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
「page3.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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
「string.xml」
<string name="app_name">My Application</string>
<string name="save_text">保存</string>
<string name="search_text">検索</string>
<string name="product_name_text">商品名</string>
<string name="expiration_date_text">使用期限</string>
となっています。何がいけないのでしょうか?よろしくお願いします。
追記
「保存」ボタンを押したときのlogcatのコードは
04-03 14:58:24.476 30507-30507/com.wixsite.tobirayt.lifeib D/AndroidRuntime: Shutting down VM
04-03 14:58:24.477 30507-30507/com.wixsite.tobirayt.lifeib E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.wixsite.tobirayt.lifeib, PID: 30507
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference
at com.wixsite.tobirayt.lifeib.ExpirationDate.onSave(ExpirationDate.java:162)
at java.lang.reflect.Method.invoke(Native Method)
at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288)
at android.view.View.performClick(View.java:6294)
at android.view.View$PerformClick.run(View.java:24770)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
となっていました。