@Redry

Как добавлять данные в разные таблицы SQLite?

Пытаюсь создать небольшое приложение для учета количества рабочих часов в месяц. Для каждого месяца создается отдельная таблица с данными. Названия таблиц - месяц-год за который отвечает данная таблица. Таблица из двух столбцов: ID - день месяца, и time - часы.
Верхняя кнопка вызывает метод выбора даты. Выбранная дата указывается в виде текста на самой кнопке, так же берется значение из таблицы и выводится в качестве текста на вторую кнопку.
Нижняя кнопка вызывает окно ввода количества часов, после ввода это значение заносится в таблицу и ставится в качестве текста на самой кнопке.
spoiler
5cddc4f1f0393129959774.jpeg5cddc502c6736041430245.jpeg5cddc50ee0daa277873533.jpeg


Если выбран текущий месяц, то все работает нормально, но если я выбираю какой-либо день другого месяца, то не удается занести значение в другую таблицу, созданную для другого месяца. Никак не могу понять причину. Метод MainActivity
spoiler
public class MainActivity extends AppCompatActivity implements callDialogListener{

    final Context context = this;
    private TextView sumMonth;
    private Button btnDate;
    private Button btnHour;

    Calendar cal = Calendar.getInstance();
    private int mYear= cal.get(Calendar.YEAR);
    private int mMonth = cal.get(Calendar.MONTH) + 1;
    private int mDay = cal.get(Calendar.DAY_OF_MONTH);
    //Строка для именования таблиц " месяц.год"
    private String[] whereArgs = {getDateName(mMonth, mYear)};

    private WorkTimeDbHelper timeHelper = new WorkTimeDbHelper(this);

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

        btnDate = (Button)findViewById(R.id.btnDate);//Кнопка выбора даты
        btnHour = (Button)findViewById(R.id.btnHour);//Кнопка ввода часов
        sumMonth = (TextView)findViewById(R.id.hourSum);
        btnHour.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                callDialog();
            }
        });
        btnDate.setText("" + mDay + "." + mMonth + "." + mYear);
        btnDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                datePick();
            }
        });

        chekTable();
        btnHour.setText(Integer.toString(getTableValues(mDay,mMonth, mYear)));
    }
    //Метод для ввода количества часов
    @Override
    public void callDialog() {
        LayoutInflater inflater = LayoutInflater.from(context);
        View lay = inflater.inflate(R.layout.num_dialog, null);
        final AlertDialog.Builder numDialog = new AlertDialog.Builder(context);
        numDialog.setView(lay);
        final TextView numText = (TextView)lay.findViewById(R.id.numText);
        numDialog.setTitle("Ведите количество часов");
        numDialog.setCancelable(false);
        numDialog.setPositiveButton("OK", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int id){
                String textNum = numText.getText().toString();
                if(textNum.equals(""))textNum = "0";
                insertValue(textNum, mDay, mMonth, mYear);
                btnHour.setText("" + getTableValues(mDay,mMonth, mYear));
            }
        });
        numDialog.setNeutralButton("отмена", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        });
        numDialog.create();
        numDialog.show();
    }

    //Метод для выбора даты
    @Override
    public void datePick(){

        LayoutInflater inflater = LayoutInflater.from(context);
        View lay = inflater.inflate(R.layout.date_pick, null);
        final AlertDialog.Builder dateDialog = new AlertDialog.Builder(context);
        final CalendarView calendar = (CalendarView)lay.findViewById(R.id.calendar);
        dateDialog.setView(lay);
        calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth) {
                mYear = year;
                mMonth = month + 1;
                mDay = dayOfMonth;
                chekTable();
                btnHour.setText("" + getTableValues(mDay,mMonth, mYear));
            }
        });
        dateDialog.setCancelable(false);
        dateDialog.setPositiveButton("OK", new DialogInterface.OnClickListener(){
            @Override
            public void onClick(DialogInterface dialog, int id){
                btnDate.setText("" + mDay + "." + mMonth + "." + mYear);
            }
        });
        dateDialog.create();
        dateDialog.show();
    }
    public int getmYear(){
        return mYear;
    }
    public int getmMonth(){
        return mMonth;
    }
    public int getmDay(){
        return mDay;
    }

    //Проверить, есть ли таблица для хранения данных выбранного месяца, если таблицы нет, то создать ее
    public void chekTable(){

        SQLiteDatabase db = timeHelper.getReadableDatabase();
        String[] columns = {timeHelper.MONTH};
        String WHERE = WorkTimeDbHelper.MONTH + "=?";
        String[] Args = {getDateName(mMonth, mYear)};
        //Проверка есть ли в главной таблице запись с названием таблицы месяца
        Cursor cursor = db.query(
                WorkTimeDbHelper.MAIN_TABLE,
                columns,
                WHERE,
                Args,
                null,
                null,
                null);
        //Если запись есть, то i = 1
        int i = cursor.getCount();
        cursor.close();

        if(i == 0){
            String CREATE_TABLE = "CREATE TABLE " + Args[0] + " ("
                    +WorkTimeDbHelper._ID + " INTEGER, "
                    +WorkTimeDbHelper.TIME + " INTEGER NOT NULL DEFAULT 0 );";
            db.execSQL(CREATE_TABLE);
            int hours = 0;

            db = timeHelper.getWritableDatabase();
            ContentValues values = new ContentValues();
            for(int x = 0; x < 32; x++) {
                values.put(WorkTimeDbHelper._ID, x+1);
                values.put(WorkTimeDbHelper.TIME, hours);
                db.insert(whereArgs[0], null, values);
            }
            //Добавляет в главную таблицу название новой таблицы месяца
            ContentValues values2 = new ContentValues();
            values2.put(WorkTimeDbHelper.MONTH, Args[0]);
            db.insert(WorkTimeDbHelper.MAIN_TABLE, null, values2);
        }
    }
    //Метод создающий строку для именования таблиц "месяц.год"
    public String getDateName(int mMonth, int mYear){
        String s = "A" + Integer.toString(mMonth) + "x" + Integer.toString(mYear);
        return s;
    }
    //Метод для получения значения из нужной ячейки нужной таблицы
    //В качестве параметра принимает дату, чтобы по ней найти нужную таблицу и строку в таблице
    public int getTableValues(int day, int month, int year){
        SQLiteDatabase db = timeHelper.getReadableDatabase();
        String NAME_TABLE = getDateName(month, year);
        String colomns[] ={WorkTimeDbHelper.TIME};
        String WHERE = WorkTimeDbHelper._ID + "=?";
        String idValue[] = {Integer.toString(day)};
        Cursor cursor = db.query(
                NAME_TABLE,
                colomns,
                WHERE,
                idValue,
                null,
                null,
                null);
        int currentID = 0;
        int indexID = cursor.getColumnIndex(WorkTimeDbHelper._ID) + 1;
        if (cursor.moveToFirst()){
            do{
                currentID = cursor.getInt(indexID);
                cursor.close();
            }while (false);
        }
        return currentID;
    }
    //Метод для добавления данных в таблицу
    public void insertValue(String text, int day, int month, int year){
        int value = Integer.parseInt(text);
        SQLiteDatabase db = timeHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        String TABLE_NAME = getDateName(month, year);
        String idValue[] = {Integer.toString(day)};
        values.put(WorkTimeDbHelper.TIME, value);
        db.update(TABLE_NAME, values,
                WorkTimeDbHelper._ID + "=?", idValue);
    }
}
  • Вопрос задан
  • 143 просмотра
Пригласить эксперта
Ответы на вопрос 1
longclaps
@longclaps
Для каждого месяца создается отдельная таблица с данными.

Маразм.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы