Значения кнопки включения и выключения должны храниться в базе данных - PullRequest
0 голосов
/ 03 мая 2019

Я работаю с приложением, у которого будет кнопка переключения, и я хочу сохранить и включить значения в базе данных без использования Редактировать текст, вы можете сказать мне процесс для этого.

1 Ответ

1 голос
/ 03 мая 2019

Ниже приведено простое приложение, отображающее 3 кнопки, которые при нажатии переключают сохранение состояния в базе данных SQlite.

Он состоит из 3 частей кода (разработка каждого будет процессом, которому необходимо следовать): -

  1. Макет с 3 кнопками activity_main.xml
  2. DatabaseHelper, который имеет основной код базы данных и предоставляет методы, которые можно использовать для добавления (вставки), обновления и запроса строк DatabaseHelper.java.
  3. Деятельность, которая управляет пользовательским интерфейсом MainActivity.java

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!" />

    <Button
        android:id="@+id/toggle1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/toggle2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/toggle3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

DataabseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String DBNAME = "mydatabase"; // The name of the database (the file name)
    public static final int DBVERSION = 1; // The SQliteOpenHelper class provides a means of managing versions so verion nmber is required

    //publicly availavle constants for the toggle states
    public static final int TOGGLESTATUSON = 1;
    public static final int TOGGLESTATUSOFF = 0;

    // The table and the columns
    public static final String TABLE_TOGGLE = "toggle";
    public static final String COL_TOGGLE_ID = BaseColumns._ID; // using _id allows CursorAdapater to be used
    public static final String COL_TOGGLE_STATUS = "toggle_status";

    SQLiteDatabase mDB; // The database connection

    // The Constructor
    public DatabaseHelper(Context context) {
        super(context, DBNAME, null, DBVERSION); // Call the super constructor
        mDB = this.getWritableDatabase(); // store the connection
    }

    // This is called ONCE when the database is created. Used here to create the table
    @Override
    public void onCreate(SQLiteDatabase db) {

        //The SQL for creating the table
        String crt_toggle_table_sql = "CREATE TABLE IF NOT EXISTS " + TABLE_TOGGLE + "(" +
                COL_TOGGLE_ID + " INTEGER PRIMARY KEY, " +
                COL_TOGGLE_STATUS + " INTEGER " +
                ")";
        // Execute the sql
        db.execSQL(crt_toggle_table_sql);
    }

    //No Version management included
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    // Add a row to the table (sets the button state to ON)
    public long addToggleRow() {
        ContentValues cv = new ContentValues();
        cv.put(COL_TOGGLE_STATUS,TOGGLESTATUSON);
        return mDB.insert(TABLE_TOGGLE,null,cv);
    }

    // Retrieve all rows
    public Cursor getToggleRows() {
        return mDB.query(TABLE_TOGGLE,null,null,null,null,null,null);
    }

    // Update a row, as per the provided id, toggling the value
    public void toggleToggle(long id) {
        mDB.execSQL(
                "UPDATE " + TABLE_TOGGLE + " SET " + COL_TOGGLE_STATUS + " = NOT " + COL_TOGGLE_STATUS + " WHERE " + COL_TOGGLE_ID + " =?",
                new String[]{String.valueOf(id)} // the arguments to be bound 
                );
    }
}

MainActivity.java (управление пользовательским интерфейсом)

public class MainActivity extends AppCompatActivity {

    //Class variables for the Buttons (3) and the DatabaseHelper object
    Button[] mButtons = new Button[3];
    DatabaseHelper mDBHlpr;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //Instantiate the DatabaseHelper (will create it when first run)
        mDBHlpr = new DatabaseHelper(this);
        initialiseDBToggleRows(); // Add the rows to the table, 1 per button, if not already added

        // set the array of buttons
        mButtons[0] = this.findViewById(R.id.toggle1);
        mButtons[1] = this.findViewById(R.id.toggle2);
        mButtons[2] = this.findViewById(R.id.toggle3);

        // Get the buttons states from the database setting the button text to ON or OFF
        loadButtons();

        // Add the onCLickListeners to 
        //      a) update the respective row in the database (toggle it)
        //      b) refresh the button display
        for (int i=0; i < mButtons.length;i++) {
            final int current = i;
            mButtons[i].setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mDBHlpr.toggleToggle((long)current + 1);
                    loadButtons();
                }
            });
        }
    }

    // Set the button text according to the values tored in the database
    private void loadButtons() {
        Cursor csr = mDBHlpr.getToggleRows();
        while (csr.moveToNext()) {
            if (csr.getInt(csr.getColumnIndex(DatabaseHelper.COL_TOGGLE_STATUS)) == DatabaseHelper.TOGGLESTATUSON) {
                mButtons[csr.getPosition()].setText("ON");
            } else {
                mButtons[csr.getPosition()].setText("OFF");
            }
        }
    }

    //Add a row, if no rows exist, for each button in the mButtons array
    private void initialiseDBToggleRows() {
        if(DatabaseUtils.queryNumEntries(mDBHlpr.getWritableDatabase(),DatabaseHelper.TABLE_TOGGLE) > 0) return;
        for (int i=0; i < mButtons.length; i++) {
            mDBHlpr.addToggleRow();
        }
    }
}

Результат

Приложение после установки выглядит так: -

enter image description here

Нажатие любой кнопки переключит ее из ON в OFF или из OFF в ON, состояние сохраняется в базе данных, поэтому при остановке приложения и перезапуске сохраняется / восстанавливается последнее состояние (если приложение не удалено или данные приложения не очищены). /deleted).

...