본문 바로가기
Project/Android

여행 "해줘"

by 코젼 2022. 8. 26.
728x90
반응형
package com.example.tripplanner;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import androidx.annotation.Nullable;

public class BudgetSQLHelper extends SQLiteOpenHelper {
    public BudgetSQLHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // 리스트뷰 데이터 테이블 생성
        db.execSQL("CREATE TABLE budget (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "contents TEXT, price INTEGER, date TEXT);"); // id, 상품명, 가격, 날짜
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

package com.example.tripplanner;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.CalendarView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

import com.example.myapplication.R;

import java.text.SimpleDateFormat;
import java.util.Calendar;

public class BudgetActivity extends AppCompatActivity {
    public static Context mContext;
    BudgetSQLHelper mydb;
    SQLiteDatabase mdb;
    Cursor dcursor;
    Cursor mcursor;

    ListView lv;
    SimpleCursorAdapter ca;

    static final int RQCODE_INSERT = 1; // 삽입시, requestCode
    static final int RQCODE_UPDATE = 2; // 수정시, requestCode

    static int number = 0;
    String strCol[] = {"contents", "price"};
    CalendarView calendarView;
    String date;

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

        Calendar cal = Calendar.getInstance(); // 캘린더 객체를 생성한다.
        SimpleDateFormat format = new SimpleDateFormat("yyyy-M-dd");
        date = format.format(Calendar.getInstance().getTime()); // 날짜 데이터를 date 변수에 저장한다.

        mydb = new BudgetSQLHelper(this, "budget.db", null, 1); // db 생성
        mdb = mydb.getWritableDatabase();
        dcursor = mdb.rawQuery("SELECT * FROM budget WHERE date = '" + date + "'", null); // 날짜가 date인 budget 테이블에 있는 데이터를 모두 조회한다.

        lv = (ListView) findViewById(R.id.lv);
        lv.setOnItemClickListener(lis);

        // SimpleCursorAdapter
        ca = new SimpleCursorAdapter(BudgetActivity.this, android.R.layout.simple_expandable_list_item_2, dcursor, strCol, new int[]{android.R.id.text1, android.R.id.text2}, 1);
        lv.setAdapter(ca); // lv와 ca와 연결한다.

        countBudget();

        calendarView = findViewById(R.id.calendarView);
        // 캘린더뷰에 있는 날짜를 선택했을 때 이벤트 처리
        calendarView.setOnDateChangeListener(new CalendarView.OnDateChangeListener()
        {
            @Override
            public void onSelectedDayChange(@NonNull CalendarView view, int year, int month, int dayOfMonth)
            {
                lv = (ListView) findViewById(R.id.lv);
                // db에 String형태로 값을 저장한다. 년, 월, 달로 구성되어있다.
                date = year + "-" + (month+1) + "-" + dayOfMonth; // 예시) 2022-8-30
                selectDate(); // 날짜 선택 함수 호출
                countBudget(); // 총 예산 계산 함수 호출
            }
        });

        // 추가 버튼 클릭 리스너 -- insert
        findViewById(R.id.btn_add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                btnChange.button = 1; // btnChange 클래스에 있는 button 값을 1로 세팅한다.
                // Intent를 이용하여 액티비티를 전환한다.
                startActivityForResult(new Intent(BudgetActivity.this, BudgetActivity2.class), RQCODE_INSERT);
            }
        });

        mContext = this; // 다른 액티비티에서 이 액티비티에 있는 함수를 사용하기 위해 사용한다.
    }

    // 날짜 선택 함수
    public void selectDate() {
        // 날짜가 date인 budget 테이블에 있는 데이터를 모두 조회한다.
        dcursor = mdb.rawQuery("SELECT * FROM budget WHERE date = '" + date + "'", null);
        dcursor.moveToFirst(); // 커서를 첫번째로 이동시킨다.

        // SimpleCursorAdapter
        ca = new SimpleCursorAdapter(BudgetActivity.this, android.R.layout.simple_expandable_list_item_2, dcursor, strCol, new int[]{android.R.id.text1, android.R.id.text2}, 1);

        lv.setAdapter(ca); // lv와 ca와 연결한다.
        ca.notifyDataSetChanged(); // ca에 데이터가 바뀐 것을 알려준다.
    }

    // 총 예산 계산 함수
    public void countBudget() {
        // 날짜가 date인 budget 테이블에 있는 price 컬럼을 조회한다.
        mcursor = mdb.rawQuery("SELECT budget.price FROM budget WHERE date = '" + date + "'", null);
        while(mcursor.moveToNext()) { // 커서를 하나씩 다음으로 이동하면서
            number += mcursor.getInt(0); // 0번째 행에 있는 int 값을 가져와서 number 변수에 저장한다.
        }
        // id 값이 tv_budget인 TextView에 text를 수정한다.
        ( (TextView)(findViewById(R.id.tv_budget)) ).setText("총 예산 : " + number + "원");

        number = 0; // 값을 초기화한다.
    }

    // 취소 버튼 리스너 추가 필요

    // 아이템 클릭 리스너 -- update, delete
    AdapterView.OnItemClickListener lis = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            btnChange.button = 2; // btnChange 클래스에 있는 button 값을 2로 세팅한다.
            dcursor.moveToPosition(position); // 클릭한 position 위치로 커서를 이동시킨다.

            int _id = dcursor.getInt(0); // 커서의 0번째에 있는 int 값을 _id에 저장한다.
            String contents = dcursor.getString(1); // 커서의 1번째에 있는 String 값을 contents에 저장한다.
            String price = dcursor.getString(2); // 커서의 2번째에 있는 String 값을 price에 저장한다.

            // Intent를 이용하여 액티비티를 전환한다.
            Intent i = new Intent(BudgetActivity.this, BudgetActivity2.class);
            i.putExtra("_id", _id); // data가 _id이고 key값이 _id인 key값을 전달한다. -- id값
            i.putExtra("contents", contents); // data가 contents이고 key값이 contents인 key값을 전달한다. -- 상품명
            i.putExtra("price", price); // data가 price이고 key값이 price인 key값을 전달한다. -- 가격
            i.putExtra("position", position); // data가 position이고 key값이 position인 key값을 전달한다. -- 위치
            i.putExtra("date", date); // data가 date이고 key값이 date인 key값을 전달한다. -- 날짜

            startActivityForResult(i, RQCODE_UPDATE); // requesCode를 RQCODE_UPDATE로 전달한다.
        }
    };

    // 두번째 액티비티로부터 값을 전달받았을 때
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // 만약 resultCode가 RESULT_OK이고 data의 값이 null이 아니라면
        if (resultCode == RESULT_OK && data != null) {
            int id = data.getIntExtra("_id", -1); // id변수에 key값이 _id인 데이터를 가져와서 저장한다. -- id값
            String contents = data.getStringExtra("contents"); // contents변수에 key값이 contents인 데이터를 가져와서 저장한다. -- 상품명
            String price = data.getStringExtra("price"); // price변수에 key값이 price인 데이터를 가져와서 저장한다. -- 가격

            number = 0; // number 초기화

            // 만약 requestCode가 RECODE_INSERT라면
            if (requestCode == RQCODE_INSERT) {
                // 상품명(contents), 가격(price), 날짜(date) 데이터를 budget테이블에 삽입한다.
                mdb.execSQL("INSERT INTO budget VALUES (null, '" + contents + "', '" + price + "', '" + date + "');");
                countBudget(); // 총 예산 계산 함수 호출
                selectDate(); // 날짜 선택 함수 호출
                Log.i("jyeon", "추가완료");
            }
            // 만약 requestCode가 RQCODE_UPDATE라면
            else if (requestCode == RQCODE_UPDATE) {
                // budget테이블에서 _id값이 id인 경우만 상품명(contents), 가격(price), 날짜(date) 데이터를 수정한다.
                mdb.execSQL("UPDATE budget SET contents='" + contents + "', price = '" + price + "' WHERE _id=" + id + ";");
                countBudget(); // 총 예산 계산 함수 호출
                Log.i("jyeon", "수정완료");
            }
        }
    }
}

// 액티비티 전환할 때 버튼 표시 유무를 표시하기 위한 클래스를 생성한다.
class btnChange {
    public static int button = 0; // 초기는 0으로 세팅해두고, 삽입시는 1 수정시는 2로 설정한다.
}
package com.example.tripplanner;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

import com.example.myapplication.R;

public class BudgetActivity2 extends AppCompatActivity {
    EditText et_contents;
    EditText et_price;

    BudgetSQLHelper mydb;
    SQLiteDatabase mdb;
    Cursor dcursor;

    // 1. 캘린더 날짜마다 리스트가 각각 다르게 보여줄 것
    // 2. 삭제 버튼을 클릭하면 해당 아이템의 db가 삭제될 것
    // 3. 해당 날짜에 필요한 총 예산이 얼마인지 기입할 것
    // 4. 추가 버튼을 누르면 확인, 취소 버튼이 나온다.
    // 5. 아이템을 클릭하면 확인, 삭제 버튼이 나온다.
    // 6. 공백일 때, 리스트뷰에 추가되지 않도록 하기

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

        // btnChange클래스의 button 변수가 1일 경우
        if (btnChange.button == 1) {
            // id가 btn_del(삭제 버튼)인 버튼을 INVISIBLE로 설정한다.
            findViewById(R.id.btn_del).setVisibility(View.INVISIBLE);
        }
        // btnChange클래스의 button 변수가 2일 경우
        else if (btnChange.button == 2) {
            // id가 btn_cancel2(취소 버튼)인 버튼을 INVISIBLE로 설정한다.
            findViewById(R.id.btn_cancel2).setVisibility(View.INVISIBLE);
        }

        et_contents = findViewById(R.id.et_contents);
        et_price = findViewById(R.id.et_price);

        mydb = new BudgetSQLHelper(this, "budget.db", null, 1);
        mdb = mydb.getWritableDatabase();

        Intent i = getIntent();
        String contents = i.getStringExtra("contents"); // key값이 contents인 String 데이터를 contents 변수에 저장한다.
        String price = i.getStringExtra("price"); // key값이 price인 String 데이터를 price 변수에 저장한다.

        String date = i.getStringExtra("date"); // key값이 date인 String 데이터를 date 변수에 저장한다.
        // budget테이블에서 date가 date인 모든 데이터를 조회한다.
        dcursor = mdb.rawQuery("SELECT * FROM budget WHERE date = '" + date + "'", null);

        // contents값이 null이 아니고 price이 null이 아니고
        if (contents != null && price != null) {
            // contents의 길이가 0 초과이고 price의 길이가 0 초과인 경우
            if (contents.length() > 0 && price.length() > 0) {
                et_contents.setText(contents); // et_contents의 text를 contents로 설정한다.
                et_price.setText(price); // et_price의 text를 price로 설정한다.
            }
        }

        // btn_ok 버튼을 클릭했을 때의 클릭 리스너 이벤트
        findViewById(R.id.btn_ok).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = getIntent(); // Intent 생성
                String contents = et_contents.getText().toString(); // et_contents의 text를 String형으로 가져와서 contents변수에 저장한다.
                String price = et_price.getText().toString(); // et_price의 text를 String형으로 가져와서 price변수에 저장한다.

                // 만약 contents가 공백이고 price도 공백이라면
                if(contents.equals("") && price.equals("")) {
                    Log.i("jyeon", contents);
                    Log.i("jyeon", price);
                    // Toast를 통해 "데이터를 입력하세요" 텍스트를 띄운다.
                    Toast.makeText(BudgetActivity2.this, "데이터를 입력하세요.", Toast.LENGTH_SHORT).show();
                }
                else { // 그 외
                    // et_contents의 text를 String형으로 가져온 data를 key값이 contents인 key값을 보낸다.
                    i.putExtra("contents", et_contents.getText().toString());
                    // et_price의 text를 String형으로 가져온 data를 key값이 price인 key값을 보낸다.
                    i.putExtra("price", et_price.getText().toString());
                    Log.i("jyeon", contents);
                    Log.i("jyeon", price);
                    setResult(RESULT_OK, i); // RESULT_OK로 결과를 설정한다.
                    finish(); // 종료

                }
            }
        });

        // btn_cancel2(취소) 버튼을 눌렀을 때의 클릭 리스너 이벤트
        findViewById(R.id.btn_cancel2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish(); // 종료
            }
        });

        // btn_del(삭제) 버튼을 눌렀을 떄의 클릭 리스너 이벤트
        findViewById(R.id.btn_del).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent i = getIntent();
                // key값이 position인 int 데이터를 position 변수로 가져온다.
                int position = i.getIntExtra("position", -1);

                // 커서의 위치를 position으로 이동시킨다.
                dcursor.moveToPosition(position);
                int _id = dcursor.getInt(0); // 커서의 0번째 위치에 있는 int형 데이터를 _id 변수에 저장한다.
                // budget테이블에서 _id가 _id인 데이터를 삭제한다.
                mdb.execSQL("DELETE FROM budget WHERE _id = '" + _id + "';");
                // BudgetActivity의 mContext에 있는 selectDate 함수를 사용한다.
                ((BudgetActivity)BudgetActivity.mContext).selectDate();

                setResult(RESULT_OK, i); // RESULT_OK로 결과를 설정한다.
                finish(); // 종료
            }
        });
    }
}
728x90
반응형

'Project > Android' 카테고리의 다른 글

생활력 테스트  (0) 2022.08.26

댓글