안드로이드 Sqlite 써보자(1)
안드로이드에서
Sqlite 써보자(1)
ㆍ 드디어 미루고 미루던 Sqlite에 대해서 써보려고 합니다.
안드로이드의 많은 부분중에 제가 가장 싫어하는 부분입니다.
그 이유는 안드로이드 개발을 시작하고 첫 Sqlite를 사용할때
천천히 기본부터 배웠어야 되는데, 그 당시 구현해야할
기간이 짧아서 대충대충 필요한 부분만 코드를 따와서 썼더니
아직까지도 변형을 해서 사용해야 하는 순간에는 자신감이
떨어지는걸 느낍니다.
이번에 Sqlite관련해서 글을 쓰면서 기초부터 다시 쌓아보려고 합니다.
몇개의 글이 될지는 모르나 아주 천천히 많은 예제를 통해서 써보려고 합니다
일단 이번글에서는 자세한 설명보다는 간단하게 느낌만 보면서
바로 사용하는 법을 알아보고, 다음글에서 Db의 구조와 이번글에서 만들게 되는
코드를 분석해보도록 하겠습니다.
대충 스크롤 내리면서 읽기만 하고, 다음글에서 부터 하나하나 파악해보겠습니다
SQLite의 역사란?
예 천천히 한다고 해도
이런부분은 스킵할 예정입니다.
SQLite를 왜 써야하는가?
이 부분은 설명이 필요하지만
굳이 길게 설명할 부분이 없습니다
앱을 사용하다보면 Data(데이터)를
저장해야하는 경우가 있습니다
정확히 말하면 앱을 껏다 켜도
데이터를 보존해야 하는 경우입니다.
물론 간단한 데이터는
SharedPreferences를 이용해서
저장이 가능하지만
조금 더 체계적이고 효율적인
데이터 관리를 하기 위해서는
SQLite를 사용해야만 합니다.
바로 상황을 만들어서 써보자
전 예를 드는걸
굉장히 좋아해서..
하지만 적절한 예를 들지는
못하는.. ㅠ . ㅠ
첫번째 Sqlite사용을 위한
실생활 예제입니다.
한 회사가 있습니다 회사의 이름은
ITPANGPANG입니다.
이 회사에는 5명의 직원이 있습니다.
민수,철수,만수,영희,수진
이 회사는 점심시간마다 뽑기를
통해서 점심값을 계산합니다
그래서 이 회사에는
뽑기통이 있습니다
그 뽑기통은 소품실에 있습니다
그 뽑기통에는
5개의 이름이 적힌공
이 있습니다
자 위의 예시를 SQLite와
연관지어서 써보겠습니다
위 내용을 그림으로
나타내보면 아래와 같을 겁니다
위 그림에서 뽑기통은
점심시간이 끝난다고 해서
사라지지 않습니다
뽑기통 안에 있는
직원들 이름이 적힌 공은
직원이 늘어나거나 감소할때
추가시키거나 없앨 수 있습니다.
자 그럼 위와같은 상황을
안드로이드에서 코드로
구현해보겠습니다
SQLite를 사용하기 위해서는
SQLiteOpenHelper라는 클래스의
도움을 받아야합니다
먼저
[MyDatabaseOpenHelper]
라고 클래스를 하나 생성한 후에
[SQLiteOpenHelper]를 상속받겠습니다
위와 같이 만들면
빨간 글씨가 뜨는데
글씨위에서 Alt+Enter를
눌러서 저들이 원하는데로
오버라이드를 해줍니다
뭐 하라는 데로 다 해주면
public class MyDatabaseOpenHelper extends SQLiteOpenHelper
{
public MyDatabaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
위와 같이 만들어 집니다
오버라이드 한 부분을 하나하나
간단히 살펴보자면
onCreate 부분은 뽑기통을
만들기 위한 과정입니다.
물론 회사가 뽑기통을 위해서
만들어지지는 않았지만
존재하기 위해서는
소품실이라는 Db가 필요하고
그안에 뽑기통이라는 Table이 있습니다
또 그 Table안에는 직원들 이름이 적힌
공이 있겠죠
public class MyDatabaseOpenHelper extends SQLiteOpenHelper
{
public static final String tableName = "container";
public MyDatabaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
createTable(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createTable(SQLiteDatabase db)
{
String sql = "CREATE TABLE " + tableName + "(name text)";
try
{
db.execSQL(sql);
}
catch (SQLException e)
{
}
}
}
위와 같이 생성해줍니다
onCreate에서 container(뽑기통)을
만들어줍니다.
그 통에는 name(직원들 이름)이
들어간 공이 들어갈 수 있습니다.
이제 통을 만들었으면
통에 공을 넣기 위해서 코드를
추가합니다.
public class MyDatabaseOpenHelper extends SQLiteOpenHelper
{
public static final String tableName = "container";
public MyDatabaseOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
createTable(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void createTable(SQLiteDatabase db)
{
String sql = "CREATE TABLE " + tableName + "(name text)";
try
{
db.execSQL(sql);
}
catch (SQLException e)
{
}
}
public void insertName(SQLiteDatabase db, String name)
{
db.beginTransaction();
try
{
String sql = "insert into " + tableName + "(name)" + " values('" + name + "')";
db.execSQL(sql);
db.setTransactionSuccessful();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
db.endTransaction();
}
}
}
회사에서는
직원이 변함에 따라
insertName을 통해서
공을 추가시킬 수 있습니다
여기까지가 통을 만들고
공을 넣을수 있도록 도와주는
역할을 하는 클래스입니다.
그럼 직접 행동을 하기 위한
메인 클래스를 만들어보겠습니다.
직원을 추가시키기 위한
EditText와 버튼,
추가한 직원목록을
보여주는 TextView
당첨자를 뽑기위한 버튼
public class MainActivity extends AppCompatActivity
{
Button btn_add;
Button btn_winner;
EditText et_name;
TextView tv_people;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUp();
}
private void setUp()
{
btn_add = (Button)findViewById(R.id.btn_add_people);
btn_winner = (Button)findViewById(R.id.btn_winner);
et_name = (EditText)findViewById(R.id.et_name);
tv_people = (TextView)findViewById(R.id.tv_people);
btn_add.setOnClickListener(myListener);
btn_winner.setOnClickListener(myListener);
}
View.OnClickListener myListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn_add_people :
//직원공 추가시키기
break;
case R.id.btn_winner :
//랜덤 뽑기
break;
}
}
};
}
이제 직원을
추가시키기 위해서는
아까 만들었던
MyDataOpenHelper 클래스와
연결을 해야합니다
연결을 하기 위해서는
SQLiteDatabase를 통해서
MyDataOpenHeler와
연결할 수 있습니다
public class MainActivity extends AppCompatActivity
{
Button btn_add;
Button btn_winner;
EditText et_name;
TextView tv_people;
int version = 1;
MyDatabaseOpenHelper helper;
SQLiteDatabase database;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUp();
}
private void setUp()
{
btn_add = (Button)findViewById(R.id.btn_add_people);
btn_winner = (Button)findViewById(R.id.btn_winner);
et_name = (EditText)findViewById(R.id.et_name);
tv_people = (TextView)findViewById(R.id.tv_people);
btn_add.setOnClickListener(myListener);
btn_winner.setOnClickListener(myListener);
helper = new MyDatabaseOpenHelper(MainActivity.this, MyDatabaseOpenHelper.tableName, null, version);
database = helper.getWritableDatabase();
}
View.OnClickListener myListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn_add_people :
//직원공 추가시키기
break;
case R.id.btn_winner :
//랜덤 뽑기
break;
}
}
};
}
이제 버튼을 눌렀을때
아까 Helper클래스에서
만들었던 insertName에
접근해서 이름을 추가하고
추가함과 동시에 TextView에
이름을 뿌려주는 코드를
추가해보겠습니다
(Select Cursor)
메인클래스
완성본
public class MainActivity extends AppCompatActivity
{
String participants[] = new String[100];
StringBuffer sb;
int version = 1;
int count = 0;
MyDatabaseOpenHelper helper;
SQLiteDatabase database;
Button btn_add;
Button btn_winner;
EditText et_name;
TextView tv_people;
String sql;
Cursor cursor;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setUp();
nameList();
}
private void setUp()
{
btn_add = (Button)findViewById(R.id.btn_add_people);
btn_winner = (Button)findViewById(R.id.btn_winner);
et_name = (EditText)findViewById(R.id.et_name);
tv_people = (TextView)findViewById(R.id.tv_people);
btn_add.setOnClickListener(myListener);
btn_winner.setOnClickListener(myListener);
helper = new MyDatabaseOpenHelper(MainActivity.this, MyDatabaseOpenHelper.tableName, null, version);
database = helper.getWritableDatabase();
sb = new StringBuffer();
}
View.OnClickListener myListener = new View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.btn_add_people :
sb.setLength(0);
helper.insertName(database,(et_name.getText().toString()) );
nameList();
break;
case R.id.btn_winner :
//랜덤 뽑기
break;
}
}
};
private void nameList()
{
sql = "select name from " + helper.tableName;
cursor = database.rawQuery(sql, null);
if (cursor != null)
{
count = cursor.getCount();
for (int i = 0; i < count; i++)
{
cursor.moveToNext();
String participant = cursor.getString(0);
participants[i] = participant;
sb.append(participants[i] + " ");
}
tv_people.setText("" + sb);
cursor.close();
}
}
}
이번글에서는
몸풀기로
뭐 이런식으로 짠다는
방법만 알아봤고
다음글에서 코드분석과
함께 DB구조와 용어
그리고 Cursor로 접근하는
방법에 대해 알아보겠습니다