Возможно, вам нужна дополнительная таблица, например, именованные показания, которая будет содержать ссылку на соответствующего пользователя, дату / время чтения и результат и, возможно, используемые значения.
Так что, возможно, есть: -
// 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();
}
- Сначала выполняются обычные действия, т. Е. Вызывается метод super и устанавливается макет для действия.
- Создание экземпляра класса DBHelper.
- Добавить пользователя по имени Фред с адресом электронной почты fred@fredmail.com и т. Д.
- Добавить показание, используя дату / время по умолчанию.
- Добавить чтение, используя данную дату / время.
- Показать результаты чтения
Результат
Результат от 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