본문 바로가기
App/Android Java

Android_Java(27) - SGM

by SeleniumBindingProtein 2022. 2. 14.
728x90
반응형

1. 안드르외드에서의 DataBase
    1) SQLite
        - 안드로이드와 iOS를 비롯한 많은 모바일 장치에서 사용되는 DataBase
        - SQL을 거의 완전하게 지원 
    2) SQLite에서 DataBase 구축
        - 1단계
            - DBMS 설치 (이미 설치됨)
        - 2단계
            - DB 생성
            - 데이터 입력
            - 데이터 조회, 활용
        - 3단계
            - 앱에서 구축된 데이터 활용
2. SQLite 프로그래밍
    1) SQLiteOpenHelper 클래스(상속받아 재정의)
        - 생성자 : DB 생성
        - onCreate() : 테이블 생성, 초기 데이터를 생성함
        - onUpgrade() : DB 업그레이드 함
    2) SQLiteDatabase 클래스
        - SQL문 실행 
            - execSQL() : SQL문 실행 (Insert/Update/Delete)
            - close() : DB 닫기 
            - query(), rawQuery() : Select 실행 후 커서반환
    3) Cursor 인터페이스
        - 쿼리의 조건을 만족하는 레코드들의 집합이 결과 집합(result set)임 
        - 결과 집합에서 사용자는 커서를 사용하여 한 번에 한 레코드씩 데이터에 접근가능
        - 커서 이동
            - 행번호
                move(int offset)
                moveToFirst()   : 커서의 첫 행으로 이동
                moveToNext()    : 현재 커서의 다음 행으로 이동
                moveToLast()    : 커서의 마지막 행으로 이동
            - 열번호
                getcolumnIndex()
                getcolumnCount()
                getcolumnNames()
                getCount()


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="이름 : "
            android:textSize="20dp"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/edtName"
            android:layout_weight="1"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="인원 : "
            android:textSize="20dp"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/edtNumber"
            android:layout_weight="1"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1"
        android:orientation="horizontal">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/btnInit"
            android:text="초기화"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/btnInsert"
            android:text="입력"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/btnSelect"
            android:text="조회"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/btnUpdate"
            android:text="수정"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/btnDelete"
            android:text="삭제"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="8"
        android:orientation="horizontal">

        <EditText
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/edtNameResult"
            android:background="#FF7000"
            android:padding="20dp"/>
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:id="@+id/edtNumberResult"
            android:background="#FF7000"
            android:padding="20dp"/>
    </LinearLayout>
</LinearLayout>

package kr.co.sgm;

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

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

/*
    <수정>과 <삭제> 기능을 추가하시오.
        - 수정
            - '이름'에 이름과 '인원'에 변경된 인원을 입력한 후 <수정> 클릭하면 해당 그룹이름의 인원이 변경된다.
        - 삭제
            - '이름'에 이름을 입력하고 <삭제>를 클릭하면 해당 그룹이 삭제된다.
        - <입력>, <수정>, <삭제>를 클릭하면 그 결과가 즉시 화면에 출력된다.
 */
public class MainActivity extends AppCompatActivity {
    MyDBHelper myDBHelper;
    EditText edtName, edtNumber, edtNameResult, edtNumberResult;
    Button btnInit, btnInsert, btnSelect, btnUpdate, btnDelete;
    SQLiteDatabase sqLiteDatabase;

    public class MyDBHelper extends SQLiteOpenHelper {

        public MyDBHelper(Context context) {
            super(context, "groupDB.db", null, 1);
        }

        // 데이터베이스가 처음 생성될때 호출됨
        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            //테이블 생성하는 기능
            sqLiteDatabase.execSQL("CREATE TABLE groupTB (gName CHAR(20) PRIMARY KEY, gNumber INTEGER);");
        }

        // 데이터베이스가 업그레이드될 필요가 있을 때 호출됨
        // DB 버전이 올라가면 호출됨 (기존 테이블을 삭제하고 새로 만들어줌)
        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
            // 테이블을 삭제한 후 다시 생성
            sqLiteDatabase.execSQL("DROP TABLE IF EXISTS groupTB");
            onCreate(sqLiteDatabase);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);
        setTitle("가수 그룹 관리 앱");

        edtName = findViewById(R.id.edtName);
        edtNumber = findViewById(R.id.edtNumber);
        edtNameResult =findViewById(R.id.edtNameResult);
        edtNumberResult = findViewById(R.id.edtNumberResult);

        btnInit = findViewById(R.id.btnInit);
        btnInsert = findViewById(R.id.btnInsert);
        btnSelect = findViewById(R.id.btnSelect);
        btnUpdate = findViewById(R.id.btnUpdate);
        btnDelete = findViewById(R.id.btnDelete);

        // 액티비티에서는 먼저 SQLiteOpenHelper 객체를 생성함.
        myDBHelper = new MyDBHelper(this);

        btnInit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqLiteDatabase = myDBHelper.getWritableDatabase();
                myDBHelper.onUpgrade(sqLiteDatabase, 1,2);
                sqLiteDatabase.close();
            }
        });

        btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //DB가 필요하면 호출
                //=> SQLiteDatabase 객체 반환 (DB)
                sqLiteDatabase = myDBHelper.getWritableDatabase();
                sqLiteDatabase.execSQL("INSERT INTO groupTB VALUES  ( '"
                        + edtName.getText().toString() + "', "
                        + edtNumber.getText().toString() + ");");
                sqLiteDatabase.close();
                Toast.makeText(getApplicationContext(), "데이터 입력됨", Toast.LENGTH_SHORT).show();

                btnSelect.callOnClick();    // onClickListener 이벤트 호출
            }
        });

        btnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqLiteDatabase = myDBHelper.getReadableDatabase();
                Cursor cursor;

                // 쿼리의 결과가 커서로 반환됨.
                cursor = sqLiteDatabase.rawQuery("SELECT * FROM groupTB;", null);

                String strNames = "그룹이름" +"\r\n"+ "------------------" +"\r\n";
                String strNumbers = "인원" +"\r\n"+ "---------" +"\r\n";

                while (cursor.moveToNext()) {
                    strNames += cursor.getString(0) + "\r\n";
                    strNumbers += cursor.getString(1) + "\r\n";
                }

                edtNameResult.setText(strNames);
                edtNumberResult.setText(strNumbers);

                cursor.close();
                sqLiteDatabase.close();
            }
        });

        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqLiteDatabase = myDBHelper.getWritableDatabase();
                if(edtName.getText().toString() != ""){
                    sqLiteDatabase.execSQL("DELETE FROM groupTB " +
                            "WHERE gName = '" +edtName.getText().toString()+"';");
                }
                sqLiteDatabase.close();
                Toast.makeText(getApplicationContext(), "데이터 삭제됨", Toast.LENGTH_SHORT).show();

                btnSelect.callOnClick();
            }
        });

        btnUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqLiteDatabase = myDBHelper.getWritableDatabase();
                if (edtName.getText().toString() !=""){
                    sqLiteDatabase.execSQL("UPDATE groupTB SET gNumber = "
                            + edtNumber.getText()+ " WHERE gName = '"
                            + edtName.getText().toString() +"';");
                }
                sqLiteDatabase.close();
                Toast.makeText(getApplicationContext(), "데이터 수정됨", Toast.LENGTH_SHORT).show();

                btnSelect.callOnClick();
            }
        });
    }
}

[결과 출력]

01234

728x90
반응형

'App > Android Java' 카테고리의 다른 글

Android_Java(29) - ThreadBasic  (1) 2022.02.15
Android_Java(28) - AudioPlay  (0) 2022.02.15
Android_Java(26) - GalleryApp  (0) 2022.02.14
Android_Java(25) - MyGridView  (0) 2022.02.14
Android_Java(24) - MovieCustomListView(2)  (0) 2022.02.14

댓글