Android Studio

Android Studio - SQLite_1 (가수 그룹 관리 DB 만들기)

J_Bin 2021. 3. 8. 13:06

SQLite에 INSERT, SELECT, DROP 하는 프로그램 만들기

 

 

* activity_main.xml

<?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="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="가수이름 : "></TextView>
        <EditText
            android:id="@+id/edtName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="가수이름을 입력하세요."></EditText>
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center"
            android:text="인원 : "></TextView>
        <EditText
            android:id="@+id/edtNumber"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="인원을 입력하세요."></EditText>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:id="@+id/btnInit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="3dp"
            android:layout_weight="1"
            android:text="초기화"></Button>
        <Button
            android:id="@+id/btnInsert"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="3dp"
            android:layout_weight="1"
            android:text="입력"></Button>
        <Button
            android:id="@+id/btnSelect"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="3dp"
            android:layout_weight="1"
            android:text="조회"></Button>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/etdNameResult"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"></EditText>
        <EditText
            android:id="@+id/edtNumberResult"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"></EditText>


    </LinearLayout>

</LinearLayout>

* MainActivity.java (Java 코드 1)

package com.example.sqlite_1;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

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

    // SQLiteOpenHelper 클래스를 상속받는 myDBHelper 클래스를 정의
    public class myDBHelper extends SQLiteOpenHelper{
        // 생성자 정의, "groupDB"는 새로 생성될 db의 이름, 1 : db version 처음에는 1로 지정
        public myDBHelper(Context context) {
            super(context, "groupDB", null, 1);
        }

        // 추상 메서드 오버라이딩
        @Override
        public void onCreate(SQLiteDatabase db) {

        }

        // 추상 메서드 오버라이딩
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        }
    }
}

 

* MainActivity.java (Java 코드 2)

package com.example.sqlite_1;

import androidx.appcompat.app.AppCompatActivity;

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

public class MainActivity extends AppCompatActivity {

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

    // SQLiteOpenHelper 클래스를 상속받는 myDBHelper 클래스를 정의
    public class myDBHelper extends SQLiteOpenHelper{
        // 생성자 정의, "groupDB"는 새로 생성될 db의 이름, 1 : db version 처음에는 1로 지정
        public myDBHelper(Context context) {
            super(context, "groupDB", null, 1);
        }

        // 추상 메서드 오버라이딩 - onCreate()
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 테이블 생성 쿼리 작성
            db.execSQL( "CREATE TABLE groupTBL (gName CHAR(20) PRIMARY KEY, gNumber INTEGER); ");
        }

        // 추상 메서드 오버라이딩 - onUpgrade
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 테이블 삭제 후 다시 생성하는 쿼리 (초기화 할 때 호출)
            db.execSQL( "DROP TABLE IF EXISTS groupTBL " );
            onCreate(db);

        }
    }
}

 

* MainActivity.java (Java 코드 3)

package com.example.sqlite_1;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
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 myHelper;
    EditText edtName, edtNumber, edtNameResult, edtNumberResult;
    Button btnInit, btnInsert, btnSelect;
    SQLiteDatabase sqlDB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 제목 설정
        setTitle("가수 그룹 관리 db");

        // 위젯에 접근하기위한 객체 선언
        edtName = (EditText) findViewById(R.id.edtName);
        edtNumber = (EditText) findViewById(R.id.edtNumber);
        edtNameResult = (EditText) findViewById(R.id.etdNameResult);
        edtNumberResult = (EditText) findViewById(R.id.edtNumberResult);
        btnInit = (Button) findViewById(R.id.btnInit);
        btnInsert = (Button) findViewById(R.id.btnInsert);
        btnSelect = (Button) findViewById(R.id.btnSelect);

        // myDBHelper 인스턴스 생성 > 이 때 myDBHelper()의 생성자가 실행 되면서 groupDB 파일이 생성된다.
        myHelper = new myDBHelper(this);
        // 초기화 버튼 클릭
        btnInit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getWritableDatabase();                     // groupDB를 write 전용 db로 열기
                myHelper.onUpgrade(sqlDB, 1, 2);      // onUpgrade() 메서드 호출
                sqlDB.close();
            }
        });

        // 입력 버튼 클릭
        btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getWritableDatabase();                     // groupDB를 write 전용 db로 열기
                sqlDB.execSQL( "INSERT INTO groupTBL VALUES ( '" + edtName.getText().toString() + "', " + edtNumber.getText().toString()+");");     // INSERT QUERY 작성
                sqlDB.close();
                Toast.makeText(getApplicationContext(),"입력됨", 0).show();            // 입력이 성공하면 "입력됨" 이라는 토스트 메시지가 뜸.
            }
        });



    }

    // SQLiteOpenHelper 클래스를 상속받는 myDBHelper 클래스를 정의
    public class myDBHelper extends SQLiteOpenHelper{
        // 생성자 정의, "groupDB"는 새로 생성될 db의 이름, 1 : db version 처음에는 1로 지정
        public myDBHelper(Context context) {
            super(context, "groupDB", null, 1);
        }

        // 추상 메서드 오버라이딩 - onCreate()
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 테이블 생성 쿼리 작성
            db.execSQL( "CREATE TABLE groupTBL (gName CHAR(20) PRIMARY KEY, gNumber INTEGER); ");
        }

        // 추상 메서드 오버라이딩 - onUpgrade
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 테이블 삭제 후 다시 생성하는 쿼리 (초기화 할 때 호출)
            db.execSQL( "DROP TABLE IF EXISTS groupTBL " );
            onCreate(db);

        }
    }
}

 

- 중간 실행 

 

* MainActivity.java (Java 코드 4)

package com.example.sqlite_1;

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 myHelper;
    EditText edtName, edtNumber, edtNameResult, edtNumberResult;
    Button btnInit, btnInsert, btnSelect;
    SQLiteDatabase sqlDB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 제목 설정
        setTitle("가수 그룹 관리 db");

        // 위젯에 접근하기위한 객체 선언
        edtName = (EditText) findViewById(R.id.edtName);
        edtNumber = (EditText) findViewById(R.id.edtNumber);
        edtNameResult = (EditText) findViewById(R.id.etdNameResult);
        edtNumberResult = (EditText) findViewById(R.id.edtNumberResult);
        btnInit = (Button) findViewById(R.id.btnInit);
        btnInsert = (Button) findViewById(R.id.btnInsert);
        btnSelect = (Button) findViewById(R.id.btnSelect);

        // myDBHelper 인스턴스 생성 > 이 때 myDBHelper()의 생성자가 실행 되면서 groupDB 파일이 생성된다.
        myHelper = new myDBHelper(this);
        // 초기화 버튼 클릭
        btnInit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getWritableDatabase();                     // groupDB를 write 전용 db로 열기
                myHelper.onUpgrade(sqlDB, 1, 2);      // onUpgrade() 메서드 호출
                sqlDB.close();
            }
        });

        // 입력 버튼 클릭
        btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getWritableDatabase();                     // groupDB를 write 전용 db로 열기
                sqlDB.execSQL( "INSERT INTO groupTBL VALUES ( '" + edtName.getText().toString() + "', " + edtNumber.getText().toString()+");");     // INSERT QUERY 작성
                sqlDB.close();
                Toast.makeText(getApplicationContext(),"입력됨", 0).show();            // 입력이 성공하면 "입력됨" 이라는 토스트 메시지가 뜸.
            }
        });

        // 조회 버튼 클릭
        btnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getReadableDatabase();                     // groupDB를 Read 전용 db로 열기
                Cursor cursor;                                              // Cursor 객체 생성
                cursor = sqlDB.rawQuery("SELECT * FROM groupTBL;", null);   // 모든 테이블을 조회한 후 커서 대입, 현재는 커서가 첫번째 행을 가리키고 있음

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

                // 행 데이터의 개수만큼 반복, moveToNext() 메서드는 커서 변수의 다음 행으로 넘어간다. 만약 다음행이 없다면 false를 반환하고 while문 종료
                while (cursor.moveToNext())
                {
                    strNames += cursor.getString(0) + "\r\n";       // 현재 커서의 열 번호 데이터 값을 반환하여 문자열 변수에 누적한다. 0은 0번째 column(그룹 이름 column) , 1은 1번째 column(인원 column)
                    strNumbers += cursor.getString(1) + "\r\n";
                }

                // 누적한 문자열 출력
                edtNameResult.setText(strNames);
                edtNumberResult.setText(strNumbers);

                cursor.close();
                sqlDB.close();
            }
        });



    }

    // SQLiteOpenHelper 클래스를 상속받는 myDBHelper 클래스를 정의
    public class myDBHelper extends SQLiteOpenHelper{
        // 생성자 정의, "groupDB"는 새로 생성될 db의 이름, 1 : db version 처음에는 1로 지정
        public myDBHelper(Context context) {
            super(context, "groupDB", null, 1);
        }

        // 추상 메서드 오버라이딩 - onCreate()
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 테이블 생성 쿼리 작성
            db.execSQL( "CREATE TABLE groupTBL (gName CHAR(20) PRIMARY KEY, gNumber INTEGER); ");
        }

        // 추상 메서드 오버라이딩 - onUpgrade
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 테이블 삭제 후 다시 생성하는 쿼리 (초기화 할 때 호출)
            db.execSQL( "DROP TABLE IF EXISTS groupTBL " );
            onCreate(db);

        }
    }
}

 

- 실행 화면

정상적으로 실행되는 화면을 볼 수 있다.

 

* 명령 프롬프트에서의 데이터베이스 접근

 

1. 우선 자신의 SDK 디렉토리 위치 확인하기

 

 

2. SDK 디렉토리의 platform-tools 디렉토리 접근할 것이므로 path 알아둘 것

3. 자신의 package 이름 알아둘 것 (소문자!)

4. 명령 프롬프트 실행 > 명령어 작성

 

명령어 작성 목록

1. cd 자신의 platform-tools 경로

2. adb root  (AVD가 실행되어 있어야함!)

3. adb shell

4. cd /data/data/자신의 패키지이름

5. cd databases

6. sqlite3 groupDB

7. .header on

8. .mode column

9. SELECT * FROM groupTBL;

 

 

* 최종 (삭제 및 이벤트 후 즉시 select 기능 추가)

 

package com.example.sqlite_1;

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 myHelper;
    EditText edtName, edtNumber, edtNameResult, edtNumberResult;
    Button btnInit, btnInsert, btnSelect, btnUpdate, btnDelete;
    SQLiteDatabase sqlDB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 제목 설정
        setTitle("가수 그룹 관리 db");

        // 위젯에 접근하기위한 객체 선언
        edtName = (EditText) findViewById(R.id.edtName);
        edtNumber = (EditText) findViewById(R.id.edtNumber);
        edtNameResult = (EditText) findViewById(R.id.etdNameResult);
        edtNumberResult = (EditText) findViewById(R.id.edtNumberResult);
        btnInit = (Button) findViewById(R.id.btnInit);
        btnInsert = (Button) findViewById(R.id.btnInsert);
        btnSelect = (Button) findViewById(R.id.btnSelect);
        //btnUpdate = (Button) findViewById(R.id.btnUpdate);
        btnDelete = (Button) findViewById(R.id.btnDelete);

        // myDBHelper 인스턴스 생성 > 이 때 myDBHelper()의 생성자가 실행 되면서 groupDB 파일이 생성된다.
        myHelper = new myDBHelper(this);
        // 초기화 버튼 클릭
        btnInit.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getWritableDatabase();                     // groupDB를 write 전용 db로 열기
                myHelper.onUpgrade(sqlDB, 1, 2);      // onUpgrade() 메서드 호출
                sqlDB.close();
            }
        });

        // 입력 버튼 클릭
        btnInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getWritableDatabase();                     // groupDB를 write 전용 db로 열기
                sqlDB.execSQL( "INSERT INTO groupTBL VALUES ( '" + edtName.getText().toString() + "', " + edtNumber.getText().toString()+");");     // INSERT QUERY 작성
                sqlDB.close();
                Toast.makeText(getApplicationContext(),"입력됨", 0).show();            // 입력이 성공하면 "입력됨" 이라는 토스트 메시지가 뜸.
                // 화면 즉시 보여주기
                btnSelect.callOnClick();
            }
        });

//        // 수정 버튼 클릭
//        btnUpdate.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                sqlDB = myHelper.getWritableDatabase();
//                sqlDB.execSQL(" UPDATE groupTBL SET gNumber = '" + edtNumber.getText().toString() + "' +  WHERE gName = '" + edtName.getText().toString() + "'; '");
//                sqlDB.close();
//                Toast.makeText(getApplicationContext(), "수정됨", 0).show();
//            }
//        });

        // 삭제 버튼 클릭
        btnDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getWritableDatabase();
                sqlDB.execSQL(" DELETE FROM groupTBL WHERE gName = '" + edtName.getText().toString() + "'; ");
                sqlDB.close();
                Toast.makeText(getApplicationContext(), "삭제됨", 0).show();
                // 화면 즉시 보여주기
                btnSelect.callOnClick();

            }
        });

        // 조회 버튼 클릭
        btnSelect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sqlDB = myHelper.getReadableDatabase();                     // groupDB를 Read 전용 db로 열기
                Cursor cursor;                                              // Cursor 객체 생성
                cursor = sqlDB.rawQuery("SELECT * FROM groupTBL;", null);   // 모든 테이블을 조회한 후 커서 대입, 현재는 커서가 첫번째 행을 가리키고 있음

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

                // 행 데이터의 개수만큼 반복, moveToNext() 메서드는 커서 변수의 다음 행으로 넘어간다. 만약 다음행이 없다면 false를 반환하고 while문 종료
                while (cursor.moveToNext())
                {
                    strNames += cursor.getString(0) + "\r\n";       // 현재 커서의 열 번호 데이터 값을 반환하여 문자열 변수에 누적한다. 0은 0번째 column(그룹 이름 column) , 1은 1번째 column(인원 column)
                    strNumbers += cursor.getString(1) + "\r\n";
                }

                // 누적한 문자열 출력
                edtNameResult.setText(strNames);
                edtNumberResult.setText(strNumbers);

                Toast.makeText(getApplicationContext(),"조회됨", 0).show();

                cursor.close();
                sqlDB.close();
            }
        });



    }

    // SQLiteOpenHelper 클래스를 상속받는 myDBHelper 클래스를 정의
    public class myDBHelper extends SQLiteOpenHelper{
        // 생성자 정의, "groupDB"는 새로 생성될 db의 이름, 1 : db version 처음에는 1로 지정
        public myDBHelper(Context context) {
            super(context, "groupDB", null, 1);
        }

        // 추상 메서드 오버라이딩 - onCreate()
        @Override
        public void onCreate(SQLiteDatabase db) {
            // 테이블 생성 쿼리 작성
            db.execSQL( "CREATE TABLE groupTBL (gName CHAR(20) PRIMARY KEY, gNumber INTEGER); ");
        }

        // 추상 메서드 오버라이딩 - onUpgrade
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // 테이블 삭제 후 다시 생성하는 쿼리 (초기화 할 때 호출)
            db.execSQL( "DROP TABLE IF EXISTS groupTBL " );
            onCreate(db);

        }
    }
}

 

 

'Android Studio' 카테고리의 다른 글

Android Studio - ListView  (0) 2021.03.08
Android Studio - Content Provider(통화기록 가져오기)  (0) 2021.03.08
Android Studio - Broadcast Receiver  (0) 2021.03.08
Android Studio - Thread  (0) 2021.03.08
Android Studio - Logcat  (0) 2021.03.08