SQLite3.zip



0. Result

  





1. Remove Data


1-1. Create removeGuest method that removes a record from DB.

1-2. Create a new ItemTouchHelper that handles swiping guests off the list.

1-3. Set the tag of the RecyclerView item to the DB id of that guest.


MainActivity.java

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
package com.tistory.qlyh8.sqlite;
 
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
 
import com.tistory.qlyh8.sqlite.data.TestUtil;
import com.tistory.qlyh8.sqlite.data.WaitlistContract;
import com.tistory.qlyh8.sqlite.data.WaitlistDbHelper;
 
public class MainActivity extends AppCompatActivity {
 
    private GuestListAdapter mAdapter;
    RecyclerView waitlistRecyclerView;
    // SQL DB의 레퍼런스
    private SQLiteDatabase mDb;
 
    private EditText mNewGuestNameEditText;
    private EditText mNewPartySizeEditText;
 
    private final static String LOG_TAG = MainActivity.class.getSimpleName();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        waitlistRecyclerView = this.findViewById(R.id.all_guests_list_view);
        mNewGuestNameEditText = this.findViewById(R.id.person_name_edit_text);
        mNewPartySizeEditText = this.findViewById(R.id.party_count_edit_text);
 
        // 리사이클러뷰를 리니어 레이아웃으로 설정
        waitlistRecyclerView.setLayoutManager(new LinearLayoutManager(this));
 
        WaitlistDbHelper dbHelper = new WaitlistDbHelper(this);
        // 데이터를 DB에 채우기 위함
        mDb = dbHelper.getWritableDatabase();
        //커서에 결과를 저장
        Cursor cursor = getAllGuests();
 
        // 데이터를 표시할 커서를 위한 어댑터 생성
        mAdapter = new GuestListAdapter(this, cursor);
        // 리사이클러뷰에 어댑터를 연결
        waitlistRecyclerView.setAdapter(mAdapter);
 
        // 목록에서 항목을 왼쪽, 오른쪽 방향으로 스와이프 하는 항목을 처리
        new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            // 사용하지 않는다.
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }
 
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                // 스와이프된 아이템의 아이디를 가져온다.
                long id = (long) viewHolder.itemView.getTag();
                // DB 에서 해당 아이디를 가진 레코드를 삭제한다.
                removeGuest(id);
                // 리스트를 갱신한다.
                mAdapter.swapCursor(getAllGuests());
            }
        }).attachToRecyclerView(waitlistRecyclerView);  //리사이클러뷰에 itemTouchHelper 를 붙인다.
    }
 
    // 등록하기 버튼을 눌렀을 때 불리는 메서드
    public void addToWaitlist(View view) {...}
 
    /*
    * Cursor 는 SQL 쿼리의 결과물이 저장되어 있는 것이다.
    * 반복문으로 쉽게 확인할 수 있다.
    * */
    // 손님의 목록을 보여주기 위해 시간 순서대로 결과를 보여준다.
    private Cursor getAllGuests() {...}
 
    // 새 데이터를 추가하는 메서드로, 추가되는 레코드의 아이디를 리턴한다.
    private long addNewGuest(String name, int partySize) {...}
 
    // 특정 아이디를 가진 레코드를 삭제
    private boolean removeGuest(long id) {
        // 성공적인 삭제이면 true 를 리턴하고, 실패하면 false 를 리턴한다.
        return mDb.delete(WaitlistContract.WaitlistEntry.TABLE_NAME, WaitlistContract.WaitlistEntry._ID + "=" + id, null> 0;
    }
}
 
cs



GuestListAdapter.java

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
package com.tistory.qlyh8.sqlite;
 
/*
 * Created by YUNHEE on 2018-01-06.
 */
 
import android.content.Context;
import android.database.Cursor;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
 
import com.tistory.qlyh8.sqlite.data.WaitlistContract;
 
public class GuestListAdapter extends RecyclerView.Adapter<GuestListAdapter.GuestViewHolder>{
 
    private Context mContext;
    private Cursor mCursor;
 
    public GuestListAdapter(Context context, Cursor cursor) {...}
 
    @Override
    public GuestViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {...}
 
    // 포지션을 입력 받아서 해당 데이터를 UI에 출력
    @Override
    public void onBindViewHolder(GuestViewHolder holder, int position) {
        // 해당 포지션으로 이동한다.
        // false 가 리턴되면 데이터가 없거나 혹은 범위를 초과했다는 뜻이다.
        if(!mCursor.moveToPosition(position))
            return;
        // 열의 이름으로 열의 번호를 넘겨줌
        String name = mCursor.getString(mCursor.getColumnIndex(WaitlistContract.WaitlistEntry.COLUMN_GUEST_NAME));
        int partySize = mCursor.getInt(mCursor.getColumnIndex(WaitlistContract.WaitlistEntry.COLUMN_PARTY_SIZE));
        // 현재 커서에서 아이디를 가져온다.
        long id = mCursor.getLong(mCursor.getColumnIndex(WaitlistContract.WaitlistEntry._ID));
 
        holder.nameTextView.setText(name);
        holder.partySizeTextView.setText(String.valueOf(partySize));
        // 홀더에 있는 아이템뷰의 태그를 id로 설정
        holder.itemView.setTag(id);
    }
 
    @Override
    public int getItemCount() {...}
 
    // 어댑터에 현재 보관되고 있는 커서를 새로운 것으로 바꿔 UI를 갱신한다.
    public void swapCursor(Cursor newCursor) {...}
 
    // 리사이클러뷰 내에서 단일의 아이템을 표시하는데 필요한 뷰를 보관 및 유지하는 내부 클래스
    class GuestViewHolder extends RecyclerView.ViewHolder {...}
}
 
cs





Android Course of Udacity - Lesson 7

+ Recent posts