1. 程式人生 > >登陸註冊(使用GreenDao)

登陸註冊(使用GreenDao)

在我們開發電商專案的過程中,我們肯定會涉及到使用者的登入,註冊業務,那麼我們也需要一個數據庫進行儲存使用者的個人資訊.今天我們就來搞一下,本次使用的是GreenDao;
GreenDao我在簡書上看到了一篇不錯的文章,過程也是非常詳細,在這裡分享給大家:https://www.jianshu.com/p/ec37ea99ef69
接下來就開始我們的工作.
第一步:搭建環境:
匯入我們需要的一些依賴,和網路許可權

/*android5.0的新特性使用*/
    implementation 'com.android.support:support-v13:28.0.0'
    implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0' implementation 'com.android.support:support-v13:28.0.0' /*OkHttp*/ implementation 'com.squareup.okhttp3:okhttp:3.4.2' /*RecyclerView*/ implementation 'com.android.support:recyclerview-v7:28.0.0' /*XRecyclerView*/ implementation 'com.jcodecraeer:xrecyclerview:1.5.9'
/*Fresco的基礎依賴*/ implementation 'com.facebook.fresco:fresco:0.14.1' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.nostra13.universalimageloader:universal-image-loader:1.9.5' /*GreenDao*/ implementation 'org.greenrobot:greendao:3.2.2' /*BottomTabBar*/ implementation 'com.hjm:BottomTabBar:1.1.1'
implementation 'com.gxz.pagerslidingtabstrip:library:1.3' implementation 'com.bigkoo:convenientbanner:2.0.5' /*三級聯動*/ implementation 'liji.library.dev:citypickerview:1.1.0'

網路許可權:

 <uses-permission android:name="android.permission.INTERNET" />

第二步:匯入GreenDao:
GreenDao使用中涉及到的註解:
(一) @Entity 定義實體
@nameInDb 在資料庫中的名字,如不寫則為實體中類名
@indexes 索引
@createInDb 是否建立表,預設為true,false時不建立
@schema 指定架構名稱為實體
@active 無論是更新生成都重新整理
(二) @Id
(三) @NotNull 不為null
(四) @Unique 唯一約束
(五) @ToMany 一對多
(六) @OrderBy 排序
(七) @ToOne 一對一
(八) @Transient 不儲存在資料庫中
(九) @generated 由greenDAO產生的建構函式或方法
在上面我給大家分享了一個連結,裡面有比較詳細的:下面我就簡單分享一下,在這個專案用到的一些相關程式碼:
在這裡插入圖片描述
1.匯入配置依賴

apply plugin: 'org.greenrobot.greendao'

android {
..........
    greendao {
        schemaVersion 1
        daoPackage 'com.greendao.gen'
        targetGenDir 'src/main/java'
    }
}

2.定義MyApplication類:

public class MyAppliction extends Application {

    public static MyAppliction instances;
    private DaoMaster.DevOpenHelper mHelper;
    private SQLiteDatabase db;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    @Override
    public void onCreate() {
        super.onCreate();
        //Fresco
        Fresco.initialize(this);

        instances = this;
        setDatabase();
    }

    public static MyAppliction getInstances() {
        return instances;
    }

    /**
     *設定greenDAO
     */
    private void setDatabase() {// 通過 DaoMaster 的內部類 DevOpenHelper,你可以得到一個便利的 SQLiteOpenHelper 物件。
        // 可能你已經注意到了,你並不需要去編寫「CREATE TABLE」這樣的 SQL 語句,因為 greenDAO已經幫你做了。
        // 注意:預設的 DaoMaster.DevOpenHelper 會在資料庫升級時,刪除所有的表,意味著這將導致資料的丟失。
        // 所以,在正式的專案中,你還應該做一層封裝,來實現資料庫的安全升級。
        mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
        db = mHelper.getWritableDatabase();
        // 注意:該資料庫連線屬於 DaoMaster,所以多個 Session 指的是相同的資料庫連線。
        mDaoMaster = new DaoMaster(db);
        mDaoSession = mDaoMaster.newSession();
    }
    public DaoSession getDaoSession() {
        return mDaoSession;
    }
    public SQLiteDatabase getDb() {
        return db;
    }
}

3.清單檔案註冊:

<application
        android:name=".MyApplication.MyAppliction"
    </application>

4.建立User實體類:

@Entity
public class UserDao {
    @Property(nameInDb = "USERID")
    private String userId;
    @Property(nameInDb = "SESSIONID")
    private String sessionId;
    @Property(nameInDb = "NIKENAME")
    private String nickName;
    @Property(nameInDb = "PHONE")
    private String phone;
    @Property(nameInDb = "HEADPIC")
    private String headPic;
    @Property(nameInDb = "SEX")
    private int sex;
    @Generated(hash = 626129925)
    public UserDao(String userId, String sessionId, String nickName, String phone,
            String headPic, int sex) {
        this.userId = userId;
        this.sessionId = sessionId;
        this.nickName = nickName;
        this.phone = phone;
        this.headPic = headPic;
        this.sex = sex;
    }
    @Generated(hash = 917059161)
    public UserDao() {
    }
    public String getUserId() {
        return this.userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getSessionId() {
        return this.sessionId;
    }
    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }
    public String getNickName() {
        return this.nickName;
    }
    public void setNickName(String nickName) {
        this.nickName = nickName;
    }
    public String getPhone() {
        return this.phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getHeadPic() {
        return this.headPic;
    }
    public void setHeadPic(String headPic) {
        this.headPic = headPic;
    }
    public int getSex() {
        return this.sex;
    }
    public void setSex(int sex) {
        this.sex = sex;
    }
   

}

5.編譯專案(Android快捷鍵:Ctrl+F9),User實體類會自動編譯,生成get、set方法並且會在com.greendao.gen目錄下生成三個檔案,並且還會在我們的包下生成DaoMaster和DaoSession。
在這裡插入圖片描述

第三步:這裡把我們用到的介面,可以單獨提取出來:


    //登入
    public static final String loginPath = "http://172.17.8.100/small/user/v1/login";
    //註冊
    public static final String registerPath = "http://172.17.8.100/small/user/v1/register";

第四步:具體的登入註冊業務邏輯處理:
1.登入:

package com.job.heavenandearth.activity;


/**
 * --------------------登入頁面------------------------------
 * 1.首先獲取輸入框的賬號和密碼
 * 2.判斷輸入是否為空
 * 2.1 : 如果為空,則提示使用者輸入不能為空
 * 2.2: 如果輸入不為空則進行判斷
 * 3.判斷賬號密碼是否存在
 * 3.1 : 存在則登陸成功
 * 3.2 : 如果賬號輸入錯誤,提示使用者賬號並不存在,先進行註冊,再登入
 * 3.2 : 如果賬號輸入正確,密碼輸入錯誤,則提示使用者密碼輸入錯誤,請重新輸入
 */
public class LoginActivity extends BaseActivity {

    private EditText login_edit_phone;
    private CheckBox login_cb_remember_pwd;
    private EditText login_edit_pwd;
    private TextView login_tv_register;
    private Button login_button_login,login_button_not_login;
    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor mEdit;
    private ImageView img_eye;
    private boolean isHideFirst;

    @Override
    protected int setView() {
        return R.layout.activity_login;

    }

    //初始化控制元件
    @Override
    protected void initViews() {
        login_edit_phone = findViewById(R.id.login_edit_phone);
        login_edit_pwd = findViewById(R.id.login_edit_pwd);
        login_cb_remember_pwd = findViewById(R.id.login_cb_remember_pwd);
        login_tv_register = findViewById(R.id.login_tv_register);
        login_button_login = findViewById(R.id.login_button_login);
        login_button_not_login = findViewById(R.id.login_button_not_login);
        img_eye = findViewById(R.id.img_eye);
        sharedPreferences = getSharedPreferences("lz", MODE_PRIVATE);
        mEdit = sharedPreferences.edit();

        //設定密碼回顯
        boolean ismain_check_remember = sharedPreferences.getBoolean("isjzmm", false);
        String username = sharedPreferences.getString("phone", "");
        String password = sharedPreferences.getString("pwd", "");
        if (ismain_check_remember) {
            login_cb_remember_pwd.setChecked(true);
            login_edit_phone.setText(username);
            login_edit_pwd.setText(password);
        }

    }

    @Override
    protected void initData() {

        ////////////////////////顯示和隱藏密碼////////////////////////////////
        img_eye.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isHideFirst == true) {
                    //密文

                    HideReturnsTransformationMethod method1 = HideReturnsTransformationMethod.getInstance();
                    login_edit_pwd.setTransformationMethod(method1);
                    isHideFirst = false;
                    img_eye.setImageResource(R.mipmap.biyan);
                } else {
                    //密文
                    TransformationMethod method = PasswordTransformationMethod.getInstance();
                    login_edit_pwd.setTransformationMethod(method);
                    isHideFirst = true;
                    img_eye.setImageResource(R.mipmap.login_icon_eye_n);
                }
                // 游標的位置
                int index = login_edit_pwd.getText().toString().length();
                login_edit_pwd.setSelection(index);

            }

        });
        /////////////////////////////////////暫不登陸//////////////////////////////
        login_button_not_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this,HomePagerActivity.class));
            }
        });
        ///////////////////////////////////////註冊/////////////////////////////////
        //如果使用者為新使用者,需要註冊後再進行登入登入
        login_tv_register.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this, RegisterActivity.class));
            }
        });

        /////////////////////////////////////////登入//////////////////////////////////////
        //點選登入,跳轉到首頁
        login_button_login.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {



                //獲取輸入的賬號和密碼
                String phone = login_edit_phone.getText().toString().trim();
                String pwd = login_edit_pwd.getText().toString().trim();


                //判斷是否記住密碼
                if (login_cb_remember_pwd.isChecked()) {
                    mEdit.putString("phone", phone);
                    mEdit.putString("pwd", pwd);
                    mEdit.putBoolean("isjzmm", true);
                    mEdit.commit();
                } else {
                    mEdit.putString("phone", "");
                    mEdit.putString("pwd", "");
                    mEdit.putBoolean("isjzmm", false);
                    mEdit.commit();
                }

                //判斷輸入的是否為空
                boolean lzNull = M_Login.isNull(phone, pwd);
                if (lzNull) {
                    Toast.makeText(LoginActivity.this, "使用者名稱或密碼不能為空", Toast.LENGTH_SHORT).show();
                } else {
                    M_Login.getinstance().getHttp(phone, pwd, new P_Login() {
                        @Override
                        public void success(LoginBean loginBean) {
                            if (loginBean.getStatus().equals("0000")) {

                                UserDaoDao userDaoDao = MyAppliction.getInstances().getDaoSession().getUserDaoDao();
                                List<UserDao> userDaos = userDaoDao.loadAll();
                                if (userDaos.size() != 0) {
                                    userDaoDao.deleteAll();
                                } else {

                                }

                                UserDao userDao = new UserDao(loginBean.getResult().getUserIdWithString(), loginBean.getResult().getSessionId(),
                                        loginBean.getResult().getNickName(), loginBean.getResult().getPhone(),
                                        loginBean.getResult().getHeadPic(), loginBean.getResult().getSex());

                                long id = userDaoDao.insertOrReplace(userDao);

                                Log.i("TEST", "insert user: " + id);

                                 Toast.makeText(LoginActivity.this, "登入成功", Toast.LENGTH_SHORT).show();

                                //更新購物車
                                ShoppingCart.getInstance().load();
                                Intent intent = new Intent(LoginActivity.this, HomePagerActivity.class);
                                intent.putExtra("userid",userDao.getUserId()+"");
                                intent.putExtra("sessid",userDao.getSessionId());
                                startActivity(intent);
                            } else {
                                Toast.makeText(LoginActivity.this, loginBean.getMessage(), Toast.LENGTH_SHORT).show();
                            }
                        }

                        @Override
                        public void defeated(Exception e) {
                            Toast.makeText(LoginActivity.this, "請進行註冊!!", Toast.LENGTH_SHORT).show();
                        }

                    });
                }
            }
        });
    }
}

2.M層封裝網路請求:

package com.job.heavenandearth.model;
import android.text.TextUtils;
import com.google.gson.Gson;
import com.job.heavenandearth.bean.LoginBean;
import com.job.heavenandearth.net.Api;
import com.job.heavenandearth.persenter.P_Load;
import com.job.heavenandearth.persenter.P_Login;
import com.job.heavenandearth.util.OkHttpUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * date:2018/12/5
 * author:李壯(大壯)
 * function:-------------------OkHttp二次封裝-----------------
 *          登入使用
 */
public class M_Login {

    private static M_Login mM_login;
    private M_Login(){};
    public static M_Login getinstance(){
        if (mM_login == null){
            synchronized (M_Login.class){
                if (mM_login == null){
                    mM_login = new M_Login();
                }
            }
        }
        return mM_login;
    }
    public void getHttp(String phone, String pwd, final P_Login p_login){
        Map<String,String> map = new HashMap<>();
        map.put("phone",phone);
        map.put("pwd",pwd);
        OkHttpUtils.getInstance().doPost(Api.loginPath,map, new P_Load() {
            @Override
            public void success(String json) {
                LoginBean loginBean = new Gson().fromJson(json, LoginBean.class);
                if (p_login != null){
                    p_login.success(loginBean);
                }
            }

            @Override
            public void defeated(Exception e) {
                if (p_login != null){
                    p_login.defeated(e);
                }
            }

        });
    }
    //判斷輸入是否為空
    public static boolean isNull(String phone,String pwd){
        if (TextUtils.isEmpty(phone) || TextUtils.isEmpty(pwd)){
            return true;
        }
        return false;
    }
}

3.P層:負責V層與M層的互動

package com.job.heavenandearth.persenter;

import com.job.heavenandearth.bean.LoginBean;

/**
 * date:2018/12/5
 * author:李壯(大壯)
 * function:----------------登入的介面回撥----------------
 */
public interface P_Login {
    void success(LoginBean loginBean);
    void defeated(Exception e);
}

4.OkHttp二次封裝:

package com.job.heavenandearth.util;
/**
 * date:2018/12/4
 * author:李壯(大壯)
 * function:------------------OkHttp的二次封裝--------------
 *  主要功能:用於網路請求
 */
public class OkHttpUtils {

    private static OkHttpUtils mOkHttpUtils;

    private Handler mHandler;
    private OkHttpClient mOkHttpClient;
    private UserDaoDao mUserDaoDao;
    private List<UserDao> mUserDaos;
    private String mSessionId;
    private String mUserId;
    private String mHeadPic;
    private String mNickName;
    private int mSex;
    private String mPhone;

    //建立一個私有的構造引數
    public OkHttpUtils(){
        //建立一個主執行緒handler
        mHandler = new Handler(Looper.getMainLooper());
        mOkHttpClient = new OkHttpClient.Builder()
                .readTimeout(10,TimeUnit.SECONDS)
                .connectTimeout(10,TimeUnit.SECONDS)
                .writeTimeout(10,TimeUnit.SECONDS)
                .build();
    }

    //單例模式
    public static OkHttpUtils getInstance(){
        if (mOkHttpUtils == null){
            synchronized (OkHttpUtils.class){
                if (mOkHttpUtils == null){
                    mOkHttpUtils = new OkHttpUtils();
                }
            }
        }
        return mOkHttpUtils;
    }

    //介面回撥
    public interface onOkCallback{
        //成功
        void success(String json);
        //失敗
        void failtrue(Exception e);

    }

    //封裝doPost
    public void doPost(String url, Map<String,String> map, final P_Load okCallback){
        FormBody.Builder builder = new FormBody.Builder();
        if (map != null){
            for (String key : map.keySet()){
                builder.add(key,map.get(key));
            }
        }

        FormBody formBody = builder.build();

        //建立Request
        final Request request = new Request.Builder()
                .post(formBody)
                .url(url)
                .build();

        //建立call
        Call call = mOkHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                if (okCallback != null){
                    mHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            okCallback.defeated(e);
                        }
                    });
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    if (response != null && response.isSuccessful()){
                        final String json = response.body().string();
                        if (okCallback != null){
                            mHandler.post(new Runnable() {
                                @Override
                                public void run() {
                                    okCallback.success(json);
                                }
                            });
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }

            }
        });
    }
    //封裝doGet
    public void doGet(String url, final onOkCallback okCallback){
        mUserDaoDao = MyAppliction.getInstances().getDaoSession().getUserD