본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-06-06안드로이드 스튜디오 (SQLite 사용하기 2)

반응형

헬퍼 클래스 

@SQLiteOpenHelper 클래스 

유지 보수가 더 좋기 때문에 SQLiteDatabase 보다 자주 사용이 된다. 

인스턴스를 생성해주어야 사용이 가능하다 .

 

@public SQLiteOpenHelper (Context context , String name , SQLiteDatabase.CursorFactory factory, int version)

인스턴스 생성시 전달해야하는 값인데 (1 컨택스트 , 2 db이름 , 3 커서 팩토리 (그냥 null로 씀) , 4,임의로 만들어준 버전

 

@ 인스턴스 생성을 하면 자동으로 콜백이 되는 메소드들 ( 보통 데이터베이스는 생성자로 생성됨) 

onCreat  -> 생성 될때 딱 한번만 호출 되고 호출후 onOpen호출함 

onOpen -> 다시 실행했을때 실행됨 

onUpgrade -> 버전이 변경되면 실행되는 메소드 호출후  onOpen호출함

 

사실 처음 안드로이드에서 사용했던것에서 헬퍼만 추가된것이라 실습한 코드를 보면서 이해하자

 

public class MainActivity extends AppCompatActivity {

    EditText edt_name, edt_num, edt_name_txt, edt_num_txt;
    boolean isDB_Creat = false;
    int version = 1;
    SQLiteOpenHelper helper; // SQLiteOpenHelper 만들어주기
    SQLiteDatabase db; // SQLiteDatabase 만들어주기
    String db_name = "sing";
    String tb_name = "boy_group";

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

        edt_name = findViewById(R.id.edt_name);
        edt_name_txt = findViewById(R.id.edt_name_txt);
        edt_num = findViewById(R.id.edt_num);
        edt_num_txt = findViewById(R.id.edt_num_txt);

        Button btn_recycle = findViewById(R.id.btn_recycle);
        Button btn_add = findViewById(R.id.btn_add);
        Button btn_change = findViewById(R.id.btn_change);
        Button btn_del = findViewById(R.id.btn_del);
        Button btn_search = findViewById(R.id.btn_search);

        edt_name_txt.setText("그룹이름");
        edt_num_txt.setText("인원수");
        createhelper(); //헬퍼 생성 메소드 호출

        //초기
        btn_recycle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            //테이블 없애주기
            db.execSQL("DROP TABLE "+tb_name);
            //테이블 생성
            db.execSQL("CREATE TABLE IF NOT EXISTS "+ tb_name +"(name char(10), num INTEGER )");
            Toast.makeText(getApplicationContext(),"기존 테이블 삭제하고 초기화 하였습니다." , Toast.LENGTH_LONG).show();
            edt_name_txt.setText("그룹이름");
            edt_num_txt.setText("인원수");



            }
        });

        //입력
        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //입력하기위한 sql문 작성
                db.execSQL("INSERT INTO " + tb_name + "(name , num) VAlUES ('"+ edt_getname() + "',"+edt_getnum()+")");
                Toast.makeText(getApplicationContext(),"데이터 입력하였습니다." , Toast.LENGTH_LONG).show();
                btn_search.callOnClick(); // 해당 버튼 호출 메서드 해당 버튼 누른거랑 동일한 효과

            }
        });

        //수정
        btn_change.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //수정을 위한 sql문
                db.execSQL("UPDATE "+tb_name+" SET num = "+edt_getnum()+" WHERE name = '"+edt_getname()+"'" );
                Toast.makeText(getApplicationContext(),"데이터 수정하였습니다." , Toast.LENGTH_LONG).show();
                btn_search.callOnClick();
            }
        });

        //삭제
        btn_del.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              // 삭제를 위한 sql문
              db.execSQL("DELETE FROM "+tb_name+" WHERE name ='"+edt_getname()+"'");
                Toast.makeText(getApplicationContext(),"데이터 삭제하였습니다." , Toast.LENGTH_LONG).show();
                btn_search.callOnClick();
            }
        });

        //조회
        btn_search.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                edt_name_txt.setText("그룹이름");
                edt_num_txt.setText("인원수");
                //쿼리문 만들어 담아주고
                String query = "SELECT * FROM "+tb_name ;
                //출력을 위한 커서
                Cursor cursor = db.rawQuery(query,null);

                //여기서 cursor == null 이렇게 작성해도 데이터가 없으면 null로 잡힌다.
                //커서의 크기 가져오기
                int count = cursor.getCount();

                for (int i = 0 ; i < count ;i++) {
                    cursor.moveToNext(); //커서 이동
                    String name = cursor.getString(0);
                    int num = cursor.getInt(1);

                    printname(name);
                    printnum(num);
                }

            }
        });
    }
    //에디트 텍스트에서 받아오는 메소드
    public String edt_getname(){
        String name = edt_name.getText().toString();
        return name;
    }
    public int edt_getnum(){
        int gorupnum = Integer.parseInt(edt_num.getText().toString());
        return gorupnum;
    }

    //데이터베이스 생성 메소드
    public boolean createhelper () {
        helper = new DatabaseHelper(this); //헬퍼 인스턴스화
        db= helper.getWritableDatabase(); //작성을 위한 데이터 베이스 설정
        return true;
    }


    //이름 출력 메소드
    public void printname(String msg) {
        edt_name_txt.append("\n" + msg);
    }


    //번호 출력 메소드
    public void printnum(int msg) {
        edt_num_txt.append("\n" + msg);
    }


    //헬퍼 클래스
    class DatabaseHelper extends SQLiteOpenHelper {

        public DatabaseHelper(@Nullable Context context) {
            //여기서 데이터베이스 생성한다  
            super(context, db_name , null, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            //테이블 생성
            db.execSQL("CREATE TABLE IF NOT EXISTS "+ tb_name +"(name char(10),num INTEGER )");
        }


        @Override //버전이 달라지면 자동호출 메소드 
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}

 

 


파일 입출력에서 해봤었던 일기장 어플리케이션 데이터 베이스로 만들어보기 

 

public class MainActivity extends AppCompatActivity {
    EditText editText;
    DatePicker datePicker;
    SQLiteOpenHelper dbhelfer; //헬퍼 달아주기
    SQLiteDatabase db; // 데이터 베이스 만들어주기
    String db_name = "diarydb";
    String tb_name = "diarytb";
    int version = 1;
    String con;
    boolean is_have = false;

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

        editText = findViewById(R.id.editText);
        Button button = findViewById(R.id.button);
        datePicker = findViewById(R.id.datePicker);

        dbhelfer = new DatabaseHelper(this);
        db = dbhelfer.getWritableDatabase();

        Calendar cal = Calendar.getInstance();

        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH);
        int day = cal.get(Calendar.DAY_OF_MONTH);
        try{ // 트라이 캐치문으로 해본것
            con = Integer.toString(year)+Integer.toString(month+1)+Integer.toString(day);
            String query = "SELECT content From "+tb_name+" where diaryDate = '"+con+"'";
            Cursor cursor = db.rawQuery(query,null);
            cursor.moveToNext();
            String a = cursor.getString(0);
            editText.setText(a);
            Toast.makeText(getApplicationContext(),year+"년"+(month+1)+"월"+day+"일 일기를 불러왔습니다.",Toast.LENGTH_LONG).show();
            button.setText("수정하기");
            is_have = true;

        }catch (CursorIndexOutOfBoundsException c){
            editText.setText("데이터 없음");
            is_have = false;
        }

        // 다시 확인해봐야함 if 문으로 제어가 안된다.... 
//        con = Integer.toString(year) + Integer.toString(month + 1) + Integer.toString(day);
//        String query = "SELECT content From " + tb_name + " where diaryDate = '" + con + "'";
//        Cursor cursor = db.rawQuery(query, null);
//        cursor.moveToNext();
//        if (cursor == null) {
//            editText.setText("데이터 없음");
//            is_have = false;
//        } else if (cursor != null){
//            String a = cursor.getString(0);
//            editText.setText(a);
//            Toast.makeText(getApplicationContext(), year + "년" + (month + 1) + "월" + day + "일 일기를 불러왔습니다.", Toast.LENGTH_LONG).show();
//            button.setText("수정하기");
//            is_have = true;
//        }

        datePicker.init(year, month, day, new DatePicker.OnDateChangedListener() {
            @Override
            public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                try {
                    con = Integer.toString(year) + Integer.toString(monthOfYear + 1) + Integer.toString(dayOfMonth);
                    String query = "SELECT content From " + tb_name + " where diaryDate = '" + con + "'";
                    Cursor cursor = db.rawQuery(query, null);
                    cursor.moveToNext();
                    String a = cursor.getString(0);
                    editText.setText(a);
                    button.setText("수정하기");
                    is_have = true;
                } catch (CursorIndexOutOfBoundsException c) {
                    editText.setText("데이터 없음");
                    button.setText("저장하기");
                    is_have = false;
                }

            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (is_have) {
                    String a = editText.getText().toString();
                    db.execSQL("UPDATE " + tb_name + " SET content = '" + a + "' WHERE diaryDate = '" + con + "'");
                    String query = "SELECT content From " + tb_name + " where diaryDate = '" + con + "'";
                    Cursor cursor = db.rawQuery(query, null);
                    cursor.moveToNext();
                    String b = cursor.getString(0);
                    editText.setText(b);
                    Toast.makeText(getApplicationContext(), con + "에 일기를 수정했습니다. ", Toast.LENGTH_LONG).show();
                } else {
                    String content_Diary = editText.getText().toString();
                    db.execSQL("INSERT INTO " + tb_name + "(diaryDate, content) VALUES ('" + con + "','" + content_Diary + "')");
                    Toast.makeText(getApplicationContext(), con + "에 일기를 저장했습니다. ", Toast.LENGTH_LONG).show();
                    button.setText("수정하기");
                }
            }
        });


    }

    class DatabaseHelper extends SQLiteOpenHelper {

        public DatabaseHelper(@Nullable Context context) {
            super(context, db_name, null, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL("CREATE TABLE IF NOT EXISTS " + tb_name + "(diaryDate char(10),content VARCHAR(50) )");
        }


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

        }

    }

}

 

 

 

반응형