Как добавить текущую дату в базу данных SQLite только после первого запуска приложения? - PullRequest
0 голосов
/ 18 июня 2019

Кто-нибудь может мне помочь?Я делаю приложение для мониторинга уровня глюкозы в крови, которое запрашивает у пользователя показания уровня глюкозы в крови во время поста, завтрака, обеда и ужина.Проблема в том, что когда я запускаю приложение, 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), который я хочу отобразить.

...