본문 바로가기

Android/Java

SQLite를 Util로 만들어서 사용하기!

반응형

안녕하세요 오늘은 Android Local DB인 SQLite 사용법에 대해 알아보겠습니다.


필요한 class는 총 5개로 나눠서 사용했고, 아래처럼


1. DBHelper

2. DBHolder

3. Person

4. PersonAdapter

5. SQLiteUtil


이렇게 구성했습니다.


이제 하나하나 살펴보겠습니다!!!


설명은 필요없다. 코드만 보고 싶다하신 분은 


https://github.com/JC-Choo/App_Memo/tree/android/app/src/main/java/com/example/cnwlc/memo/Util/sqlite


를 참고해주세요!!




1. DBHelper (쉽게 말해 DataBase를 도와주는 앱니다. )

사용방법 : class 이름은 아무거나 하신 뒤 SQLiteOpenHelper를 상속받으시면 됩니다!

(insert 와 select 만 구현해봤습니다. Update와 delete는 직접 해보세요!!!)


우선 저는 생성자를 만들어서 필요한 context와 dataBaseName을 가져왔습니다.

public DBHelper(Activity context, String dataBaseName, SQLiteDatabase.CursorFactory factory, int dataBaseVersion) {
super(context, dataBaseName, factory, dataBaseVersion);

this.context = context;
this.dataBaseName = dataBaseName;
this.dataBaseVersion = dataBaseVersion;
}


그리고 StringBuffer로 db를 create하기 위한 문구를 append합니다!

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(" CREATE TABLE "+dataBaseName+" ( ");
stringBuffer.append(" _ID INTEGER PRIMARY KEY AUTOINCREMENT, ");
stringBuffer.append(" NAME TEXT, ");
stringBuffer.append(" AGE INTEGER, ");
stringBuffer.append(" PHONE TEXT ) ");

sqLiteDatabase.execSQL(stringBuffer.toString());
}

sqLiteDatabase.execSQL 을 통해 sql query를 실행시켜서 설정한 dataBaseName의 이름을 갖는 table을 만드는 겁니다.


테이블을 만들면 그 다음 할 일은 무엇일까요!?!?!?

바로 Data를 Insert 해야합니다!!!

// Data 를 Insert 하기 위한 method

public void insertPerson(Person person) {

// 1. 쓸 수 있는 DB 객체를 가져온다.
SQLiteDatabase sqLiteDatabase = getWritableDatabase();

// 2. Person Data를 Insert한다.
// _id는 자동으로 증가하기 때문에 넣지 않습니다.
// StringBuffer stringBuffer = new StringBuffer();
// stringBuffer.append(" INSERT INTO "+dataBaseName+" ( ");
// stringBuffer.append(" NAME, AGE, PHONE ) ");
// stringBuffer.append(" VALUES ( ?, ?, ? ) ");
String stringBuffer = " INSERT INTO "+dataBaseName+" ( " +
" NAME, AGE, PHONE ) " +
" VALUES ( ?, ?, ? ) ";

sqLiteDatabase.execSQL(stringBuffer, new Object[]{
person.getName(), Integer.parseInt(person.getAge()), person.getPhone()
});
}


주석 달려있는대로 해석하시면 됩니다!

StringBuffer를 사용해도 되며, String을 사용해도 됩니다. 다만 두개의 차점은 존재하지만, 여기서는 딱히 상관없을듯 합니다!


마지막으로 제대로 insert되어 있다면 그 다음 해야할 일은!?!?
data를 가져와보는 겁니다!!

// Data 를 select 하기 위한 method
public List selectAllPersonData() {

String stringSelect = " SELECT _ID, NAME, AGE, PHONE FROM "+dataBaseName+" ";

// 읽기 전용 DB 객체를 만든다.
SQLiteDatabase sqLiteDatabase = getReadableDatabase();
Cursor cursor = sqLiteDatabase.rawQuery(stringSelect, null);
List<Person> people = new ArrayList<>();
Person person = null;

// moveToNext 다음에 데이터가 있으면 true 없으면 false
while (cursor.moveToNext()) {
person = new Person();
person.set_id(cursor.getInt(0));
person.setName(cursor.getString(1));
person.setAge(String.valueOf(cursor.getInt(2)));
person.setPhone(cursor.getString(3));

people.add(person);
}

sqLiteDatabase.close();
return people;
}

List<Person> perple 인 부분은 select로 뽑아낸 값들을 list로 넣어 담고 있기 위한 것입니다.


Cursor를 통해 db에 접근해 가져온겁니다!!




2. DBHolder (DataBase를 나타낼 view를 모아놓은 곳)

딱히 할게 없습니다. 그냥 저는 TextView로 나타내기 위해 넣어놓은 곳이고 없어도 되는 곳입니다!

public class DBHolder {
public TextView textViewId;
public TextView textViewName;
public TextView textViewAge;
public TextView textViewPhone;
}




3. Person (Data Transfer Object로서, 사용할 Data 들을 모아놓은 class입니다)

public class Person {
private int _id;
private String name;
private String age;
private String phone;

public int get_id() {
return _id;
}

public String getName() {
return name;
} /* ... */
}





4. PersonAdapter (BaseAdapter를 상속받아 Person의 data를 View에 나타내줄 adapter)

이 부분도 딱히 없어도 될 듯 합니다. 저는 Test하기 위해 이런식으로 구현한 것이지, 정작 필요한건

1번인 DBHelper 부분과 5번은 SQLiteUtil 부분입니다.


BaseAdapter를 상속받고 Method 를 다음과 같이 구현해줍니다.

@Override
public int getCount() {
return people.size();
}

@Override
public Object getItem(int position) {
return people.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

@SuppressLint("SetTextI18n")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
DBHolder dbHolder = null;
if (convertView == null) {
convertView = new LinearLayout(context);
((LinearLayout) convertView).setOrientation(LinearLayout.HORIZONTAL);

TextView textViewId = new TextView(context);
textViewId.setPadding(10, 0, 20, 0);
textViewId.setTextColor(Color.rgb(0, 0, 0));

TextView textViewName = new TextView(context);
textViewName.setPadding(20, 0, 20, 0);
textViewName.setTextColor(Color.rgb(0, 0, 0));

TextView textViewAge = new TextView(context);
textViewAge.setPadding(20, 0, 20, 0);
textViewAge.setTextColor(Color.rgb(0, 0, 0));

TextView textViewPhone = new TextView(context);
textViewPhone.setPadding(20, 0, 20, 0);
textViewPhone.setTextColor(Color.rgb(0, 0, 0));

((LinearLayout) convertView).addView(textViewId);
((LinearLayout) convertView).addView(textViewName);
((LinearLayout) convertView).addView(textViewAge);
((LinearLayout) convertView).addView(textViewPhone);

dbHolder = new DBHolder();
dbHolder.textViewId = textViewId;
dbHolder.textViewName = textViewName;
dbHolder.textViewAge = textViewAge;
dbHolder.textViewPhone = textViewPhone;

convertView.setTag(dbHolder);
} else {
dbHolder = (DBHolder) convertView.getTag();
}

Person person = (Person) getItem(position);
dbHolder.textViewId.setText(person.get_id() + "");
dbHolder.textViewName.setText(person.getName());
dbHolder.textViewAge.setText(person.getAge() + "");
dbHolder.textViewPhone.setText(person.getPhone());

return convertView;
}

사용할 변수와 생성자는

private Context context;
private List people;

public PersonAdapter(Context context, List people) {
this.context = context;
this.people = people;
}


이렇게 구현합니다. getView는 말 그대로 View를 만들어주는 것입니다!!!


View를 만들어 person에 담긴 데터를 꺼내와 holder로 정의한 view에 데이터를 넣습니다.




5. SQLiteUtil (사용할 Activity에 넣어도 되지만, 저는 Util로 만들어 필요한 곳에서 데이터를 넣기 위해 구현했습니다.)


Util에서 사용할 초기값을

public void setInitValue(Activity context, String dataBaseName) {
this.context = context;
this.dataBaseName = dataBaseName;
}

구현해 넣었고, 

// DBHelper 호출
private DBHelper dbHelper;
// DBHelper 정의
// DataBase Name 을 정할 method(context 는 Toast를 띄우기 위해 사용, dataBaseName 은 db의 이름을 정하기 위해 사용)
public void dataBaseName() {
dbHelper = new DBHelper(context, dataBaseName, null, 1);
}

DBHelper를 호출해 정의했습니다.


Data를 입력하기 위해

public void setData(String name, String age, String phone) {
if (dbHelper == null) {
dbHelper = new DBHelper(context, dataBaseName, null, 1);
}

Person person = new Person();
person.setName(name);
person.setAge(age);
person.setPhone(phone);

dbHelper.insertPerson(person);

}

위처럼 구현했습니다. 


Data를 출려하기 위해서는 

public void getData(ListView listView) {

listView.setVisibility(View.VISIBLE);


if (dbHelper == null) {
dbHelper = new DBHelper(context, dataBaseName, null, 1);
}

List people = dbHelper.selectAllPersonData();

listView.setAdapter(new PersonAdapter(context, people));

}

이렇게 구현해주면 됩니다. List에 담긴 값들을 listView에 넣어주는 것입니다.




이렇게 구현한 뒤 사용할 곳에서 SQLiteUtil을 불러다 쓰면 됩니다!!!


DataBase의 Table을 생성하고 싶다!!!

SQLiteUtil.getInstance().setInitValue(TestActivity.this, dataBaseName);
SQLiteUtil.getInstance().dataBaseName();


Table에 Data를 넣고 싶다!!

SQLiteUtil.getInstance().setTestDialogView();


Table에 있는 Data를 ListView로 다 보여주고 싶다!!!

SQLiteUtil.getInstance().getData(lvPeople);


이런식으로 사용하면 됩니다!!! 참고해서 사용하세요~!


------------------------------이상 SQLiteUtil 만들기였습니다.






반응형