반응형
Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Do Something IT

안드로이드 DB 컨트롤 본문

Android

안드로이드 DB 컨트롤

아낙시만더 2010. 7. 18. 22:54
반응형


이번에는 위에 같이 EDITTEXT에서 값을 입력받아 DB에 저장한후 LISTVIEW에 나타내는 프로그램을 작성해 보았다.
동영상 강의를 참조하였는데 정말로 DB와 뷰의 연동을 편하게 할수 있는 Adapter와 Arraylist를 보면서 많은것을 배울수 있었다.

일단 DB를 사용 하기위해서 필요한 코드들을 정리해보겠다. DB관련 소스코드로만 따지면 정말로 간략하고 쉽다.
소스는 아래와 같다.

DB 컨트롤
안드로이드는  DB를 사용하기 위해서 따로 오라클이나 Mysql같이 무거운 프로그램이 지원될수 없다. 그래서 자체적으로
SQLiteDatabase를 제공해준다.
해당 객체 생성후 DB오픈을 할때는 Activity에 있는 openOrCreateDatabase로 새로운 데이터베이스를 만들거나 열도록 한다.
private SQLiteDatabase _DB= _Activity.openOrCreateDatabase("jang1", _Activity.MODE_PRIVATE, null);
데이터베이스에 접근이 정성적으로 되었다면 sql쿼리를 던져 해당 데이터를 삽입, 변경,삭제 하거나 받아온다.
쿼리문을 실행하기위해서 execSQL 메소드를 사용한다. 아래와 같이 하면 DB안에 테이블을 생성할수 있다,
_DB.execSQL("Create Table IF NOT EXISTS TodoList(SN integer Primary Key AutoIncrement,Title varchar)");
DB의 값을 받아오기위해서는  Cursor를 사용하여야 한다. Cursor은 받아온 값의 첫위치나 마지막위치 중간위치등
포인터 개념으로 이동시켜 데이터 String 값을 받아와 사용할수 있게 해준다.
아래 소스를 통해 질의에 대한 닶을 받아와 주소값을 받는다.
Cursor _cursor= _DB.rawQuery("Select * from Todolist", null);
그리고 아래와 같이 이용하여 값들을 차례대로 사용할수 있다.
  if(_cursor.moveToFirst()){
   do{
    HashMap<String, String> _Item= new HashMap<String, String>();
    _Item.put("SN", _cursor.getString(0).toString());
    _Item.put("Title", _cursor.getString(1).toString());
    _datasouce.add(_Item);
   }while(_cursor.moveToNext());
  }

위와 같이 작성하려면 필드값이 두개로 되어있을 가정하이다. 이럴때 HashMap을 사용하면 편리하다.
  if(_cursor.moveToFirst())의 조건은 커서의 위치가 해당값들의 처음일때 ture를 반환한다 그리고
while(_cursor.moveToNext()) do~while의 조건문으로 커서의 다음값이 있으면 true이기때문에 값이 없을때까지 계속 탐색한다. 그리고 그값들을 받아올때는 _cursor.getString(0).toString());으로 받아온다.

Adapter
안드로이드에서는 DB에서 가져온값을 ListView나 Gird등 더욱 편하게 반영하기 위해서 Adapter를 지원해준다. Adapter는 받아온값을 어떻게 ListView에 나타낼 것인가를 정하여 나타낸다.
일단 SimpleAdapter를 알아보자.
public BaseAdapter _BaseA=new SimpleAdapter(
    [Activity 객체], [ArrayList] ,[레이아웃 타입],
    [두 값의 타입 배열],
    [해당 레이아웃 타입의 두 텍스트뷰값 배열]
    );

이번에 해본 프로그램에서는 두값을 이용하여 데이터베이스를 운용했기 때문에 이렇게 했는지 모르지만 일단 알아보도록하자.
일단 SimpleAdapter의 정의는 이러하다.
- data를 XML Layout 파일에 지정된 View형태로 표하는데 사용 함.
이 _BaseA 아답터는 ListView에 데이터를 이떤 형식으로 반영하여 나타낼까를 연결해준단. 위에서 매개변수값에서 보면 레이아웃타입이 있다. 거기서 SIMPLE_LIST_ITEM2를 선택하면 두개의값을 가지는 리스트 레아아웃 타입이 정해진다.
그 매개변수 값은 이러하다.

simple_list_item_1 : 하나의 텍스트뷰로 구성된 레이아웃
simple_list_item_2 : 두개의 텍스트뷰로 구성된 레이아웃
simple_list_item_checked : 오른쪽에 체크표시가 나타남
simple_list_item_single_choice : 오른쪽에 라디오 버튼이 나타남
simple_list_item_multiple_choice : 오른쪽에 체크 버튼이 나나남

위에서 두번째매개변수 값을 정했기 때문에 위의 그림처럼 값들이 나타나는 것이다. 나머지 매개변수값은 그안에 들어갈 데이터를 가져올 위치와 저장할 위치를 정해준다.
중요한점은 이 Adapter 객체를 직접 ListView, GridView, Spinner 에 연결 시켜줘야 제대로 작동한다.
_ListView.setAdapter(_Todolst._BaseA);
이와 같이 하면 연결이 된다.

안드로이드는 그 어떤 프로그램보다 DB쪽으로만 따지면 엄청나가 간단히 소스 코드만으로 구현을 하게 해준다. 모바일 안에 들어가야하니 당연하겠지만 정말 대단한것 같다.

마지막으로 소스를 공개하겠다.

---main.xml--
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
>
 <EditText
  android:text=""
  android:id="@+id/InsertText"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
 ></EditText>
 <ListView
  android:id="@+id/List"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
 ></ListView>
</LinearLayout>

--메인Activity--

public class mainAct extends Activity {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        //데이터 베이스 관련과 화면 처리를 하는 Todolst 객체
        _Todolst=new Todolist(this);
        //이벤트밑 컴포넌트 뷰 관리 객체들
        _ListView=(ListView)findViewById(R.id.List);
        _EditText=(EditText)findViewById(R.id.InsertText);
        _EditText.setOnKeyListener(On_Key);
        //adapter를 view에 꼭 연결 시켜야 한다.
        _ListView.setAdapter(_Todolst._BaseA);
    }
   
    //OnKeyListener은 EditText에서 어떤 키가 들어왔을때 이벤트를 발생시킨다.
    private View.OnKeyListener On_Key = new View.OnKeyListener(){
  public boolean onKey(View v, int keyCode, KeyEvent event) {
   //event.getAction()은 어떤 키가어떤 상태인지를 나타내는데 keyEvent.ACTION_DOWN으로
   //키가 눌러져 있을 경우를 알수 있다.
   if(event.getAction()==KeyEvent.ACTION_DOWN){
    //keyCode는 어떤 키가 눌러졌는지를 판독한다.
    if(keyCode==KeyEvent.KEYCODE_ENTER){
     //todolst를 불러 데이터베이스에 저장할 텍스트를 보내준다.
     _Todolst.append(_EditText.getText().toString());
     //에디트 텍스트를 리셋 시킨다.
     _EditText.setText("");
     //엔터키가 입력되고난뒤에는 키처리가완료 되어야 되기 때문에 true를 리턴해준다.
     return true;
    }
   }
   return false;
  }
    };
    private Todolist _Todolst=null;
    private EditText _EditText=null;
    private ListView _ListView=null;
}

--데이터베이스 관련 처리및 레이아웃 아답타 처리관련Todolist--

public class Todolist {

 public Todolist(Activity activity) {
  super();
  _Activity=activity; 
  _DB=_Activity.openOrCreateDatabase("jang1", _Activity.MODE_PRIVATE, null);
  _DB.execSQL("Create Table IF NOT EXISTS TodoList(SN integer Primary Key AutoIncrement,Title varchar)");
  //리스트 뷰에 데이터를 나타내기 위해 SimpleAdapter를 이용하여 나타낸다.
  _BaseA = new SimpleAdapter(
    _Activity, _datasouce,android.R.layout.simple_list_item_2,
    new String[]{"SN","Title"},
    new int[]{android.R.id.text1,android.R.id.text2}
    );
  //리스트에  db에 있는 내용을 바로 보여줌
  select();
 }
 
 //자동증가 필드의 값을 받아 오는 메소드
 public int getLastRowID(){
  Cursor _cursor= _DB.rawQuery("Select last_insert_rowid() from TodoList", null);
  if(_cursor.moveToFirst()){
   return _cursor.getInt(0);
  }else{
   return -1;
  }
 }
 //값을 DB에 저장하고 화면을 갱신한다.
 public void append(String ATitle){
  _DB.execSQL("Insert into TodoList (Title) values ('"+ATitle+"')");
  HashMap<String, String> _Item= new HashMap<String, String>();
  _Item.put("SN", Integer.toString(getLastRowID()));
  _Item.put("Title", ATitle);
  _datasouce.add(_Item);
  _BaseA.notifyDataSetChanged();
 }
 
 //DB에 있는 값들을 불러와 HASHMAP을 통해 아답터를 거처 Textview로 바로 나타나게 해준다.
 public void select(){
  Cursor _cursor= _DB.rawQuery("Select * from Todolist", null);
  if(_cursor.moveToFirst()){
   do{
    HashMap<String, String> _Item= new HashMap<String, String>();
    _Item.put("SN", _cursor.getString(0).toString());
    _Item.put("Title", _cursor.getString(1).toString());
    _datasouce.add(_Item);
   }while(_cursor.moveToNext());
  }
  //데이터 변경시 아답터안의 값이 바꼈다고 알려줘야한다.
  _BaseA.notifyDataSetChanged();
 }
 
 public BaseAdapter _BaseA=null;
 private SQLiteDatabase _DB=null;
 //DB에 들어갈 들어갈 리소스를 저장하는 ArrayList
 private ArrayList<HashMap<String,String>> _datasouce =
  new ArrayList<HashMap<String,String>>();
 private Activity _Activity=null;
}

반응형

'Android' 카테고리의 다른 글

tablelayout  (0) 2010.08.28
Android 개발 넥서스원에서 테스트하기  (0) 2010.08.19
안드로이드 Application Lifecycle  (0) 2010.07.08
[Android] Adapter  (0) 2010.06.25
[번역] 안드로이드 Drawable Mutations  (0) 2010.06.24
Comments