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;
}
}
'Android' 카테고리의 다른 글
Android [메모앱] recyclerView (0) | 2023.02.01 |
---|---|
Android recyclerView, adapter (2) | 2023.02.01 |
Android [로그인앱] (0) | 2023.01.31 |
Android shared preference(앱 내에 토큰,자동로그인 등 데이터를 저장) (0) | 2023.01.31 |
Android 단방향 데이터 전달, 양방향 데이터 전달 (0) | 2023.01.30 |