출처 : http://arabiannight.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9CAndroid-DB-%EC%83%9D%EC%84%B1-%EB%B0%8F-%EA%B4%80%EB%A6%AC-Cursor-Query
안드로이드 프로젝트를 진행하다 보면 DATA를 보관하고 사용하게 되는 경우가 자주 발생하게 됩니다. 보통 회원가입을 통해 회원정보를 저장할때 많이 사용하는데요. 그럴경우 DATA를 계속적으로 보관하고 사용해야 하기 때문에 DATABASE(=DB) 라는 저장공간에을 사용하게 되는 것 입니다.
안드로이드에서는 이러한 경우를 대비해 SQLiteDatabase라는 DATABASE 를 제공해 주는데요. 만약 DATA를 저장해서 사용하게 되는 경우가 생길 경우 SQLiteDatabase 와 DatabaseHelper(DB생성 및 관리를 도와준다.) 를 사용해서 좀더 편리하게 DATABASE를 관리 할 수 있습니다.
DB를 사용하기 위해서는 우선 어떤 작업을 제일 먼저 해야할까요? 그렇습니다.ㅎ 일단 DB를 사용하기 위해서는 DB를 생성해야 합니다. DB는 TABLE 구조로 DATA를 관리하고있으므로 우선대야 할 작업이 TABLE 구조를 만드는 일입니다. 자 그럼 TABLE 구조를 만드는 코드를 보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // DataBase Table public final class DataBases { public static final class CreateDB implements BaseColumns{ public static final String NAME = "name" ; public static final String CONTACT = "contact" ; public static final String EMAIL = "email" ; public static final String _TABLENAME = "address" ; public static final String _CREATE = "create table " +_TABLENAME+ "(" +_ID+ " integer primary key autoincrement, " +NAME+ " text not null , " +CONTACT+ " text not null , " +EMAIL+ " text not null );" ; } } |
여기서 주의해서 보실 부분중에 autoincrement 란 속성이 있습니다. autoincrement 란 속성은 DATA를 DB에 넣을때 자동으로 "+1" 을 증가 시켜주는 주어 DATA를 식별 할 수 있는 고유 번호를 부여하는 속성 입니다. 위의 예제에서는 "_id" 라는 필드에 사용 되었습니다.
실제 위의 코드로 생성한 DB 테이블(address) 구조 입니다.
RecNo은 DB Tool 자체의 Number코드이니 "_id" 필드 부터 보시면 됩니다. 또한 "_id" 필드의 값이 +1씩 자동 증가한 모습을 볼 수 있습니다.
자 그럼, DB TABLE 구조에 대해 알아보았습니다. 다음은 SQLiteDatabase 와 DatabaseHelper 를 통한 DB 관리 예제 설명 하겠습니다.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | public class DbOpenHelper { private static final String DATABASE_NAME = "addressbook.db" ; private static final int DATABASE_VERSION = 1 ; public static SQLiteDatabase mDB; private DatabaseHelper mDBHelper; private Context mCtx; private class DatabaseHelper extends SQLiteOpenHelper{ // 생성자 public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super (context, name, factory, version); } // 최초 DB를 만들때 한번만 호출된다. @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DataBases.CreateDB._CREATE); } // 버전이 업데이트 되었을 경우 DB를 다시 만들어 준다. @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL( "DROP TABLE IF EXISTS " +DataBases.CreateDB._TABLENAME); onCreate(db); } } public DbOpenHelper(Context context){ this .mCtx = context; } public DbOpenHelper open() throws SQLException{ mDBHelper = new DatabaseHelper(mCtx, DATABASE_NAME, null , DATABASE_VERSION); mDB = mDBHelper.getWritableDatabase(); return this ; } public void close(){ mDB.close(); } } |
위의 예제 소스에서 보시는 바와 같이,
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | public class TestDataBaseActivity extends Activity { private static final String TAG = "TestDataBaseActivity" ; private DbOpenHelper mDbOpenHelper; private Cursor mCursor; private InfoClass mInfoClass; private ArrayList<infoclass> mInfoArray; private CustomAdapter mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.main); setLayout(); // DB Create and Open mDbOpenHelper = new DbOpenHelper( this ); mDbOpenHelper.open(); mDbOpenHelper.insertColumn( "김태희" , "01000001111" , "angel@google.com" ); mDbOpenHelper.insertColumn( "송혜교" , "01333331111" , "asdffff@emdo.com" ); mDbOpenHelper.insertColumn( "낸시랭" , "01234001111" , "yaya@hhh.com" ); mDbOpenHelper.insertColumn( "제시카" , "01600001111" , "tree777@atat.com" ); mDbOpenHelper.insertColumn( "성유리" , "01700001111" , "tiger@tttt.com" ); mDbOpenHelper.insertColumn( "김태우" , "01800001111" , "gril@zzz.com" ); // startManagingCursor(mCursor); mInfoArray = new ArrayList<infoclass>(); doWhileCursorToArray(); for (InfoClass i : mInfoArray){ DLog.d(TAG, "ID = " + i._id); DLog.d(TAG, "name = " + i.name); DLog.d(TAG, "contact = " + i.contact); DLog.d(TAG, "email = " + i.email); } mAdapter = new CustomAdapter( this , mInfoArray); mListView.setAdapter(mAdapter); mListView.setOnItemLongClickListener(longClickListener); } @Override protected void onDestroy() { mDbOpenHelper.close(); super .onDestroy(); } /** * ListView의 Item을 롱클릭 할때 호출 ( 선택한 아이템의 DB 컬럼과 Data를 삭제 한다. ) */ private OnItemLongClickListener longClickListener = new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<!--?--> arg0, View arg1, int position, long arg3) { DLog.e(TAG, "position = " + position); boolean result = mDbOpenHelper.deleteColumn(position + 1 ); DLog.e(TAG, "result = " + result); if (result){ mInfoArray.remove(position); mAdapter.setArrayList(mInfoArray); mAdapter.notifyDataSetChanged(); } else { Toast.makeText(getApplicationContext(), "INDEX를 확인해 주세요." , Toast.LENGTH_LONG).show(); } return false ; } }; /** * DB에서 받아온 값을 ArrayList에 Add */ private void doWhileCursorToArray(){ mCursor = null ; mCursor = mDbOpenHelper.getAllColumns(); DLog.e(TAG, "COUNT = " + mCursor.getCount()); while (mCursor.moveToNext()) { mInfoClass = new InfoClass( mCursor.getInt(mCursor.getColumnIndex( "_id" )), mCursor.getString(mCursor.getColumnIndex( "name" )), mCursor.getString(mCursor.getColumnIndex( "contact" )), mCursor.getString(mCursor.getColumnIndex( "email" )) ); mInfoArray.add(mInfoClass); } mCursor.close(); } /** * OnClick Button * @param v */ public void onClick(View v){ switch (v.getId()) { case R.id.btn_add: mDbOpenHelper.insertColumn ( mEditTexts[Constants.NAME].getText().toString().trim(), mEditTexts[Constants.CONTACT].getText().toString().trim(), mEditTexts[Constants.EMAIL].getText().toString().trim() ); mInfoArray.clear(); doWhileCursorToArray(); mAdapter.setArrayList(mInfoArray); mAdapter.notifyDataSetChanged(); mCursor.close(); break ; default : break ; } } /* * Layout */ private EditText[] mEditTexts; private ListView mListView; private void setLayout(){ mEditTexts = new EditText[]{ (EditText)findViewById(R.id.et_name), (EditText)findViewById(R.id.et_contact), (EditText)findViewById(R.id.et_email) }; mListView = (ListView) findViewById(R.id.lv_list); } } </infoclass></infoclass> |
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5