Кто-нибудь может мне помочь?Я делаю приложение для мониторинга уровня глюкозы в крови, которое запрашивает у пользователя показания уровня глюкозы в крови во время поста, завтрака, обеда и ужина.Проблема в том, что когда я запускаю приложение, xml и фрагмент, который запрашивает данные, не раздуваются, а только активность хоста.Я сузил его до того, что мой список массивов (mBloods) равен нулю, потому что в моей базе данных SQLite нет данных.Мое приложение пытается начать с того, что хранится в базе данных, проблема в том, что в нем ничего нет.Как я могу добавить в него, чтобы при первом запуске приложения всегда отображалась текущая дата?
Я попытался разместить свой фрагмент ввода данных в другом действии, чтобы заставить мое приложение запускаться с этого фрагмента,но любые данные, введенные в него, не сохраняются в моей базе данных SQLite.
Код для этого возвращает нулевой список массивов:
public class BloodPagerActivity extends AppCompatActivity {
private static final String EXTRA_BLOOD_ID = "com.bignerdranch.android.bloodglucose.blood_id";
private ViewPager mViewPager;
private List<Blood> mBloods; // mBloods: size = 0
public static Intent newIntent(Context packageContext, UUID bloodId) {
Intent intent = new Intent(packageContext, BloodPagerActivity.class);
intent.putExtra(EXTRA_BLOOD_ID, bloodId);
return intent;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_blood_pager);
UUID bloodId = (UUID)getIntent().getSerializableExtra(EXTRA_BLOOD_ID);
mViewPager = (ViewPager)findViewById(R.id.blood_view_pager);
mBloods = BloodLab.get(this).getBloods();
FragmentManager fragmentManager = getSupportFragmentManager();
mViewPager.setAdapter(new FragmentStatePagerAdapter(fragmentManager) {
@Override
public Fragment getItem(int position) {
Blood blood = mBloods.get(position);
return BloodFragment.newInstance(blood.getId());
}
@Override
public int getCount() {
return mBloods.size();
}
});
for (int i =0; i < mBloods.size(); i++) {
if (mBloods.get(i).getId().equals(bloodId)) {
mViewPager.setCurrentItem(i);
break;
}
}
}
}
Мой класс помощника базы данных:
public class BloodBaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 2;
private static final String DATABASE_NAME = "bloodBase.db";
private Blood mBlood;
public static final String UUID = "uuid";
public static final String DATE = "date";
public static final String FASTING = "fasting";
public static final String BREAKFAST = "breakfast";
public static final String LUNCH = "lunch";
public static final String DINNER = "dinner";
public static final String AVERAGE = "average";
public static final String NOTES = "notes";
public static final String NORMAL = "normal";
public BloodBaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + BloodTable.NAME+ "(" +
" _id integer primary key autoincrement, " +
BloodTable.Cols.UUID + ", " +
BloodTable.Cols.NOTES + ", " +
BloodTable.Cols.DATE + ", " +
BloodTable.Cols.BREAKFAST + ", " +
BloodTable.Cols.FASTING + ", " +
BloodTable.Cols.LUNCH + ", " +
BloodTable.Cols.DINNER + ", " +
BloodTable.Cols.AVERAGE + ", " +
BloodTable.Cols.NORMAL +
")"
);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
Мой класс ввода данных, который я хочу отобразить:
public class BloodFragment extends Fragment {
private static final String ARG_BLOOD_ID = "blood_id";
private static final String DIALOG_DATE = "DialogDate";
private static final int REQUEST_DATE = 0;
private Blood mBlood;
private Button mDateButton;
private CheckBox mNormalCheckbox;
private EditText mFastingField;
private EditText mBreakfastField;
private EditText mLunchField;
private EditText mDinnerField;
private EditText mNotesField;
private Button mHistoryButton;
private Button mClearButton;
private TextView mFastingNormal;
private TextView mBreakfastNormal;
private TextView mLunchNormal;
private TextView mDinnerNormal;
private Boolean mDateIsPressed = false;
String Average;
int[] normal = {0, 0, 0, 0};
public static BloodFragment newInstance(UUID bloodId) {
Bundle args = new Bundle();
args.putSerializable(ARG_BLOOD_ID, bloodId);
BloodFragment fragment = new BloodFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.fragment_delete_blood, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.deletes_blood:
UUID bloodId = mBlood.getId();
BloodLab.get(getActivity()).deleteBlood(bloodId);
getActivity().finish();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
UUID bloodId = (UUID) getArguments().getSerializable(ARG_BLOOD_ID);
if (bloodId != null)
mBlood = BloodLab.get(getActivity()).getBlood(bloodId);
else{
if (mBlood ==null)
mBlood = new Blood();
}
}
@Override
public void onPause() {
super.onPause();
BloodLab.get(getActivity()).updateBlood(mBlood);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_blood, container, false);
mFastingField = (EditText) v.findViewById(R.id.blood_fasting);
mFastingField.setText(mBlood.getFasting());
mFastingField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//blank
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mBlood.setFasting(s.toString());
checkFasting();
calcAvg();
}
@Override
public void afterTextChanged(Editable s) {
//blank
}
});
mBreakfastField = (EditText) v.findViewById(R.id.blood_breakfast);
mBreakfastField.setText(mBlood.getBreakfast());
mBreakfastField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//blank
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mBlood.setBreakfast(s.toString());
checkBreakfast();
calcAvg();
}
@Override
public void afterTextChanged(Editable s) {
//blank
}
});
mLunchField = (EditText) v.findViewById(R.id.blood_lunch);
mLunchField.setText(mBlood.getLunch());
mLunchField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//blank
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mBlood.setLunch(s.toString());
checkLunch();
calcAvg();
}
@Override
public void afterTextChanged(Editable s) {
//blank
}
});
mDinnerField = (EditText) v.findViewById(R.id.blood_dinner);
mDinnerField.setText(mBlood.getDinner());
mDinnerField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//blank
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mBlood.setDinner(s.toString());
checkDinner();
calcAvg();
}
@Override
public void afterTextChanged(Editable s) {
//blank
}
});
mNotesField = (EditText) v.findViewById(R.id.blood_notes);
mNotesField.setText(mBlood.getNotes());
mNotesField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
//blank
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
mBlood.setNotes(s.toString());
}
@Override
public void afterTextChanged(Editable s) {
//blank
}
});
//normal, abnormal, invalid icons declaration
mFastingNormal = (TextView) v.findViewById(R.id.fastingnormal);
checkFasting();
mBreakfastNormal = (TextView) v.findViewById(R.id.breakfastnormal);
checkBreakfast();
mLunchNormal = (TextView) v.findViewById(R.id.lunchnormal);
checkLunch();
mDinnerNormal = (TextView) v.findViewById(R.id.dinnernormal);
checkDinner();
//average
calcAvg();
//sets date on button press
mDateButton = (Button) v.findViewById(R.id.blood_date);
mDateButton.setText(DateFormat.format("MMM dd, yyyy", mBlood.getDate()).toString());
mDateButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mDateIsPressed = true;
FragmentManager manager = getFragmentManager();
DatePickerFragment dialog = DatePickerFragment.newInstance(mBlood.getDate());
dialog.setTargetFragment(BloodFragment.this, REQUEST_DATE);
dialog.show(manager, DIALOG_DATE);
}
});
mNormalCheckbox = (CheckBox) v.findViewById(R.id.blood_normal);
mNormalCheckbox.setChecked(mBlood.isNormal());
mNormalCheckbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mBlood.setNormal(isChecked);
}
});
//set history button here
mHistoryButton = (Button) v.findViewById(R.id.historyButton);
mHistoryButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mDateIsPressed == false){
Toast.makeText(getActivity(), R.string.date_toast, Toast.LENGTH_SHORT).show();
}
else {
Intent i = new Intent(getActivity(), BloodListActivity.class);
startActivity(i);
}
}
});
//set clear button here
mClearButton = (Button) v.findViewById(R.id.resetButton);
mClearButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clearAll();
}
});
return v;
}
//Calculate average
public void calcAvg() {
String invalid_avg;
if (mFastingField.getText().length() < 1) {
invalid_avg = "Invalid Data";
mBlood.setAverage(invalid_avg);
} else if (mBreakfastField.getText().length() <= 0) {
invalid_avg = "Invalid Data";
mBlood.setAverage(invalid_avg);
} else if (mLunchField.getText().length() <= 0) {
invalid_avg = "Invalid Data";
mBlood.setAverage(invalid_avg);
} else if (mDinnerField.getText().length() <= 0) {
invalid_avg = "Invalid Data";
mBlood.setAverage(invalid_avg);
} else {
String fastString = mFastingField.getText().toString();
String breakString = mBreakfastField.getText().toString();
String lunchString = mLunchField.getText().toString();
String dinnerString = mDinnerField.getText().toString();
int fasting = Integer.parseInt(fastString);
int breakfast = Integer.parseInt(breakString);
int lunch = Integer.parseInt(lunchString);
int dinner = Integer.parseInt(dinnerString);
int avg = (fasting + breakfast + lunch + dinner) / 4;
Average = ("" + avg);
mBlood.setAverage(Average);
}
}
public void clearAll() {
mFastingField.setText("");
mBreakfastField.setText("");
mLunchField.setText("");
mDinnerField.setText("");
mNotesField.setText("");
mNormalCheckbox.setChecked(false);
}
public void checkFasting() {
if (mFastingField.getText().length() > 0) {
String fastString = mFastingField.getText().toString();
int fasting = Integer.parseInt(fastString);
//check fasting
if (fasting < 70 || fasting > 99) {
normal[3] = 0;
} else if (fasting >= 70 && fasting <= 99) {
normal[3] = 1;
}
//change fasting icons
if (normal[3] == 1) {
mFastingNormal.setText(R.string.normal);
} else if (normal[3] == 0) {
mFastingNormal.setText(R.string.abnormal);
}
} else {
normal[3] = 0;
mFastingNormal.setText(R.string.invalid);
}
}
public void checkBreakfast() {
if (mBreakfastField.getText().length() > 0) {
String fastString = mBreakfastField.getText().toString();
int Breakfast = Integer.parseInt(fastString);
//check Breakfast
if (Breakfast < 70 || Breakfast > 140) {
normal[3] = 0;
} else if (Breakfast >= 70 && Breakfast <= 140) {
normal[3] = 1;
}
//change Breakfast icons
if (normal[3] == 1) {
mBreakfastNormal.setText(R.string.normal);
} else if (normal[3] == 0) {
mBreakfastNormal.setText(R.string.abnormal);
}
} else {
normal[3] = 0;
mBreakfastNormal.setText(R.string.invalid);
}
}
public void checkLunch() {
if (mLunchField.getText().length() > 0) {
String fastString = mLunchField.getText().toString();
int Lunch = Integer.parseInt(fastString);
//check Lunch
if (Lunch < 70 || Lunch > 140) {
normal[3] = 0;
} else if (Lunch >= 70 && Lunch <= 140) {
normal[3] = 1;
}
//change Lunch icons
if (normal[3] == 1) {
mLunchNormal.setText(R.string.normal);
} else if (normal[3] == 0) {
mLunchNormal.setText(R.string.abnormal);
}
} else {
normal[3] = 0;
mLunchNormal.setText(R.string.invalid);
}
}
public void checkDinner() {
if (mDinnerField.getText().length() > 0) {
String fastString = mDinnerField.getText().toString();
int Dinner = Integer.parseInt(fastString);
//check Dinner
if (Dinner < 70 || Dinner > 140) {
normal[3] = 0;
} else if (Dinner >= 70 && Dinner <= 140) {
normal[3] = 1;
}
//change Dinner icons
if (normal[3] == 1) {
mDinnerNormal.setText(R.string.normal);
} else if (normal[3] == 0) {
mDinnerNormal.setText(R.string.abnormal);
}
} else {
normal[3] = 0;
mDinnerNormal.setText(R.string.invalid);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != Activity.RESULT_OK) {
return;
}
if (requestCode == REQUEST_DATE) {
Date date = (Date) data.getSerializableExtra(DatePickerFragment.EXTRA_DATE);
mBlood.setDate(date);
updateDate();
}
}
private void updateDate() {
mDateButton.setText(DateFormat.format("MMM dd, yyyy", mBlood.getDate()).toString());
}
}
Мой лабораторный класс:
public class BloodLab {
private static BloodLab sBloodLab;
private Context mContext;
private SQLiteDatabase mDatabase;
private List<Blood> mBloods;
public static BloodLab get(Context context) {
if (sBloodLab == null) {
sBloodLab = new BloodLab(context);
}
return sBloodLab;
}
private BloodLab(Context context) {
mContext = context.getApplicationContext();
mDatabase = new BloodBaseHelper(mContext).getWritableDatabase();
}
public void addBlood(Blood c) {
ContentValues values = getContentValues(c);
Long dateString = c.getDate().getTime() - (c.getDate().getTime() % 100000);
String date = "" + dateString;
mDatabase.insert(BloodTable.NAME, null, values);
}
public void deleteBlood(UUID crimeId)
{
String uuidString = crimeId.toString();
mDatabase.delete(BloodTable.NAME, BloodTable.Cols.UUID + " = ?", new String[] {uuidString});
}
public List<Blood> getBloods() {
List<Blood> bloods = new ArrayList<>();
BloodCursorWrapper cursor = queryBloods(null, null);
try {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
bloods.add(cursor.getBlood());
cursor.moveToNext();
}
} finally {
cursor.close();
}
return bloods;
}
public Blood getBlood(UUID id) {
BloodCursorWrapper cursor = queryBloods(
BloodTable.Cols.UUID + " = ?",
new String[]{id.toString()}
);
try {
if (cursor.getCount() == 0) {
return null;
}
cursor.moveToFirst();
return cursor.getBlood();
} finally {
cursor.close();
}
}
public void updateBlood(Blood blood) {
String uuidString = blood.getId().toString();
ContentValues values = getContentValues(blood);
mDatabase.update(BloodTable.NAME, values, BloodTable.Cols.UUID + " = ?", new String[]{uuidString});
}
private BloodCursorWrapper queryBloods(String whereClause, String[] whereArgs) {
Cursor cursor = mDatabase.query(
true,
BloodTable.NAME,
null,
whereClause,
whereArgs,
BloodTable.Cols.DATE,
null,
BloodTable.Cols.DATE + " DESC",
null
);
return new BloodCursorWrapper(cursor);
}
private static ContentValues getContentValues(Blood blood) {
ContentValues values = new ContentValues();
values.put(BloodTable.Cols.UUID, blood.getId().toString());
values.put(BloodTable.Cols.DATE, blood.getDate().getTime() - (blood.getDate().getTime() % 100000));
values.put(BloodTable.Cols.FASTING, blood.getFasting());
values.put(BloodTable.Cols.BREAKFAST, blood.getBreakfast());
values.put(BloodTable.Cols.LUNCH, blood.getLunch());
values.put(BloodTable.Cols.DINNER, blood.getDinner());
values.put(BloodTable.Cols.AVERAGE, blood.getAverage());
values.put(BloodTable.Cols.NOTES, blood.getNotes());
values.put(BloodTable.Cols.NORMAL, blood.isNormal() ? 1 : 0);
return values;
}
}
Когда я запускаю свой код, мой эмулятор Android отображает только мой макет хоста .xml и возвращаетс "mBloods: size = 0", а не с интерфейсом ввода данных (фрагмент_blood.xml), который я хочу отобразить.