登陸註冊(使用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