

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

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

「商品名」と「使用期限」のところに文字を入力して、保存するとその商品名に使用期限が登録されるような仕組みになっています。検索する場合も、商品名を入力して検索を押すと対応する使用期限が表示される仕組みです。スワイプして２ページ目のところにあります。

コードは、  
「DatabaseHelper.java」

[code]

    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);
        }
    }
    
[/code]

「MainActivity.java」

[code]

    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);
            }
        }
    }
    
[/code]

「activity_main.xml」

[code]

    <?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>
    
[/code]

「page2.xml」

[code]

    <?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>
    
[/code]

「page1.xml」

[code]

    <?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>
    
[/code]

「page3.xml」

[code]

    <?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>
    
[/code]

「string.xml」

[code]

    <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>
    
[/code]

となっています。何がいけないのでしょうか？よろしくお願いします。

追記  
「保存」ボタンを押したときのlogcatのコードは

[code]

    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) 
    
[/code]

となっていました。


CC BY-SA 4.0
2018-04-03T06:14:24.883
42892
2021-03-07T04:43:46.817
2021-03-07T04:40:44.387
3060
27664
question
java android
スワイプ機能とデータベースにデータ保存を同時に実装する事に失敗します。


解決したのでご報告いたします。

よくはわからないのですが、以下の記述をそれぞれのメソッド内に追加する事でうまくいきました。

[code]

    txtName=(EditText) findViewById(R.id.txtName_id);
    txtDate=(EditText) findViewById(R.id.txtDate_id);
    
[/code]

* * *

_この投稿は[@user27664
さんのコメント](https://ja.stackoverflow.com/questions/42892/%e3%82%b9%e3%83%af%e3%82%a4%e3%83%97%e6%a9%9f%e8%83%bd%e3%81%a8%e3%83%87%e3%83%bc%e3%82%bf%e3%83%99%e3%83%bc%e3%82%b9%e3%81%ab%e3%83%87%e3%83%bc%e3%82%bf%e4%bf%9d%e5%ad%98%e3%82%92%e5%90%8c%e6%99%82%e3%81%ab%e5%ae%9f%e8%a3%85%e3%81%99%e3%82%8b%e4%ba%8b%e3%81%ab%e5%a4%b1%e6%95%97%e3%81%97%e3%81%be%e3%81%99#comment44215_42892)
の内容を元に コミュニティwiki として投稿しました。_


CC BY-SA 4.0
2021-03-07T04:43:46.817
74470
2021-03-07T04:43:46.817
3060
42892
answer