도서관리 앱 개발
- 새프로젝트 생성(소스 코드 : googledrive/소스코드/AppTestZ_201612345.zip)
- Target Android Devices : Phone and Table(API 15 이상 선택)
- Add and Activity to Mobile : Navigation Drawer Activity
- /layout/content_main.xml 수정
12345678910111213141516171819202122<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:ads="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:context="kr.co.moak.proj001address.MainActivity"tools:showIn="@layout/app_bar_main"><FrameLayoutandroid:id="@+id/container"android:layout_width="0dp"android:layout_height="0dp"app:layout_constraintBottom_toTopOf="parent"app:layout_constraintLeft_toLeftOf="parent"app:layout_constraintRight_toRightOf="parent"app:layout_constraintTop_toTopOf="parent"></FrameLayout></android.support.constraint.ConstraintLayout>- TextView를 삭제하고 FrameLayout을 추가
- FrameLayout의 id를 container로 지정
- MainActivity.java : ft.replace(R.id.container, fragRegister);와 같이 ft.replace()에서사용
- layout_width : match_parent
- layout_height : match_parent
- /menu/activity_main_drawer.xml 수정
123456789101112131415161718192021222324252627282930313233343536<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:showIn="navigation_view"><group android:checkableBehavior="single"><itemandroid:id="@+id/nav_register"android:title="Register" /><itemandroid:id="@+id/nav_list"android:title="List" /><itemandroid:id="@+id/nav_slideshow"android:icon="@drawable/ic_menu_slideshow"android:title="Slideshow" /><itemandroid:id="@+id/nav_manage"android:icon="@drawable/ic_menu_manage"android:title="Tools" /></group><item android:title="Communicate"><menu><itemandroid:id="@+id/nav_share"android:icon="@drawable/ic_menu_share"android:title="Share" /><itemandroid:id="@+id/nav_send"android:icon="@drawable/ic_menu_send"android:title="Send" /></menu></item></menu> - /layout/frag_register_book.xml 만들기
- FragRegisterBook.java 만들기
12345678910public class FragRegisterBook extends android.support.v4.app.Fragment{@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_register_book, container, false);return view;}} - /layout/frag_book_list 와 /layout/frag_book_listitem 만들기
- FragListBook.java 만들기
12345678910public class FragListBook extends android.support.v4.app.Fragment{@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_book_list, container, false);return view;}} - MainActivity.java의 onNavigationItemSelected() 메서드 수정
123456789101112131415161718192021222324@SuppressWarnings("StatementWithEmptyBody")@Overridepublic boolean onNavigationItemSelected(MenuItem item) {// Handle navigation view item clicks here.int id = item.getItemId();FragmentTransaction ft = getSupportFragmentManager().beginTransaction();;if (id == R.id.nav_register) {Fragment fragRegister = new FragRegisterBook();ft.replace(R.id.container, fragRegister);ft.commit();} else if (id == R.id.nav_list) {Fragment fragList = new FragListBook();ft.replace(R.id.container, fragList);ft.commit();} else if (id == R.id.nav_camera) {}DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);drawer.closeDrawer(GravityCompat.START);return true;} - MainDBHelper 만들기
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051public class MainDBHelper extends SQLiteOpenHelper {private Context context;private static final int DB_VER = 1;public MainDBHelper(Context context) {super(context, "mydb.db", null, DB_VER);this.context = context;}// Book 테이블 생성private void f_CreateTable_Book(SQLiteDatabase db) {String sql = "";// 테이블 삭제try {db.execSQL("drop table if exists `book`");} catch (Exception ex) {Log.e("MYTAG", "Exception in DROP_SQL", ex);}// 테이블 생성try {sql = "CREATE TABLE `book` ("+ " `_id` INTEGER PRIMARY KEY AUTOINCREMENT"+ ", `name` TEXT"+ ", `auth` TEXT"+ ", `publ` TEXT"+ ", `pric` INTEGER"+ ");";Log.v("MYTAG", sql);db.execSQL(sql);} catch (Exception ex) {Log.e("MYTAG", "SQL : " + sql + "\nException in CREATE_SQL", ex);}}@Overridepublic void onCreate(SQLiteDatabase db) {Log.v("MYTAG", "onCreate() 실행");f_CreateTable_Book(db);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {Log.v("MYTAG", "Upgrading database from version " + oldVersion + " to " + newVersion + ".");f_CreateTable_Book(db);}} - BookDTO 만들기
12345678910111213141516public class BookDTO {public int _id;public String name = "";public String auth = "";public String publ = "";public int pric = 0;public BookDTO(){}public BookDTO(String name, String auth, String publ, int pric){this.name = name;this.auth = auth;this.publ = publ;this.pric = pric;}} - BookDAO 만들기
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364public class BookDAO {private String tableName = "book";private Context m_context;public BookDAO(Context context) {this.m_context = context;}// DB연결 메소드public SQLiteDatabase getConn() {MainDBHelper dbHelper = new MainDBHelper(m_context);SQLiteDatabase db = dbHelper.getWritableDatabase();return db;}// 정보 1개 등록public int insertRecord(BookDTO dto) {ContentValues recordValues = new ContentValues();recordValues.put("name", dto.name);recordValues.put("auth", dto.auth);recordValues.put("publ", dto.publ);recordValues.put("pric", dto.pric);SQLiteDatabase db = getConn();int rowPosition = 0;try {Log.v("MYTAG", "inserted");rowPosition = (int) db.insert(tableName, null, recordValues);//db.execSQL("insert into " + tableName + " (id, passwd, name) values ('John', 20, '010-7788-1234');");} catch (SQLiteException e){e.printStackTrace();}db.close();return rowPosition;}// insertRecord()// 테이블 전체 내용을 ArrayList로public ArrayList<BookDTO> getArrayList() {ArrayList<BookDTO> arList = new ArrayList<BookDTO>();SQLiteDatabase db = getConn();String sql;Cursor cursor;// 목록 작성 시작sql = "SELECT * FROM `" + tableName + "` ORDER BY `name` ASC ;";cursor = db.rawQuery(sql, null);while(cursor.moveToNext()){BookDTO dto = new BookDTO();dto._id = cursor.getInt(cursor.getColumnIndexOrThrow("_id"));dto.name = cursor.getString(cursor.getColumnIndexOrThrow("name"));dto.auth = cursor.getString(cursor.getColumnIndexOrThrow("auth"));dto.publ = cursor.getString(cursor.getColumnIndexOrThrow("publ"));dto.pric = cursor.getInt(cursor.getColumnIndexOrThrow("pric"));arList.add(dto);}cursor.close();// 목록 작성 끝return arList;}// getRecordDTO()} - FragRegisterBook 수정
1234567891011121314151617181920212223242526272829303132333435public class FragRegisterBook extends android.support.v4.app.Fragment implements View.OnClickListener{@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_register_book, container, false);((Button)view.findViewById(R.id.btnSave)).setOnClickListener(this);((Button)view.findViewById(R.id.btnCancel)).setOnClickListener(this);return view;}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.btnSave :String name = ((EditText)getView().findViewById(R.id.txtName)).getText().toString();String auth = ((EditText)getView().findViewById(R.id.txtAuth)).getText().toString();String publ = ((EditText)getView().findViewById(R.id.txtPubl)).getText().toString();int pric = Integer.parseInt(((EditText)getView().findViewById(R.id.txtPric)).getText().toString());BookDTO dto = new BookDTO(name, auth, publ, pric);BookDAO dao = new BookDAO(getContext());dao.insertRecord(dto);break;case R.id.btnCancel :((EditText)getView().findViewById(R.id.txtName)).setText("");((EditText)getView().findViewById(R.id.txtAuth)).setText("");((EditText)getView().findViewById(R.id.txtPubl)).setText("");((EditText)getView().findViewById(R.id.txtPric)).setText("");break;}}} - BookAdapter 만들기
12345678910111213141516171819202122232425262728293031323334353637383940414243444546public class BookAdapter extends BaseAdapter {Context context;ArrayList<BookDTO> arList;LayoutInflater mInflater;BookAdapter(Context context, ArrayList<BookDTO> arList) {this.context = context;this.arList = arList;mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View row = mInflater.inflate(R.layout.frag_book_listitem, parent, false);final String name = arList.get(position).name;final String auth = arList.get(position).auth;final String publ = arList.get(position).publ;final String pric = arList.get(position).pric + "";((TextView) row.findViewById(R.id.txtName)).setText(name);((TextView) row.findViewById(R.id.txtAuth)).setText(auth);((TextView) row.findViewById(R.id.txtPubl)).setText(publ);((TextView) row.findViewById(R.id.txtPric)).setText(pric);return row;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn arList.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn arList.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}} - FragListBook 수정
12345678910111213141516171819public class FragListBook extends android.support.v4.app.Fragment{ArrayList<BookDTO> arList;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_book_list, container, false);BookDTO dto = new BookDTO();BookDAO dao = new BookDAO(getContext());arList = dao.getArrayList();ListView listView = view.findViewById(R.id.lstView);BookAdapter adapter = new BookAdapter(this.getContext(), arList);listView.setAdapter(adapter);return view;}} - 수정, 삭제 추가 부분 시작
- BookDTO에 생성자 1개 추가
123456789101112131415161718192021public class BookDTO {public int _id;public String name = "";public String auth = "";public String publ = "";public int pric = 0;public BookDTO(){}public BookDTO(String name, String auth, String publ, int pric){this.name = name;this.auth = auth;this.publ = publ;this.pric = pric;}public BookDTO(int _id, String name, String auth, String publ, int pric){this(name, auth, publ, pric);this._id = _id;}} - BookDAO에 메서드 추가
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566public class BookDAO {///////////////////////////////////////// 기존 소스 뒤에 추가///////////////////////////////////////// 정보 1개 수정public int updateRecord(BookDTO dto) {ContentValues recordValues = new ContentValues();recordValues.put("name", dto.name);recordValues.put("auth", dto.auth);recordValues.put("publ", dto.publ);recordValues.put("pric", dto.pric);String[] whereArgs = new String[]{dto._id+""};SQLiteDatabase db = getConn();int rowAffected = 0;try {rowAffected = db.update(tableName, recordValues, "`_id` = ?", whereArgs);//db.execSQL("update " + tableName + " set passwd='1234' where name='John';");} catch (SQLiteException e){e.printStackTrace();}db.close();return rowAffected;}// updateRecord()// 정보 삭제public int deleteRecord(int id) {String[] whereArgs = new String[]{id+""};SQLiteDatabase db = getConn();int rowAffected = 0;try {rowAffected = db.delete(tableName, "`_id` = ?", whereArgs);//where id=? and name=? : ? 개수만큼 {id, name...}//db.execSQL("delete from " + tableName + " where name='John';");} catch (SQLiteException e){e.printStackTrace();}db.close();return rowAffected;}// deleteRecord()// 테이블에서 _id가 id인 레코드를 DTO로 리턴public BookDTO getRecord(int id) {BookDTO dto = new BookDTO();SQLiteDatabase db = getConn();String sql;Cursor cursor;sql = "SELECT * FROM `" + tableName + "` WHERE `_id` = " + id + ";";cursor = db.rawQuery(sql, null);while(cursor.moveToNext()){dto._id = cursor.getInt(cursor.getColumnIndexOrThrow("_id"));dto.name = cursor.getString(cursor.getColumnIndexOrThrow("name"));dto.auth = cursor.getString(cursor.getColumnIndexOrThrow("auth"));dto.publ = cursor.getString(cursor.getColumnIndexOrThrow("publ"));dto.pric = cursor.getInt(cursor.getColumnIndexOrThrow("pric"));break;}cursor.close();// 목록 작성 끝return dto;}// getRecord()} - /layout/frag_detail_book.xml 만들기(frag_register_book.xml 복사하여 수정)
- FragDetailBook 클래스 만들기
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253public class FragDetailBook extends android.support.v4.app.Fragment implements View.OnClickListener{int m_id;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_detail_book, container, false);Bundle bundle = getArguments();m_id = bundle.getInt("id");BookDAO dao = new BookDAO(getContext());BookDTO dto = dao.getRecord(m_id);((EditText)view.findViewById(R.id.txtName)).setText(dto.name);((EditText)view.findViewById(R.id.txtAuth)).setText(dto.auth);((EditText)view.findViewById(R.id.txtPubl)).setText(dto.publ);((EditText)view.findViewById(R.id.txtPric)).setText(dto.pric + "");((Button)view.findViewById(R.id.btnUpdate)).setOnClickListener(this);((Button)view.findViewById(R.id.btnDelete)).setOnClickListener(this);((Button)view.findViewById(R.id.btnCancel)).setOnClickListener(this);return view;}@Overridepublic void onClick(View view) {BookDAO dao = new BookDAO(getContext());switch (view.getId()){case R.id.btnUpdate :String name = ((EditText)getView().findViewById(R.id.txtName)).getText().toString();String auth = ((EditText)getView().findViewById(R.id.txtAuth)).getText().toString();String publ = ((EditText)getView().findViewById(R.id.txtPubl)).getText().toString();int pric = Integer.parseInt(((EditText)getView().findViewById(R.id.txtPric)).getText().toString());BookDTO dto = new BookDTO(m_id, name, auth, publ, pric);dao.updateRecord(dto);break;case R.id.btnDelete :dao.deleteRecord(m_id);break;case R.id.btnCancel :break;}FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();Fragment fragment = new FragListBook();ft.replace(R.id.container, fragment);ft.commit();}} - FragListBook 에서 FragDetailBook 호출하는 부분 추가
123456789101112131415161718192021222324252627282930313233public class FragListBook extends android.support.v4.app.Fragment{ArrayList<BookDTO> arList;@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view = inflater.inflate(R.layout.frag_book_list, container, false);BookDTO dto = new BookDTO();BookDAO dao = new BookDAO(getContext());arList = dao.getArrayList();ListView listView = view.findViewById(R.id.lstView);BookAdapter adapter = new BookAdapter(this.getContext(), arList);listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//Toast.makeText(getContext(), ""+arList.get(position).name, Toast.LENGTH_SHORT).show();Fragment fragDetail = new FragDetailBook();Bundle bundle = new Bundle();bundle.putInt("id", arList.get(position)._id);fragDetail.setArguments(bundle);FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();ft.replace(R.id.container, fragDetail);ft.commit();}});return view;}}