본문 바로가기
Android

Android SQLite3 , RecyclerView , SQLiteOpenHelper 클래스를 상속 , 메뉴 아이콘 이미지를 벡터 이미지로 만드는 방법, CardView 예시

by leopard4 2023. 1. 31.

1. 여기서 주의깊게 봐야할것은 db에 저장하기 위해 contact 클래스를 만들었다는 것.(테이블과비슷)
2. db핸들러 생성시 SQLiteOpenHelper클래스를 상속받는것 
그리고 생성자를 만들때 db이름과 버전, 테이블컬럼 관련 상수를 util로 뺏다는것
3.  반드시 기억 new는 힙에 생성된다는것 
4.  데이터베이스 부분만 확인하고 넘어가도됨

main

package com.leopard4.contactapp;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import com.leopard4.contactapp.data.DatabaseHandler;

public class MainActivity extends AppCompatActivity {

    Button btnAdd;


    @Override
    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(MainActivity.this, AddActivity.class);
                startActivity(intent);

            }
        });

    }

}

 

Add

package com.leopard4.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.leopard4.contactapp.data.DatabaseHandler;
import com.leopard4.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);

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



            }
        });



    }
}

DatabaseHandler

package com.leopard4.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.leopard4.contactapp.model.Contact;
import com.leopard4.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 autoincrement, 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, new String[]{Util.TABLE_NAME});

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

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

        // 2. 저장가능한 형식으로 만들어준다 (ContentValues 객체를 만든다.)
        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. 쿼리문을 실행하여, 커서 객체로 받는다.
        // 원문을 실행할때는 rawQuery() 메소드를 사용한다
        // 두번째 파라미터는 where 같은것
        Cursor cursor = db.rawQuery(query, null);

        // 3-1 여러 데이터를 저장할 어레이리스트를 만든다.
        ArrayList<Contact> contactList = 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: " + id + ", name: " + name + ", phone: " + phone);

                // 이 데이터를, 화면에 표시하기 위해서는
                // 메모리에 전부 다 남아있어야하 한다!!!
                // 그래서, 이 데이터를, Contact 객체로 만들어서
                Contact contact = new Contact(id, name, phone);
                // 이 Contact 객체를, ArrayList에 담아둔다.
                contactList.add(contact);


            }while(cursor.moveToNext()); // 다음 데이터로 이동해서 반복
        }

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

        // 6. DB에서 읽어온 데이터를 리턴한다.
        return contactList;
    }


}

util

package com.leopard4.contactapp.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

package com.leopard4.contactapp.model;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

 

액션바 사라짐

 

 

 

1개행씩 가져오는 모습