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
반응형
댓글