본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-04-20안드로이드 스튜디오(데이터베이스 reaml 활용 )

728x90
반응형

오늘은 수업과 별개로 안드로이드에서 제공하는 데이터 베이스를 한번 다뤄 볼것이다. 

외부 라이브러리를 추가하여 사용하는 데이터 베이스이고 기존 데이터 베이스에서 사용하는 문법들을 몰라도 

자바형식으로 된 reaml 이라는것을 사용해 어제 배운내용과 연동하여 볼것이다. 

 

1. 제일먼저 외부 라이브러리를 추가

이 두곳에 각각 추가해주어야 한다 .

첫번째 그래들 

이렇게 두개를 추가해주면 이제 사용할 준비가 끝난 것이다. (이것을 업데이트 될떄 마다 변경될 가능성 있음) 

 

자바 파일과 xml 이다. 

Member //데이터베이스에서 테이블형태로 사용하기위함 

내가 만들것은 로그인 페이지 , 회원가입페이지 , 메인 페이지 이렇게 3가지를 만들것이다.

Member 클래스

//데이터베이스에서 테이블형태로 사용하기위하여 extends RealmObject 상속
public class Member extends RealmObject {
    //프라이머리키 각자가 가지는 고유의 값 
    @PrimaryKey
    private int id;
    
    // Required는 데이터가 꼭 들어 가야한다는 의미 
    @Required
    private String name,email,password;
    @Required
    private Integer age;
    
    
    //getter 와 Setter
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

어댑터 클래스 

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
    //어레이 리스트와 같은 역활 
    RealmResults<Member> mDataset;

    public MyAdapter(RealmResults<Member> mDataset) {
        this.mDataset = mDataset;
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
        holder.mname.setText(mDataset.get(position).getName());
        holder.mAge.setText(mDataset.get(position).getAge() + "세");
        holder.mEmail.setText(mDataset.get(position).getEmail());
    }

    @Override
    public int getItemCount() {
        return mDataset.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        TextView mname;
        TextView mAge;
        TextView mEmail;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
            this.mname = itemView.findViewById(R.id.info_text);
            this.mAge = itemView.findViewById(R.id.info_age);
            this.mEmail = itemView.findViewById(R.id.info_email);
        }

    }
}

메인 클래스 

// 빌드 그래이드 랑 내가 만든 빌드 에 추가해준거 있음 이따 정리
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
    Realm realm;
    RecyclerView recyclerView;
    
    TextView tvNotice;
    //질의 하다 query 질의 할떄 사용 되는 것 
    RealmQuery<Member> query;
    //데이터 가져올떄 사용 되는것 
    RealmResults<Member> results;
    MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        realm.init(this); // 초기화
        
        //테이블이 변경 되었을때 다시 만들겠다
        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder().deleteRealmIfMigrationNeeded().build();
        
        Realm.setDefaultConfiguration(realmConfiguration); // 설정사항 저장

        tvNotice = findViewById(R.id.tv_notice);
        Button btDelete = findViewById(R.id.bt_delete);
        Button btJoin = findViewById(R.id.bt_join);
        Button btLogin = findViewById(R.id.bt_login);

        recyclerView = findViewById(R.id.my_recycler_view);

        realm = Realm.getDefaultInstance();// 이런식으로 Realm 의 인스턴스 생성
        query = realm.where(Member.class);
        results = query.findAll();
        results.sort("id", Sort.DESCENDING);//내림차순 //Sort.ASCENDING오름차순 (디폴트값이 오름차순 )
        
        //어댑터 리사이클뷰에 장착 
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);
        adapter = new MyAdapter(results);
        recyclerView.setAdapter(adapter);
        
        //버튼 참조 
        btJoin.setOnClickListener(this);
        btLogin.setOnClickListener(this);
        btDelete.setOnClickListener(this);
        
        // 뭐였지? 낼 물어보고 다시 정리 
        results.addChangeListener(new RealmChangeListener<RealmResults<Member>>() {
            @Override
            public void onChange(RealmResults<Member> members) {
                adapter.notifyDataSetChanged();
            }
        });
    }

    @Override // 로그인액티비티에서 데이터 받아오기 
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case 0:
            if(resultCode == RESULT_OK){
                String name = data.getStringExtra("name");
                String email = data.getStringExtra("Email");
                tvNotice.setText(name+"("+email+")으로 로그인 했습니당당");
            }else {
                Toast.makeText(this,"취소",Toast.LENGTH_LONG).show();
            }
            break;
        }
            }
    
            // 버튼 
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.bt_join: // 회원가입버튼
                Intent joinintent = new Intent(this, JoinActivity.class);
                startActivity(joinintent);
                break;

            case R.id.bt_login: // 로그인 버튼
                Intent Loginintent = new Intent(this, LoginActivity.class);
                startActivityForResult(Loginintent,0);
                break;

            case R.id.bt_delete: // 삭제 버튼 
                realm.executeTransactionAsync(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                     // 여기서는 첫번째 것 삭제로 했는데 이건 에디트 택스트로 비교하여 삭제도 가능    
                    Member member = realm.where(Member.class).findFirst();
                        if (member != null) {
                            member.deleteFromRealm();
                        }else {
                            return;
                        }
                    }
                });
                break;
        }
    }
}

회원 가입 클래스 

public class JoinActivity extends AppCompatActivity {

    TextView tv_name,tv_age ,tv_email, tv_password;
    Realm realm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_join);

        tv_name = findViewById(R.id.tv_name);
        tv_age = findViewById(R.id.tv_age);
        tv_email = findViewById(R.id.tv_email);
        tv_password = findViewById(R.id.tv_password);

        Button bt_Ok = findViewById(R.id.bt_join_ok);
        Button bt_cancel = findViewById(R.id.bt_join_cancel);
        
        //realm 인스턴스화 
        realm = Realm.getDefaultInstance();
        
        bt_Ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //이름 ,나이,이메일,패스워드 가 비었다면 필수 학목 비었다고 출력 
                if(tv_name.getText().toString().isEmpty()||tv_age.getText().toString().isEmpty()||
                tv_email.getText().toString().isEmpty()||tv_password.getText().toString().isEmpty()){
                    Toast.makeText(getApplicationContext(),"필수 항목이 비어 있습니다옳",Toast.LENGTH_LONG).show();
                    return;
                }else {
                    insertDatabase(); //아래 메소드 호출 
                    finish();
                }
            }
        });
        //취소버튼
        bt_cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
    //데이터베이스에 데이터 담는 작업 
    void insertDatabase(){
        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                //고유 아이디값을 주기 위한 작업 현재 최대 id 값을 가져와 1씩 늘려서 데이터마다 고유 아이디 추가 
                Number num = realm.where(Member.class).max("id");
                if (num == null) {
                    num = 1 ;
                }else {
                    num =num.intValue()+1;
                }
                //Member 객체 만들어서 각각의 정보를 담아주고 있다. 
                Member member = realm.createObject(Member.class,num);
                member.setName(tv_name.getText().toString());
                member.setAge(Integer.parseInt(tv_age.getText().toString()));
                member.setEmail(tv_email.getText().toString());
                member.setPassword(tv_password.getText().toString());
            }
        });

    }

    @Override //메모리상에 남이 았을수 있어서 종료 해줌 
    protected void onDestroy() {
        super.onDestroy();
        realm.close();
    }
}

로그인 클래스 

public class LoginActivity extends AppCompatActivity {
    EditText etEmail , etPassword;
    Realm realm;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        etEmail= findViewById(R.id.et_email);
        etPassword = findViewById(R.id.et_password);
        Button bt_Login = findViewById(R.id.bt_login_ok);

        //인스턴스화
        realm = Realm.getDefaultInstance();

        bt_Login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                RealmQuery<Member> query = realm.where(Member.class);
                // email이라는 변수와 에디트 택스트 변수를 비교하여 같으면 result에 담아주기
                RealmResults<Member> results = query.equalTo("email",etEmail.getText().toString()).findAll();
                if (results.size()==0){
                    //result가 0 이라면 같은 값이 없다는 뜻
                    Toast.makeText(getApplicationContext(),"일치하는 회원정보가 없습니다.",Toast.LENGTH_LONG).show();
                }else {
                    // 인덱스 0 번째 값을 비교하여 패스워드와 같다면 아래 내용 실행 다르다면 비밀번호 틀렸다고 출력
                    if(results.get(0).getPassword().equals(etPassword.getText().toString())){
                        Intent intent =new Intent();
                        intent.putExtra("name", results.get(0).getName());
                        intent.putExtra("Email",results.get(0).getEmail());
                        setResult(RESULT_OK,intent);
                        finish();
                    }else {
                        Toast.makeText(getApplicationContext(),"비밀번호가 틀렷습니당당",Toast.LENGTH_LONG).show();
                    }
                }
            }
        });

    }

 

이렇게 작성해주게 되면 다음과 같이 작동한다 

 

 

 

잘 작동 되는거만 찍고 ... 정작 데이터 베이스는 못찍었네... 사진으로 보자... 

이렇게 데이터가 있는 상태에서 원래 종료를 하면 없어지고 처음 화면 부터 시작되어야 하지만 

이렇게 기존의 데이터가 남아있는것을 확인 할수 있다. 

 

오늘은 여기까지~ 뿅~!!!!

728x90
반응형