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

Posted by ITPangPang
2016.05.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로 접근하는

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

저작자 표시 비영리 변경 금지
신고

'안드로이드(android) > Sqlite' 카테고리의 다른 글

안드로이드 Sqlite 써보자(1)  (10) 2016.05.16
이 댓글을 비밀 댓글로
    • 2016.10.26 02:44
    비밀댓글입니다
      • 2016.10.26 21:39
      비밀댓글입니다
  1. 답변 주셔서 감사합니다만...
    비밀댓글로 달았더니 답변도 비밀댓글이라..보질 못하네요;;;;;
    뭐 이런식으로 설계가 되어있지..ㅎㅎ;;
    답변 다시 한번 복붙 해주시면 감사하겠습니다!
      • 지나다가
      • 2016.11.28 00:04 신고
      ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
      빵터졌네요. ^0^
      질문도 궁금하네...
  2. 주인장님이 답글주신줄알고왓으나ㅎㅎ
    이각박한세상에 항상 웃음 있으시길~~~
    요샌 나름 sqlite좀 씁니당 궁금한거있으심 질문하세욤ㅎ
    • 허허..

      별 내용없이 비밀댓글에 답글 달았었는데 이런일이 있었군요 ㅠㅠ..

      초대장 배포할때 빼고는 거의 댓글달린건 안보는 편이라..

      위 답변은 저도 잘 몰라서 알게 되시면 알려주시면 감사하겠습니다..라는 답글이었습니다 ㅠㅠ..

      뭐 이런 허졉한 답변이었습니다..
      ----------------------------------
      안녕하세요
      저도 루팅쪽은 잘 모르지만..

      루팅을 통해서 슈퍼권한을 얻어서
      접근이 가능하고.. 뷰어등을 통해서
      열람 가능하며, db를 빼와서 수정등등
      가능하다고는 들었습니다.

      루팅 보안관련해서 가끔 보이는 글들을
      읽어보면 다들 개인정보나 비밀번호에
      관한 얘기는 많이 봤는데 db변경에 관한 내용은 정확히 본 기억이 없네요..

      db를 빼와서 열람하고 수정하는건 가능하지만 수정후에 다시 넣을 수 있는지는 모르겠네요. 빼와서가 중요한것 같네요.
      (변경하고 다시 넣을 수 있는지는 확실하지 않아서.. 혹시 찾아보시고 가능하다면 저한테도 알려주심 감사해요 ㅎㅎ..)

      보통 비밀번호 열람때문에 말들이 많았는데 그래서 암호화를 통하거나 토큰등만 저장하는 걸로 알고있습니다..

      저도 보안관련해서 지식이 부족해서 정확한 답변을 못드려서 죄송합니다.
  3. 주인장님 안녕하세요~
    저 글을 올린지도 어느덧 1달이 넘었네요 ㅎ
    10월 26일? 그때부터 3주정도가 지난 후에야 저만의 선택을 했네요..ㅎ
    db에 암호화된 데이터를 넣는거죠ㅎ
    근데 님 글을 보고나니...
    루팅유저들이 데이터를 수정할 순 있지만....
    다시 넣는게 가능한지에 대한 답글..
    저도 이제 생각하니 그런가?? 하네요 ㅎㅎ
    3주넘게 괜한짓을 한건가..ㅎㅎ
    암튼 암호화를 선택했어요 ㅠ
    학부때 암호학 한번 안들어봐갖고..인터넷에서 글들 엄청 읽었네요...디비도ㅎㅎ
    암툰 답변 감사해요^^
    • 2016.12.03 23:50
    비밀댓글입니다
  4. 아직 개념이 안 잡혀서 궁금한것은
    이 예제는 폰 자체에서 작동하는 코드인가요?
    서버의 sqlite에 접속해서 동작 하는게 아닌가요?
    • 디바이스 안에서 저장하고 실행되는 코드에여