こんにちはです。。

データベースを使ったデータ保存とスワイプ機能の実装はそれぞれ単独ではある程度理解しているつもりなのですが、同時に実装しようとするとうまくいきません。どなたかアドバイスお願いします。

私がチャレンジした具体的なコードは次のようになっています。結果としては、「保存ボタン」をクリックしても「検索ボタン」をクリックしても「繰り返しアプリケーションが閉じてしまいます」と表示されてしまいます。

「商品名」と「使用期限」のところに文字を入力して、保存するとその商品名に使用期限が登録されるような仕組みになっています。検索する場合も、商品名を入力して検索を押すと対応する使用期限が表示される仕組みです。スワイプして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) 

となっていました。