개발/안드로이드

Android - SQLite3

웅'jk 2023. 1. 31. 17:51

안드로이드에 설치되어있는 sqlite3 db를 통해 데이터를 저장해보자.

 

JAVA code

# MainActivity

 Button btnAdd;
 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnAdd = findViewById(R.id.btnadd);
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(),AddActivity.class);
                startActivity(intent);
            }
        });
    }

- 메인액티비티 에서는 단순히 버튼을 클릭할때 addActivity로 넘어갑니다.

 

# addActivity

EditText editname,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 contact = new Contact(name,phone);

                # db에 저장한다.
                DatabaseHandler db = new DatabaseHandler(AddActivity.this);
                db.addContact(contact);

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

                finish();
            }
        });

    }

- addActivity 는 이름과 번호 를 입력하게 되어있고 버튼으로 눌렀을 때 저장하도록 작동합니다.

 

이때 저장을 위해 contact 클래스를 만들어 객체로 저장하도록 합니다.

 

# Contact 클래스
public class Contact {

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

Contact 클래스는 위와 같이 정의되어있습니다.

 

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";

}

데이터베이스의 db명,table명등이 기재되어있는 util 클래스

 

 

본격적으로 sqlite3 을 이용하기 위해 정의한 DatabaseHandler 클래스를 알아봅시다.

 

# sqlite3 을 이용하기위해 SQLiteOpenHelper 을 상속받습니다.
public class DatabaseHandler extends SQLiteOpenHelper

SQLiteOpenHelper 를 상속받습니다.

# DatabaseHandler의 생성자로 다음과 같이 만들었습니다. 
public DatabaseHandler(@Nullable Context context) {
        super(context, util.DB_NAME,null,util.DB_VERSION);
    }

DatabaseHandler 의 생성자

# SqliteOpenHelper는 추상클래스이기때문에 메소드를 오버라이딩 합니다.
@Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        # 테이블 생성하는 sql query문
        String CREATE_CONTACK_TABLE = "create table contact( id integer primary key , name text, phone text )";
        # query문을 적용시키기 위한 SQLiteDatabase 의 execSQL 함수
        sqLiteDatabase.execSQL(CREATE_CONTACK_TABLE);
    }
@Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        #기존의 테이블을 삭제하고, 새 테이블을 다시 만든다.
		# sql query문
        String DROP_TABLE = "drop table contact";
        #sqLiteDatabase.execSQL(DROP_TABLE);
        sqLiteDatabase.execSQL(DROP_TABLE,new String[]{util.DB_NAME});
        # create table을 위한 oncreate 호출
        onCreate(sqLiteDatabase);
    }

SQLiteOpenHelper 가 추상클래스이기에 메소드를 전부 오버라이딩하여 정의를 합니다. 

 

- onCreate 는 말 그대로 생성될때 작동하는 메소드입니다.

- onUpgrade 는 업그레이드 될때마다 작동하는 메소드입니다.

 

여기까지는 반드시 정의해야될 부분이며 밑부분부터는 필요에 의해 정의된 사용자 메소드입니다.!

 

# 데이터베이스의 insert 
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();
    }

db를 가져오는 방법은 생성한 객체 (this).getWritableDatabase(); 함수로 가져올 수 있습니다.

 

db의 저장할 형식을 만들기 위해 ContentValues 클래스를 이용합니다.

 

db.insert는 (String table_name, String nullColumnhack , ContentValues contents)입니다.

nullColumnhack 은 컬럼의 null값을 어떻게 처리할지를 결정한다.

# 데이터베이스에서 데이터 전부 가져오기.
public ArrayList<Contact> getAllContact(){

        # 1. db를 가져온다.
        SQLiteDatabase db = this.getReadableDatabase();

        # 2. query 문 작성
        String query = "select * from contact";

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

        # 3-1 커서의 데이터를 저장할 ArrayList를 만든다.
        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);
                Contact contact = new Contact(id,name,phone);
                contactArrayList.add(contact);
            }while(cursor.moveToNext());
        }
        # 5. db 닫기
        db.close();

        # 6. contactArrayList를 리턴한다.
        return contactArrayList;
    }

여기서 select 문은 query를 지정할때 rawquery함수로 query문을 지정한다.

'개발 > 안드로이드' 카테고리의 다른 글

Android - RecyclerView의 Intent  (0) 2023.02.01
Android - RecyclerView  (0) 2023.02.01
Android - SharedPreferences  (0) 2023.01.31
Android - Intent  (0) 2023.01.31
Android - LifeCycle  (0) 2023.01.31