Как добавить базу данных в мое приложение BMI, чтобы сохранить оценки пользователей? - PullRequest
0 голосов
/ 09 мая 2018

Я создаю приложение для ИМТ.

Я хотел бы добавить базу данных, чтобы пользователи могли сохранять свои оценки ИМТ и просматривать свои исторические результаты в любое время. По сути, как мне добавить базу данных? Я действительно изо всех сил пытаюсь сделать это.

Если я прав, я должен использовать SQLite

Любая помощь приветствуется

Вот мой код:

mainactivity.java:

public class MainActivity extends AppCompatActivity {

private EditText height;
private EditText weight;
private TextView result;




@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    height = (EditText) findViewById(R.id.height);
    weight = (EditText) findViewById(R.id.weight);
    result = (TextView) findViewById(R.id.result);
}

public void calculateBMI(View v) {
    String heightStr = height.getText().toString();
    String weightStr = weight.getText().toString();

    if (heightStr != null && !"".equals(heightStr)
            && weightStr != null  &&  !"".equals(weightStr)) {
        float heightValue = Float.parseFloat(heightStr) / 100;
        float weightValue = Float.parseFloat(weightStr);

        float bmi = weightValue / (heightValue * heightValue);

        displayBMI(bmi);
    }
}

private void displayBMI(float bmi) {
    String bmiLabel = "";

    if (Float.compare(bmi, 15f) <= 0) {
        bmiLabel = getString(R.string.v_sev_underweight);
    } else if (Float.compare(bmi, 15f) > 0  &&  Float.compare(bmi, 16f) <= 0) {
        bmiLabel = getString(R.string.sev_underweight);
    } else if (Float.compare(bmi, 16f) > 0  &&  Float.compare(bmi, 18.5f) <= 0) {
        bmiLabel = getString(R.string.underweight);
    } else if (Float.compare(bmi, 18.5f) > 0  &&  Float.compare(bmi, 25f) <= 0) {
        bmiLabel = getString(R.string.healthy);
    } else if (Float.compare(bmi, 25f) > 0  &&  Float.compare(bmi, 30f) <= 0) {
        bmiLabel = getString(R.string.overweight);
    } else if (Float.compare(bmi, 30f) > 0  &&  Float.compare(bmi, 35f) <= 0) {
        bmiLabel = getString(R.string.obese1);
    } else if (Float.compare(bmi, 35f) > 0  &&  Float.compare(bmi, 40f) <= 0) {
        bmiLabel = getString(R.string.obese2);
    } else {
        bmiLabel = getString(R.string.obese3);
    }

    bmiLabel = bmi + "\n\n" + bmiLabel;
    result.setText(bmiLabel);
}

public void saveBMI() {

}

public void viewBMI() {

}


}

Ответы [ 2 ]

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

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

Создание помощника по базам данных (DBHelper.java для демонстрации)

Первый шаг, если использовать SQLite на устройстве Android (предполагает сравнительно простой подход с использованием класса SQLiteOpenHelper), это создать подкласс SQLiteOpenHelper (он же DBHelper), то есть класс, который расширяет SQLiteOpenHelper. например : -

public class DBhelper extends SQLiteOpenHelper {
    ...... stuff to be added as yet
}

Вам понадобится подходящий конструктор, который передаст контекст, имя базы данных, фабричный метод (null будет делать) и версию базы данных.

So the above could then become :-

public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }
}

Однако такой класс должен включать овериды для методов onCreate и onUpgrade.

  • метод onCreate вызывается, когда база данных только что была создана (т.е. при первом вызове getReadableDatabase или getWritabledatabase).
    • Примечание после создания базы данных метод onCreate не вызывается. То есть onCreate НЕ вызывается при каждом запуске приложения, так как после создания базы данных создается файл (data / data // database /)
    • Изменение кода в методе onCreate НЕ БУДЕТ изменять базу данных, пока база данных не будет удалена (есть другие способы).
    • Это очень распространенная проблема, поэтому и объясняется.

Таким образом, вышеприведенное теперь может быть: -

public class DBHelper extends SQLiteOpenHelper {
    public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

Предполагается, что база данных будет называться bmirecorder.db и что она будет иметь одну таблицу, которая будет называться bmirecord и что для каждой записи (строки) будет три поля (столбца), а именно record_userid, record_date и record_bmi. Желательно, чтобы эти имена были определены в одном месте и чтобы имя всегда получалось из этого единственного места и что это единственное место равняется константе, тогда мы должны добавить: -

public static final String DBNAME = "bmirecorder.db";
public static final int DBVESRION = 1; 
public static final String TABLE_BMIRECORD = "bmirecord";
public static final String COLUMN_BMIRECORD_USERID = "record_userid";
public static final String COLUMN_BMIRECORD_DATE = "record_date";
public static final String COLUMN_BMIRECORD_BMI = "record_bmi";
  • Выше будет добавлено в установленном порядке

Поскольку мы знаем, что база данных всегда будет одинаковой, и что версия базы данных не сильно изменится, и что мы не собираемся использовать фабрику. Конструктор можно упростить, просто передав контекст.

Таким образом, приведенный выше код можно изменить на: -

открытый класс DBHelper расширяет SQLiteOpenHelper {

public static final String DBNAME = "bmirecorder.db";
public static final int DBVESRION = 1;
public static final String TABLE_BMIRECORD = "bmirecord";
public static final String COLUMN_BMIRECORD_USERID = "record_userid";
public static final String COLUMN_BMIRECORD_DATE = "record_date";
public static final String COLUMN_BMIRECORD_BMI = "record_bmi";

public DBHelper(Context context) {
    super(context, DBNAME, null, DBVESRION);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {

}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}

}

  • Итак, константы были добавлены и некоторые использованы (DBNAME и DBVERSION)
  • Чтобы создать экземпляр, в упражнении вы должны написать что-то вроде DBHelper myDBHelper = new DBHelper (this);
  • Вышеописанное будет работать и фактически создаст пустую базу данных (но только если будет предпринята попытка использовать getReadableDatabase или getWritableDatabase).

Чтобы создать таблицу bmirecord, мы можем добавить код для создания таблицы в методе onCreate. Такие как: -

    String crtsql = "CREATE TABLE IF NOT EXISTS " + TABLE_BMIRECORD +
            "(" +
            COLUMN_BMIRECORD_USERID + " INTEGER," +
            COLUMN_BMIRECORD_DATE + " TEXT DEFAULT CURRENT_TIMESTAMP," +
            COLUMN_BMIRECORD_BMI + " REAL NOT NULL" +
            ")";
    sqLiteDatabase.execSQL(crtsql)

Таким образом, код теперь становится: -

открытый класс DBHelper расширяет SQLiteOpenHelper {

public static final String DBNAME = "bmirecorder.db";
public static final int DBVESRION = 1;
public static final String TABLE_BMIRECORD = "bmirecord";
public static final String COLUMN_BMIRECORD_USERID = "record_userid";
public static final String COLUMN_BMIRECORD_DATE = "record_date";
public static final String COLUMN_BMIRECORD_BMI = "record_bmi";

public DBHelper(Context context) {
    super(context, DBNAME, null, DBVESRION);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {

    String crtsql = "CREATE TABLE IF NOT EXISTS " + TABLE_BMIRECORD +
            "(" +
            COLUMN_BMIRECORD_USERID + " INTEGER," +
    COLUMN_BMIRECORD_DATE + " TEXT DEFAULT CURRENT_TIMESTAMP," +
            COLUMN_BMIRECORD_BMI + " REAL NOT NULL" +
            ")";
    sqLiteDatabase.execSQL(crtsql);
}

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

}

}

Приведенное выше создаст базу данных, когда / если будет предпринята попытка использовать getWritableDatabase или getReadableDatabase, но не только при создании экземпляра DBHelper.

Измените вашу MainActivity

Чтобы сделать и то, и другое, вы можете изменить свой MainActivity, чтобы включить: -

    DBHelper myDBHelper = new DBHelper(this); //<<<< Creates an instance of the DBHelper
    SQLiteDatabase db = myDBHelper.getWritableDatabase(); // Invoke getWritabelFatabase to create the database

например.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    height = (EditText) findViewById(R.id.height);
    weight = (EditText) findViewById(R.id.weight);
    result = (TextView) findViewById(R.id.result);
    DBHelper myDBHelper = new DBHelper(this);
    SQLiteDatabase db = myDBHelper.getWritableDatabase();
}

При запуске приложения теперь будет создана база данных.

Как проверить, существует ли база данных

Если вы создадите новый класс с именем CommonSQLiteUtilities, а затем скопируете код из этой ссылки , а затем добавите следующую строку CommonSQLiteUtilities.logDatabaseInfo(db); согласно: -

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    height = (EditText) findViewById(R.id.height);
    weight = (EditText) findViewById(R.id.weight);
    result = (TextView) findViewById(R.id.result);
    DBHelper myDBHelper = new DBHelper(this);
    SQLiteDatabase db = myDBHelper.getWritableDatabase();
    CommonSQLiteUtilities.logDatabaseInfo(db);
}

и запустите приложение, в журнале появится следующее: -

05-10 06:07:29.002 1300-1300/bmirecorder.mybmirecorder D/SQLITE_CSU: DatabaseList Row 1 Name=main File=/data/data/bmirecorder.mybmirecorder/databases/bmirecorder.db
    Database Version = 1
05-10 06:07:29.006 1300-1300/bmirecorder.mybmirecorder D/SQLITE_CSU: Table Name = android_metadata Created Using = CREATE TABLE android_metadata (locale TEXT)
    Table = android_metadata ColumnName = locale ColumnType = TEXT Default Value = null PRIMARY KEY SEQUENCE = 0
    Table Name = bmirecord Created Using = CREATE TABLE bmirecord(record_userid INTEGER,record_date TEXT DEFAULT CURRENT_TIMESTAMP,record_bmi REAL NOT NULL)
    Table = bmirecord ColumnName = record_userid ColumnType = INTEGER Default Value = null PRIMARY KEY SEQUENCE = 0
    Table = bmirecord ColumnName = record_date ColumnType = TEXT Default Value = CURRENT_TIMESTAMP PRIMARY KEY SEQUENCE = 0
    Table = bmirecord ColumnName = record_bmi ColumnType = REAL Default Value = null PRIMARY KEY SEQUENCE = 0

Подтверждение того, что База данных существует и включает в себя таблицу bmirecord (таблицы android_metadata создаются SQLiteOpenHelper и используются для хранения локали).

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

Для этого есть несколько ресурсов.Вы можете сослаться на провайдера контента (проще, вам не нужно учитывать проблему с MVVM-архивами) или вы можете использовать область (, проверьте здесь )

...