드레:
코딩 뿌시기
드레:
전체 방문자
오늘
어제
  • 분류 전체보기 (268)
    • Python (74)
      • Python 기초 (42)
      • Numpy (8)
      • Pandas (22)
    • Machine Learning (31)
      • Machine Learning (1)
      • Deep Learning (27)
    • AWS (22)
      • RDS (3)
      • EC2 (9)
      • Lambda (8)
      • S3 (2)
    • MySQL (24)
    • Git (8)
    • Streamlit (12)
    • REST API (22)
    • Java (24)
    • Android (36)
    • Debugging (15)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Transfer Learning
  • Lambda
  • JWT
  • aws s3
  • Retrofit2
  • AWS Lambda
  • CNN
  • tensorflow
  • serverless
  • 서버리스
  • Java
  • 액션바
  • 딥러닝
  • fine tuning
  • EC2
  • Callback
  • Ann
  • Python
  • volley
  • AWS
  • rest api
  • flask
  • API
  • 안드로이드 스튜디오
  • Streamlit
  • 네이버 API
  • github
  • 깃이그노어
  • pandas
  • GET

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
드레:

코딩 뿌시기

Android Studio - SQLite3 데이터베이스 활용하기
Android

Android Studio - SQLite3 데이터베이스 활용하기

2023. 1. 31. 18:25

1. SQLiteOpenHelper

  • SQLite 데이터베이스 생성 및 버전 관리를 도와주는 클래스
  • SQLiteOpenHelper 클래스를 상속 받아 SQLite를 편리하게 제어 할 수 있다.

 

 

2. SQLiteOpenHelper 상속

  • SQLiteOpenHelper 는 추상클래스이기 때문에 상속 받은 후, onCreate와 onUpgrade 메서드를 반드시 구현해야 한다.
public class DatabaseHandler extends SQLiteOpenHelper {

    public DatabaseHandler(@Nullable Context context) {
        super(context, Util.DB_NAME, null, Util.DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // 테이블 생성
        String CREATE_CONTACT_TABLE =
                "create table contact ( id integer primary key, name text, phone text )";

        sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        // 기존의 테이블을 삭제하고, 새 테이블을 다시 만든다.

        String DROP_TABLE = "drop table contact";

        sqLiteDatabase.execSQL(DROP_TABLE);
//        sqLiteDatabase.execSQL(DROP_TABLE, new String[]{Util.DB_NAME});

        onCreate(sqLiteDatabase);
    }

 

상수를 관리하는 Util 클래스

public class Util {

    // 데이터베이스 관련 상수들
    public static final int DB_VERSION = 1;
    public static final String DB_NAME = "contact_db";
    public static final String TABLE_NAME = "contact";

    // 테이블의 컬럼 관련 상수들
    public static final String KEY_ID = "id";
    public static final String KEY_NAME = "name";
    public static final String KEY_PHONE = "phone";

}

 

 

 

3. 추가 메소드 정의

  • 새로운 메소드를 정의하여 다양한 DB 관리 기능을 구현 할 수 있다(CRUD)
  • 연락처를 추가, 조회하는 메소드 구현
    // 이제부터는 우리가 앱 동작시키는데 필요한
    // CRUD 관련된 SQL문이 들어간 메소드를 만들면 된다.

    // 1. 연락처 추가하는 메소드
    public void addContact(Contact contact){
        // 1) 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getWritableDatabase();

        // 2) 저장가능한 형식으로 만들어준다.
        ContentValues values = new ContentValues();
        values.put(Util.KEY_NAME, contact.name);
        values.put(Util.KEY_PHONE, contact.phone);

        // 3) insert 한다.
        db.insert(Util.TABLE_NAME, null, values);

        // 4) db 사용이 끝나면, 닫아준다.
        db.close();

    }

    // 2. 저장된 연락처를 모두 가져오는 메소드
    public ArrayList<Contact> getAllContacts(){

        // 1) 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getReadableDatabase();

        // 2) 쿼리문 만든다.
        String query = "select * from contact";

        // 3) 쿼리문을 실행하여, 커서로 받는다.
        Cursor cursor = db.rawQuery(query, null);

        // 3-1) 여러 데이터를 저장할 어레이리스트 만든다.
        ArrayList<Contact> contactArrayList = new ArrayList<>();

        // 4) 커서에서 데이터를 뽑아낸다.
        if (cursor.moveToFirst()){
            do{
                int id = cursor.getInt(0);
                String name = cursor.getString(1);
                String phone = cursor.getString(2);

                Log.i("Contact_TABLE", id+", "+name+", "+phone);

                // 이 데이터를, 화면에 표시하기 위해서는
                // 메모리에 전부 다 남아있어야 한다!!!

                Contact contact = new Contact(id, name, phone);
                contactArrayList.add(contact);

            } while (cursor.moveToNext());
        }

        // 5) DB 닫기
        db.close();

        // 6) DB에서 읽어온 연락처 정보를 리턴해야 한다.
        return contactArrayList;

    }

 

 

 

4. 전체 코드

 

상수를 관리하는 Util 클래스

public class Util {

    // 데이터베이스 관련 상수들
    public static final int DB_VERSION = 1;
    public static final String DB_NAME = "contact_db";
    public static final String TABLE_NAME = "contact";

    // 테이블의 컬럼 관련 상수들
    public static final String KEY_ID = "id";
    public static final String KEY_NAME = "name";
    public static final String KEY_PHONE = "phone";

}

 

연락처 정보를 관리하는 Contact 클래스

public class Contact {

    public int id;
    public String name;
    public String phone;

    public Contact(){

    }
    public Contact(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    public Contact(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }
}

 

SQLite를 조작하는DatabaseHandler 클래스

package com.reodinas2.contactapp.data;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

import androidx.annotation.Nullable;

import com.reodinas2.contactapp.model.Contact;
import com.reodinas2.contactapp.util.Util;

import java.util.ArrayList;

public class DatabaseHandler extends SQLiteOpenHelper {

    public DatabaseHandler(@Nullable Context context) {
        super(context, Util.DB_NAME, null, Util.DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // 테이블 생성
        String CREATE_CONTACT_TABLE =
                "create table contact ( id integer primary key, name text, phone text )";

        sqLiteDatabase.execSQL(CREATE_CONTACT_TABLE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        // 기존의 테이블을 삭제하고, 새 테이블을 다시 만든다.

        String DROP_TABLE = "drop table contact";

        sqLiteDatabase.execSQL(DROP_TABLE);
//        sqLiteDatabase.execSQL(DROP_TABLE, new String[]{Util.DB_NAME});

        onCreate(sqLiteDatabase);
    }

    // 이제부터는 우리가 앱 동작시키는데 필요한
    // CRUD 관련된 SQL문이 들어간 메소드를 만들면 된다.

    // 1. 연락처 추가하는 메소드
    public void addContact(Contact contact){
        // 1) 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getWritableDatabase();

        // 2) 저장가능한 형식으로 만들어준다.
        ContentValues values = new ContentValues();
        values.put(Util.KEY_NAME, contact.name);
        values.put(Util.KEY_PHONE, contact.phone);

        // 3) insert 한다.
        db.insert(Util.TABLE_NAME, null, values);

        // 4) db 사용이 끝나면, 닫아준다.
        db.close();

    }

    // 2. 저장된 연락처를 모두 가져오는 메소드
    public ArrayList<Contact> getAllContacts(){

        // 1) 데이터베이스를 가져온다.
        SQLiteDatabase db = this.getReadableDatabase();

        // 2) 쿼리문 만든다.
        String query = "select * from contact";

        // 3) 쿼리문을 실행하여, 커서로 받는다.
        Cursor cursor = db.rawQuery(query, null);

        // 3-1) 여러 데이터를 저장할 어레이리스트 만든다.
        ArrayList<Contact> contactArrayList = new ArrayList<>();

        // 4) 커서에서 데이터를 뽑아낸다.
        if (cursor.moveToFirst()){
            do{
                int id = cursor.getInt(0);
                String name = cursor.getString(1);
                String phone = cursor.getString(2);

                Log.i("Contact_TABLE", id+", "+name+", "+phone);

                // 이 데이터를, 화면에 표시하기 위해서는
                // 메모리에 전부 다 남아있어야 한다!!!

                Contact contact = new Contact(id, name, phone);
                contactArrayList.add(contact);

            } while (cursor.moveToNext());
        }

        // 5) DB 닫기
        db.close();

        // 6) DB에서 읽어온 연락처 정보를 리턴해야 한다.
        return contactArrayList;

    }


}

 

 

연락처 추가하는 액티비티의 xml 파일 (activity_add.xml)

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".AddActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="30dp"
            android:layout_marginRight="15dp"
            android:gravity="center"
            android:text="연락처 추가"
            android:textSize="28sp" />

        <EditText
            android:id="@+id/editName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="50dp"
            android:layout_marginRight="15dp"
            android:ems="10"
            android:hint="이름 입력"
            android:inputType="textPersonName"
            android:textSize="28sp" />

        <EditText
            android:id="@+id/editPhone"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="30dp"
            android:layout_marginRight="15dp"
            android:ems="10"
            android:hint="전화번호 입력"
            android:inputType="textPersonName"
            android:textSize="28sp" />

        <Button
            android:id="@+id/btnSave"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="15dp"
            android:layout_marginTop="50dp"
            android:layout_marginRight="15dp"
            android:text="저장"
            android:textSize="28sp" />
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

 

 

 

연락처 추가하는 액티비티의 java 파일 (AddActivity.java)

package com.reodinas2.contactapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.reodinas2.contactapp.data.DatabaseHandler;
import com.reodinas2.contactapp.model.Contact;

public class AddActivity extends AppCompatActivity {

    EditText editName;
    EditText editPhone;
    Button btnSave;

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

        editName = findViewById(R.id.editName);
        editPhone = findViewById(R.id.editPhone);
        btnSave = findViewById(R.id.btnSave);

        btnSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String name = editName.getText().toString().trim();
                String phone = editPhone.getText().toString().trim();

                // 이름과 전화번호가 모두 있는지 확인
                if (name.isEmpty() || phone.isEmpty()){
                    Toast.makeText(AddActivity.this, "필수항목입니다", Toast.LENGTH_SHORT).show();
                    return;
                }

                // 묶어서 처리할 Contact 객체를 하나 만든다.
                Contact contact = new Contact(name, phone);

                // DB에 저장한다.
                DatabaseHandler db = new DatabaseHandler(AddActivity.this);
                db.addContact(contact);
                
                // DB에 저장된 연락처 로고 확인
                db.getAllContacts();

                // 유저한테 잘 저장되었다고, 알려주고
                Toast.makeText(AddActivity.this, "잘 저장되었습니다", Toast.LENGTH_SHORT).show();

                // 액티비티 종료
                finish();

            }
        });

    }
}

 

 

테스트 결과

저장 버튼을 누름

 

'Android' 카테고리의 다른 글

Android Studio - RecyclerView와 Adapter를 이용하여 리스트를 화면에 표시하기  (1) 2023.02.01
Android Studio - 아이콘 이미지를 벡터 이미지로 만들기  (0) 2023.02.01
Android Studio - 간단한 유효성 검사(이메일주소, 전화번호, 웹URL, IP주소)  (0) 2023.01.31
Android Studio - SharedPreferences 를 이용해 앱 내에 데이터 저장, 불러오기  (0) 2023.01.31
Android Studio - 액티비티 간의 화면 전환, 데이터 전달(단방향/양방향)  (0) 2023.01.30
    'Android' 카테고리의 다른 글
    • Android Studio - RecyclerView와 Adapter를 이용하여 리스트를 화면에 표시하기
    • Android Studio - 아이콘 이미지를 벡터 이미지로 만들기
    • Android Studio - 간단한 유효성 검사(이메일주소, 전화번호, 웹URL, IP주소)
    • Android Studio - SharedPreferences 를 이용해 앱 내에 데이터 저장, 불러오기
    드레:
    드레:

    티스토리툴바