просто сохраните состояние флажка в базе данных sqlite - PullRequest
0 голосов
/ 28 мая 2018

Я просто пытаюсь сохранить состояние флажка в базе данных, но мое приложение вылетает, когда я нажимаю кнопку отправки. Я пытаюсь сделать это с помощью sqliteOpenHelper.После сохранения состояния я также хочу отобразить его, но сначала не могу его сохранить.Пожалуйста, ведите меня, как я новичок в Android.Вот мой код ..

MainActivity.java

    CheckBox ch1;
    Button btnSubmit;
    int checked=0;
    DatabaseHelper dbhelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ch1=(CheckBox)findViewById(R.id.checkBox);
    btnSubmit=(Button)findViewById(R.id.button);

    AddData();
    }

    public void AddData() {
    btnSubmit.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            ch1.setOnCheckedChangeListener(new 
      CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, 
         boolean isChecked) {
                    if(isChecked){
                        checked = 1;
                    }else{
                        checked = 0;
                    }
                }
            });


            boolean insertData = dbhelper.addData(checked);

            if (insertData == true) {
                Toast.makeText(MainActivity.this, "Order Placed!", 
       Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(MainActivity.this, "Something went wrong : 
      (.", Toast.LENGTH_LONG).show();
            }
        }
    });
}

databasehelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "check.db";
    public static final String TABLE_NAME = "entry";
    public static final String COL1 = "SIZE";

    public DatabaseHelper(Context context) {
       super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_NAME + "(SIZE INTEGER)";
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
   {
    db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
    onCreate(db);
   }

   public boolean addData(int s1){
       SQLiteDatabase db = this.getWritableDatabase();

       ContentValues contentValues = new ContentValues();
       contentValues.put(COL1, s1);

       long result  = db.insert(TABLE_NAME, null, contentValues);

       if(result == -1){
           return false;
       }else{
           return true;
       }
   }
}

Logcat

05-28 19:06:06.236 3806-3806/com.example.hp.checkbox E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.hp.checkbox, PID: 3806 java.lang.NullPointerException: Attempt to invoke virtual method 'booleancom.example.hp.checkbox.DatabaseHelper.addData(java.lang.String)' on a null object reference
    at com.example.hp.checkbox.MainActivity$2.onClick(MainActivity.java:55)
    at android.view.View.performClick(View.java:5637)
    at android.view.View$PerformClick.run(View.java:22429)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

У вас довольно много проблем, и я бы посоветовал попытаться использовать следующий код, который отделяет слушателей, а не заключает их в себе (checkChanged будет применяться только в том случае, если нажата кнопка отправки, что слишком поздно, так как это произойдет вв каком бы состоянии оно ни находилось (до тех пор, пока вы не поменяете флажок)).

  • Ожидается, "но как узнать, что добавлена ​​строка?" метод logData был добавлен в DatabaseHelper , который будет перечислять строки в журнале (например, введение в получение данных из базы данных).

    MainActivity: -

    открытый класс MainActivity расширяет AppCompatActivity {

    CheckBox ch1;
    Button btnSubmit;
    int checked=0;
    DatabaseHelper dbhelper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dbhelper = new DatabaseHelper(this); //<<<< ADDED
    
        ch1=(CheckBox)findViewById(R.id.checkBox);
        btnSubmit=(Button)findViewById(R.id.button);
    
        // Button onClick Listener
        btnSubmit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
    
                dbhelper.addData(checked);
                dbhelper.logData(); //<<<< ADDED to display data to log (see logData in DatabaseHelper)
            }
        });
    
        // CheckBox onchanged Listener
        ch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                checked = 0;
                if (isChecked) {
                    checked = 1;
                }
            }
        });
        //AddData(); //REMOVED
    }
    

DatabaseHelper.java: -

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DATABASE_NAME = "check.db";
    public static final String TABLE_NAME = "entry";
    public static final String COL1 = "SIZE";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //String createTable = "CREATE TABLE " + TABLE_NAME + "(SIZE INTEGER)";
        String createTable = "CREATE TABLE " + TABLE_NAME + "(" + COL1 + " INTEGER)"; //<<<< Suggestion
        db.execSQL(createTable);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        //db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME); //<<<< INVALID
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); //<<<< ADDED CORRECTION
        onCreate(db);
    }

    public boolean addData(int s1){
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues contentValues = new ContentValues();
        contentValues.put(COL1, s1);

        //<<<< simplified return
        return (db.insert(TABLE_NAME, null, contentValues) > 0);
    }

    //<<<<<<<<<< New method to write contents to the log >>>>>>>>>>
    public void logData() {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr =  db.query(TABLE_NAME,null,null,null, null,null, null);
        Log.d(
                "ENTRY TABLE INFO",
                "Number of rows in table is " +
                        csr.getCount() +
                        "; they are :-"
        );
        while (csr.moveToNext()) {
            Log.d(
                    "ENTRY TABLE INFO",
                    "Row # " +
                            String.valueOf(csr.getPosition()) +
                            " that has a value of " +
                            csr.getInt(csr.getColumnIndex(COL1))
            );
        }
        csr.close();
    }
}

Результаты тестирования

После выполнения следующих действий: -

  1. Нажатие кнопки отправки (флажок не установлен).
  2. Проверка флажка.
  3. Нажатие кнопки отправки (флажок установлен).

Результирующий вывод вжурнал: -

05-28 21:47:40.628 1156-1156/ci.checkit D/ENTRY TABLE INFO: Number of rows in table is 2; they are :-
    Row # 0 that has a value of 0
    Row # 1 that has a value of 1
0 голосов
/ 28 мая 2018

Вы не должны ставить прослушиватель событий флажка внутри кнопки отправки OnClick Listener.

...