안드로이드에 설치되어있는 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 |