Android не будет сохранять данные, введенные в базу данных SQLite - PullRequest
2 голосов
/ 25 марта 2019

Я создаю приложение, которое управляет ингредиентами. Я хочу создать базу данных SQLite, которая сохранит все ингредиенты, которые вводит пользователь, когда нажимает кнопку «Сохранить». Однако по какой-то причине мои данные не будут сохранены в базе данных SQLite. Я вообще не вижу, что не так с кодом.

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper
{
    private static final String tag = "Database Helper";
    private static final String TABLE_NAME = "products_registered";
    private static final String col1 = "Name";
    private static final String col2 = "Weight";
    private static final String col3 = "Price";
    private static final String col4 = "Description";

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        String createTable = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
                             " (_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                             col1 + " TEXT NOT NULL," +
                             col2 + " DOUBLE NOT NULL," +
                             col3 + " DOUBLE NOT NULL," +
                             col4 + " TEXT);";

        db.execSQL(createTable);
    }

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

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

    public boolean addData(String item1, String item2, String item3, String item4)
    {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(col1, item1);
        contentValues.put(col2, item2);
        contentValues.put(col3, item3);
        contentValues.put(col4, item4);

        Log.d(tag,"Adding name " + item1 + " to " + TABLE_NAME);

        long result = db.insert(TABLE_NAME, null, contentValues);
        db.close();
        if(result == -1)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

Активность в реестре продуктов

public class RegisterProduct extends AppCompatActivity
{

    DatabaseHelper databaseHelper;
    private Button saveProductButton;
    private EditText productName;
    private EditText productWeight;
    private EditText productPrice;
    private EditText productDescription;
    DatabaseHelper mDatabaseHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register_product);
        saveProductButton = (Button) findViewById(R.id.saveButton);
        productName = (EditText) findViewById(R.id.enterName);
        productWeight = (EditText) findViewById(R.id.enterWeight);
        productPrice = (EditText) findViewById(R.id.enterPrice);
        productDescription = (EditText) findViewById(R.id.enterDescription);
        mDatabaseHelper = new DatabaseHelper(this);


        try
        {
            saveProductButton.setOnClickListener(new View.OnClickListener()
            {
                public void onClick(View view)
                {
                    String nameEntered = productName.getText().toString();
                    String weightEntered = productWeight.getText().toString();
                    String priceEntered = productPrice.getText().toString();
                    String descriptionEntered = productDescription.getText().toString();

                    addData(nameEntered, weightEntered, priceEntered, descriptionEntered);
                    productName.setText("");

                }
            });
        }
        finally
        {
            mDatabaseHelper.close();
        }
    }

    public void addData(String newEntry1, String newEntry2, String newEntry3, String newEntry4)
    {
        mDatabaseHelper.addData(newEntry1, newEntry2, newEntry3, newEntry4);
    }

Я создал отдельный класс для создания базы данных и самой таблицы, а затем создал действие, в котором я вызвал методы для сохранения ввода данных в активности, показанной ниже.

Изображение отображения активности

1 Ответ

2 голосов
/ 26 марта 2019

Скорее всего, ваша проблема в том, что вы изменили структуру / схему базы данных, возможно, добавив столбец с момента запуска приложения.

Обычно при запуске приложения вы получаете исключение SQLite, указывающее, что столбец не найден. Однако, поскольку вы обернули addData в конструкцию try / finally, исключение было подавлено, поэтому кажется, что все в порядке, поскольку приложение не падает или ничего не показывает в журнале.

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

Причина, по которой изменение схемы / структуры в коде для метода onCreate (вероятная основная причина проблемы) заключается в том, что метод onCreate ТОЛЬКО запускается только при база данных создана.

Если схема / структура базы данных изменена, то вам нужен какой-либо способ принудительного изменения структуры или при разработке приложения, поскольку не нужно сохранять базовые данные, тогда самый простой способ - удалить базы данных, а затем снова запустите приложение.

Базу данных можно удалить, удалив данные приложения или удалив приложение (учитывая, что все существующие данные будут потеряны).

Альтернативой является УДАЛЕНИЕ соответствующих таблиц и воссоздание их. Для этого часто пишется метод onUpgrade . Если это так (то есть в вашем случае), то другим способом изменения структуры является запуск метода onUpgrage путем увеличения передачи номера версии в конструктор SQLiteOpenHelper (супер вызов). В вашем случае вы можете изменить super(context, TABLE_NAME, null, 1); на super(context, TABLE_NAME, null, 2);

После удаления базы данных или увеличения номера версии (предпочтительно удаления конструкции try / finally со стороны вызова до addData ) и перезапуска приложения, оно может просто работать. Если нет, то в журнале должны быть указаны все исключения, и проблемы могут быть точно определены.

...