안드로이드 Sqlite 써보자(1)

Posted by ITPangPang
2016. 5. 16. 00:44 안드로이드(android)/Sqlite


안드로이드에서

 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로 접근하는

방법에 대해 알아보겠습니다