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

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

public double doCalories(boolean fem, boolean male, double age, double weight, double feet, double inches){

    DisplayDateTime = (TextView)findViewById(R.id.date_test);
    calander = Calendar.getInstance();
    simpledateformat = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
    Date = simpledateformat.format(calander.getTime());
    DisplayDateTime.setText(Date);


    double bmrResult = 0;
    double height_in_inches;

    if (MainActivity.unit_is_gram){
        weight = weight * 2.2;
    }

    if (MainActivity.unit_is_meter){
        height_in_inches = 0.39370* inches; //actually is 0.39370 * centimeters
    }

    else height_in_inches = (feet*12)+inches;

    if (fem == true) {

        bmrResult = 10*(weight/2.2)+6.25*(height_in_inches*2.54)-5*age-161;
    }

    else if (male == true){


        bmrResult = 10*(weight/2.2)+6.25*(height_in_inches*2.54)-5*age+5;
    }



    return bmrResult;
}

Код для базы данных пользователей в базе данных Activity:

private static final String DATABASE_NAME = "UserManager.db";

// User table name
private static final String TABLE_USER = "user";

// User Table Columns names
private static final String COLUMN_USER_ID = "user_id";
private static final String COLUMN_USER_NAME = "user_name";
private static final String COLUMN_USER_EMAIL = "user_email";
private static final String COLUMN_USER_PASSWORD = "user_password";


// create table sql query
private String CREATE_USER_TABLE = "CREATE TABLE " + TABLE_USER + "("
        + COLUMN_USER_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + COLUMN_USER_NAME + " TEXT,"
        + COLUMN_USER_EMAIL + " TEXT," + COLUMN_USER_PASSWORD + " TEXT" + ")";

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

1 Ответ

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

Возможно, вам нужна дополнительная таблица, например, именованные показания, которая будет содержать ссылку на соответствующего пользователя, дату / время чтения и результат и, возможно, используемые значения.

Так что, возможно, есть: -

// Reading Table name
private static final String TABLE_READING = "reading";

//Reading Table Column Names
private static final String COLUMN_READING_USERREFERENCE = "reading_user_reference";
private static final String COLUMN_READING_DATETIME = "reading_datetime";
private static final String COLUMN_READING_AGE = "reading_age"; //<<< shouldn't really be needed as Age could be calculated if date of birth were stored in g user_table
private static final String COLUMN_READING_WEIGHT = "reading_weight";
private static final String COLUMN_READING_HEIGHT_FEET = "reading_height_feet";
private static final String COLUMN_READING_HEIGHT_INCHES = "reading_height_inches";
private static final String COLUMN_READING_RESULT = "reading_calories"; //<<< could do without

//Create Reading Table SQL
private static final String CREATE_READING_TABLE =
        "CREATE TABLE IF NOT EXISTS " + TABLE_READING +
                "(" +
                COLUMN_READING_USERREFERENCE + " INTEGER NOT NULL, " +
                COLUMN_READING_DATETIME + " TEXT DEFAULT CURRENT_TIMESTAMP, " +
                COLUMN_READING_AGE + " REAL," +
                COLUMN_READING_WEIGHT + " REAL," +
                COLUMN_READING_HEIGHT_FEET + " INTEGER," +
                COLUMN_READING_HEIGHT_INCHES + " INTEGER," +
                COLUMN_READING_RESULT + " REAL" +
                ")";

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

//Add using specific timestamp
public long addReading(
        long user,
        long timestamp,
        double age,
        double weight,
        double height_feet,
        double height_inches,
        double result) {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
    Date date = new Date(timestamp * 1000);
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    cv.put(COLUMN_READING_USERREFERENCE,user);
    if (timestamp != 0) {
        cv.put(COLUMN_READING_DATETIME,sdf.format(date));
    }
    cv.put(COLUMN_READING_AGE,age);
    cv.put(COLUMN_READING_WEIGHT,weight);
    cv.put(COLUMN_READING_HEIGHT_FEET,(int) height_feet);
    cv.put(COLUMN_READING_HEIGHT_INCHES,(int) height_inches);
    cv.put(COLUMN_READING_RESULT,result);
    return db.insert(TABLE_READING,null,cv);
}

//Add user timestamp deault i.e. date/time now
public long addReading(long user,
                       double age,
                       double weight,
                       double height_feet,
                       double height_inches,
                       double result) {
    return addReading(user,0,
            age,
            weight,
            height_feet,
            height_inches,
            result
    );
}
  • Примечание , как подпись похожа на ваш doCalories метод.

Вот пример метода, который будет возвращать результаты вместе с данными пользователя: -

public Cursor getAllResultsWithUserDetails() {
    String[] columns_to_include_in_cursor = new String[]{
            COLUMN_USER_ID,
            COLUMN_USER_NAME,
            COLUMN_USER_EMAIL,
            "datetime(" + COLUMN_READING_DATETIME + ") AS reading_taken",
            COLUMN_READING_WEIGHT,
            COLUMN_READING_HEIGHT_FEET + "||'feet '||" + COLUMN_READING_HEIGHT_INCHES+"||'inches' AS height",
            COLUMN_READING_RESULT
    };
    return this.getWritableDatabase().query(
            TABLE_READING +
                    " JOIN " +
                    TABLE_USER +
                    " ON " +
                    TABLE_USER + "." +  COLUMN_USER_ID +
                    " = " +
                    TABLE_READING + "." + COLUMN_READING_USERREFERENCE,
            columns_to_include_in_cursor,
            null,
            null,
            null,
            null,
            COLUMN_READING_DATETIME + " DESC"
    );
}

Примечания

  • Результирующий (эквивалентный) SQL будет:
    • SELECT user_id, user_name, user_email, datetime(reading_datetime) AS reading_taken, reading_weight, reading_height_feet||'feet' ||reading_height_inches||'inches' AS height, reading_calories FROM reading JOIN user ON user.user_id = reading.reading_user_reference ORDER BY reading_datetime DESC

Вот дополнительный метод, который будет отображать результаты (т. Е. Он использует метод getAllResultsWithUserDetails) в журнале: -

public void logAllResults() {
    Cursor csr = getAllResultsWithUserDetails();
    while (csr.moveToNext()) {
        Log.d("RESULTS",
                "Name = " + csr.getString(csr.getColumnIndex(COLUMN_USER_NAME)) +
                        " (id=" +
                        String.valueOf(csr.getLong(csr.getColumnIndex(COLUMN_USER_ID))) + ") " +
                        "\n\tDate/Time of Reading = " +
                        csr.getString(csr.getColumnIndex("reading_taken")) +
                        "\n\tWeight = " +
                        csr.getString(csr.getColumnIndex(COLUMN_READING_WEIGHT)) +
                        "\n\tHeight = " +
                        csr.getString(csr.getColumnIndex("height")) +
                        "\n\tCalories = " +
                        csr.getString(csr.getColumnIndex(COLUMN_READING_RESULT))
                );
    }
    csr.close();
}

Собираем это вместе для демонстрации (приведенный выше код находится в DBHelper (то есть подклассе SQLiteOpenHelper) с именем DBHelper), и в упражнении содержится следующее: -

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

    DBHelper dbhlpr = new DBHelper(this);
    dbhlpr.addUser(
            "Fred",
            "fred@fredmail.com","" +
                    "fredspassword"
    );
    dbhlpr.addReading(1,23,65.7,6,2,4567.78);
    // Add with specific date time (2018-04-30 12:45:00)
    dbhlpr.addReading(1,1525092300, 23,68.2,6,1,5678.67);
    dbhlpr.logAllResults();
}
  1. Сначала выполняются обычные действия, т. Е. Вызывается метод super и устанавливается макет для действия.
  2. Создание экземпляра класса DBHelper.
  3. Добавить пользователя по имени Фред с адресом электронной почты fred@fredmail.com и т. Д.
  4. Добавить показание, используя дату / время по умолчанию.
  5. Добавить чтение, используя данную дату / время.
  6. Показать результаты чтения

Результат

Результат от logAllresults: -

05-09 01:41:37.878 2092-2092/fred.caloriecalc D/RESULTS: Name = Fred (id=1) 
      Date/Time of Reading = 2018-05-09 01:41:37
      Weight = 65.7
      Height = 6feet 2inches
      Calories = 4567.78
    Name = Fred (id=1) 
      Date/Time of Reading = 2018-04-30 12:45:00
      Weight = 68.2
      Height = 6feet 1inches
      Calories = 5678.67
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...