Android開發學習筆記整理(12)-SQLiteOpenHelper、SQLiteDatabase、execSQL和增刪改查

SQLiteOpenHelper

作用:

用於管理數據庫鏈接

兩個方法:

  • (1) onCreate
  • (2) onUpgrade

SQLiteDatabase

作用:

相當於數據庫/鏈接

分類:

ReadableDatabase、WritableDatabase

如何獲取:

通過SQLiteOpenHeIper獲取

execSQL

作用:

執行數據庫語句

使用:

編寫完整的SQL語句,然後執行

缺陷:

  • (1) 對於SQL語句要求高
  • (2) 沒有返回值

insert、delete、update、 query

insert:

  • (1) insert參數的意義
  • (2) ContentValues
  • (3) insert翻譯成SQL語句

delete:

  • (1) delete參數的意義
  • (2) delete翻譯成SQL語句

update:

  • (1) update參數的意義
  • (2) update翻譯成SQL語句

query:

  • (1) query參數的意義
  • (2) query翻譯成SQL語句

保存密碼進階版

  • SharedPreferences自動保存密碼的缺點
  • SQLite數據版本自動保存密碼

SD卡文件操作

SD卡文件操作的實質:

使用流進行文件讀寫

權限申請:

  • (1) MOUNT_UNMOUNT_FILESYSTEMS:創建和刪除文件權限
  • (2) WRITE_EXTERNAL_STORAGE
  • (3) READ_EXTERNAL_STORAGE

幾個重要的方法:

  • (1) getExternaIStorageState:獲取SD卡狀態
  • (2) getRootDirectory:獲取Android Root路徑
  • (3) getDataDirectory:獲取data目錄
  • (4) getDownloadCacheDirectory:獲取緩存目錄

使用流完成讀寫操作

ContentProvider

什麼是ContentProvider?

用於提供外部應用訪問本應用數據庫的接口

自定義ContentProvider

什麼是ContentResolver?

用於訪問其他應用程序數據的類

使用ContentResolver

代碼部分:

part1:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="showSQLite"
        android:text="演示SQLite"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:onClick="showRememberPwd"
        android:text="演示記住密碼功能"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/button" />

</androidx.constraintlayout.widget.ConstraintLayout>

效果圖:

在這裏插入圖片描述

activity_db_demo.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".DBDemoActivity">

    <EditText
        android:id="@+id/username"
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:layout_marginTop="100dp"
        android:ems="10"
        android:hint="請輸入用戶名"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/password"
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="請輸入密碼"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="@+id/username"
        app:layout_constraintStart_toStartOf="@+id/username"
        app:layout_constraintTop_toBottomOf="@+id/username" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:onClick="writeData"
        android:text="寫入"
        app:layout_constraintStart_toStartOf="@+id/password"
        app:layout_constraintTop_toBottomOf="@+id/password" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="readData"
        android:text="讀取"
        app:layout_constraintEnd_toEndOf="@+id/password"
        app:layout_constraintTop_toTopOf="@+id/button2" />

</androidx.constraintlayout.widget.ConstraintLayout>

效果圖:

在這裏插入圖片描述

UserDBHelper.java

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
public class UserDBHelper extends SQLiteOpenHelper {

    //數據庫版本號
    private static final int VERSION = 1;
    //數據庫的名稱
    public static  final String DB_NAME = "demo";

    /**
     * 簡化後的DBHelper
     * @param context
     */
    public UserDBHelper(@Nullable Context context) {
        super(context, DB_NAME, null, VERSION);
    }

    /**
     * 構造方法
     * @param context 上下文
     * @param name 數據庫的名字
     * @param factory 遊標的創建方式,沒有特殊要求,傳null
     * @param version 創建時數據庫的版本號,版本號只能往上升,不能往下降
     */
    public UserDBHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    /**
     * 第一次初始化數據庫時自動回調的函數,通常在這裏會做一些數據庫表的創建等
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        //創建初始化的數據表
        String sql = "create table if not exists t_user(id integer primary key autoincrement, username varchar not null, password varchar not null)";
        db.execSQL(sql);
    }

    /**
     * 在數據庫版本更新的時候自動回調的函數,通常在這裏做一些更新數據庫表的操作
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
    
}

User.java

public class User {

    private int id;

    private String username;

    private String password;

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

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

user_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:id="@+id/userId"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

    <TextView
        android:id="@+id/username"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

    <TextView
        android:id="@+id/password"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />

    <Button
        android:id="@+id/deleteButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="刪除" />

    <Button
        android:id="@+id/editButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="編輯" />
    
</LinearLayout>

效果圖:

在這裏插入圖片描述

activity_user_list.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UserListActivity">

    <ListView
        android:id="@+id/userList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
    
</androidx.constraintlayout.widget.ConstraintLayout>

效果圖:

在這裏插入圖片描述

activity_user_edit.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".UserEditActivity">

    <EditText
        android:id="@+id/username"
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:layout_marginTop="100dp"
        android:ems="10"
        android:hint="請輸入用戶名"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/password"
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="請輸入密碼"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="@+id/username"
        app:layout_constraintStart_toStartOf="@+id/username"
        app:layout_constraintTop_toBottomOf="@+id/username" />

    <Button
        android:id="@+id/saveButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="保存"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/password" />
    
</androidx.constraintlayout.widget.ConstraintLayout>

效果圖:

在這裏插入圖片描述

UserEditActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class UserEditActivity extends AppCompatActivity {

    private EditText username;

    private EditText password;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_edit);

        username = findViewById(R.id.username);
        password = findViewById(R.id.password);

        Intent intent = getIntent();
        String usernameString = intent.getStringExtra("username");
        String passwordString = intent.getStringExtra("password");
        final int id = intent.getIntExtra("id", 0);

        username.setText(usernameString);
        password.setText(passwordString);

        findViewById(R.id.saveButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 保存數據
                UserDBHelper userDBHelper = new UserDBHelper(UserEditActivity.this);
                SQLiteDatabase database = userDBHelper.getWritableDatabase();
                /*
                 * String table->表名
                 * ContentValues values->更新的字段
                 * String whereClause->where後面的條件
                 * String[] whereArgs->where後面的條件的參數
                 * */
                ContentValues contentValues = new ContentValues();
                contentValues.put("username", username.getText().toString());
                contentValues.put("password", password.getText().toString());
                database.update("t_user", contentValues, "id=?", new String[]{""+id});
                finish();
            }
        });
    }
    
}

UserAdapter.java

import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import java.util.List;
public class UserAdapter extends BaseAdapter {

    private List<User> data;

    private Context context;

    private LayoutInflater inflater;

    public UserAdapter(List<User> data, Context context) {
        this.data = data;
        this.context = context;
        this.inflater = LayoutInflater.from(context);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.user_item, null);
            viewHolder = new ViewHolder();
            viewHolder.userId = convertView.findViewById(R.id.userId);
            viewHolder.username = convertView.findViewById(R.id.username);
            viewHolder.password = convertView.findViewById(R.id.password);
            viewHolder.button = convertView.findViewById(R.id.deleteButton);
            viewHolder.editButton = convertView.findViewById(R.id.editButton);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        final User user = data.get(position);
        viewHolder.userId.setText(user.getId()+"");
        viewHolder.username.setText(user.getUsername());
        viewHolder.password.setText(user.getPassword());

        //點擊編輯按鈕,跳轉編輯界面
        viewHolder.editButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(context, UserEditActivity.class);
                intent.putExtra("id", user.getId());
                intent.putExtra("username", user.getUsername());
                intent.putExtra("password", user.getPassword());
                context.startActivity(intent);
            }
        });

        //給按鈕綁定點擊事件,用於刪除信息
        viewHolder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                UserDBHelper userDBHelper = new UserDBHelper(context);
                SQLiteDatabase database = userDBHelper.getWritableDatabase();
                /*
                 * String table->表名
                 * String whereClause->where後面的條件,例如:delete from t_user where id=1,whereClause就是id=?
                 * String[] whereArgs->where語句的參數,例如:delete from t_user where id=1,whereArgs就是id=1的1
                 * */
                /*
                 * 數組的創建:
                 *   1.String[] demo = new String[10];
                 *   2.String[] demo = {"xx","xx"};
                 *   3.String[] demo = new String[]{"xx","xx"};
                 * */
                String id = user.getId()+"";
                database.delete("t_user","id=?", new String[]{id});
                Toast.makeText(context, "刪除成功", Toast.LENGTH_SHORT).show();
            }
        });

        return convertView;
    }

    class ViewHolder{
        public TextView userId;
        public TextView username;
        public TextView password;
        public Button button;
        public Button editButton;
    }

}

UserListActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class UserListActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_list);

        // 初始化數據
        UserDBHelper userDBHelper = new UserDBHelper(this);
        SQLiteDatabase database = userDBHelper.getReadableDatabase();
        Cursor cursor = database.query("t_user",null,null,null,null,null,null);
        List<User> userList = new ArrayList<>();
        while(cursor.moveToNext()) {
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String username = cursor.getString(cursor.getColumnIndex("username"));
            String password = cursor.getString(cursor.getColumnIndex("password"));

            User user = new User(id,username,password);
            userList.add(user);
        }

        // 初始化ListView
        ListView listView = findViewById(R.id.userList);
        UserAdapter userAdapter = new UserAdapter(userList, this);
        listView.setAdapter(userAdapter);
    }

}

DBDemoActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class DBDemoActivity extends AppCompatActivity {

    //用戶名
    private EditText username;
    //密碼
    private EditText password;
    //數據庫Helper
    private UserDBHelper userDBHelper;

    private static final String TAG = "DBDemoActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_db_demo);

        //初始化數據
        this.username = findViewById(R.id.username);
        this.password = findViewById(R.id.password);
        this.userDBHelper = new UserDBHelper(this);
    }

    /**
     * 寫入數據
     * @param view
     */
    public void writeData(View view){
        //向t_user中寫數據:1.創建一個t_user,2.執行SQL
//        userDBHelper.getReadableDatabase(); //獲取讀數據庫的鏈接,在磁盤滿的情況下,不會報錯,只不過只能讀取數據
//        userDBHelper.getWritableDatabase(); //獲取寫數據庫的鏈接,在磁盤滿的情況下,獲取該鏈接會報錯
        //獲取SQLiteDatabase
        SQLiteDatabase sqLiteDatabase = userDBHelper.getWritableDatabase(); //第一次調用的時候,若沒有數據庫,則會創建數據庫

        String username = this.username.getText().toString().trim();
        String password = this.password.getText().toString().trim();

        /*
         *  execSQL沒有返回值,對於SQL語句掌握的比較好的話,可以直接手寫SQL來執行
         *  insert有返回值,簡化SQL語句的編寫
         * */
//        String sql = "INSERT INTO t_user (username, PASSWORD) VALUES ('"+username+"','"+password+"')";
//        sqLiteDatabase.execSQL(sql);
        /*
         * String table -> 要插入的數據庫表
         * String nullColumnHack -> 可以爲空的字段名
         * ContentValues values -> 插入的數據,key:value,username:"張三"
         * */
        ContentValues contentValues = new ContentValues();
        contentValues.put("username", username); //key:字段名,value:值
        contentValues.put("password", password);
        long row = sqLiteDatabase.insert("t_user", null, contentValues);
        if (row != -1) {
            Toast.makeText(this, "插入數據成功", Toast.LENGTH_SHORT).show();
        }
        sqLiteDatabase.close();
    }

    /**
     * 讀取數據
     * @param view
     */
    public void readData(View view) {

        //1.讀取數據
        SQLiteDatabase database = userDBHelper.getReadableDatabase();
        /*
         * String table -> 表名
         * String[] columns -> 字段名,若爲null,則查詢所有的,即*
         * String selection -> where語句後面的條件,比如:SELECT * FROM t_user WHERE id = 1; selection就是id=?
         * String[] selectionArgs -> where條件的值,比如:SELECT * FROM t_user WHERE id = 1; selectionArgs就是new String[]{"1"}
         * String groupBy -> 分組,groupBy
         * String having -> having
         * String orderBy -> 排序
         *
         * */
        // select * from t_user
        Cursor cursor = database.query("t_user", null, null, null, null, null, null);

        List<User> userList = new ArrayList<>();
        while(cursor.moveToNext()) {
            int index = cursor.getColumnIndex("id");
            int id  = cursor.getInt(index);
            String username = cursor.getString(cursor.getColumnIndex("username"));
            String password = cursor.getString(cursor.getColumnIndex("password"));

            User user = new User(id, username, password);
            userList.add(user);
        }

        //2.跳轉界面展示
        Intent intent = new Intent(this, UserListActivity.class);
//        intent.putExtra("userList", userList);
        startActivity(intent);
    }

}

效果圖:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

part2:

MainActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    /**
     * 用於演示SQLites數據庫的使用
     * @param view
     */
    public void showSQLite(View view){
        Intent intent = new Intent(this, DBDemoActivity.class);
        startActivity(intent);
    }

    /**
     * 用於演示記住密碼功能
     * @param view
     */
    public void showRememberPwd(View view) {
        Intent intent = new Intent(this, RememberPwdActivity.class);
        startActivity(intent);
    }

}

activity_remember_pwd.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".RememberPwdActivity">

    <EditText
        android:id="@+id/et_username"
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:layout_marginTop="100dp"
        android:ems="10"
        android:hint="請輸入用戶名"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/et_password"
        android:layout_width="300dp"
        android:layout_height="50dp"
        android:layout_marginTop="30dp"
        android:ems="10"
        android:hint="請輸入密碼"
        android:inputType="textPassword"
        app:layout_constraintEnd_toEndOf="@+id/et_username"
        app:layout_constraintStart_toStartOf="@+id/et_username"
        app:layout_constraintTop_toBottomOf="@+id/et_username" />

    <CheckBox
        android:id="@+id/cb_remember"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="15dp"
        android:text="記住密碼"
        app:layout_constraintStart_toStartOf="@+id/et_password"
        app:layout_constraintTop_toBottomOf="@+id/et_password" />

    <Button
        android:id="@+id/loginButton"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_marginTop="100dp"
        android:text="登錄"
        app:layout_constraintEnd_toEndOf="@+id/et_password"
        app:layout_constraintStart_toStartOf="@+id/et_password"
        app:layout_constraintTop_toBottomOf="@+id/et_password" />

</androidx.constraintlayout.widget.ConstraintLayout>

效果圖:

在這裏插入圖片描述

RememberPwdActivity.java

import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.EditText;
public class RememberPwdActivity extends AppCompatActivity {

    private EditText et_username;
    private EditText et_password;
    private CheckBox cb_remember;
    private UserDBHelper userDBHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_remember_pwd);

        et_username = findViewById(R.id.et_username);
        et_password = findViewById(R.id.et_password);
        cb_remember = findViewById(R.id.cb_remember);
        userDBHelper = new UserDBHelper(this);

        //聚焦事件
        et_password.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    String username = et_username.getText().toString().trim();
                    //查詢數據庫
                    SQLiteDatabase database = userDBHelper.getReadableDatabase();
                    Cursor cursor = database.query("t_user", null, "username=?", new String[]{username}, null,null,null);
                    User user = null;
                    while(cursor.moveToNext()) {
                        int id = cursor.getInt(cursor.getColumnIndex("id"));
                        String name = cursor.getString(cursor.getColumnIndex("username"));
                        String pwd = cursor.getString(cursor.getColumnIndex("password"));
                        user = new User(id, name, pwd);
                    }
                    if (user != null) {
                        //記住密碼的用戶,進行密碼填充
                        et_password.setText(user.getPassword());
                        //勾選checkbox
                        cb_remember.setChecked(true);
                    } else {
                        et_password.setText("");
                        cb_remember.setChecked(false);
                    }
                    //關閉數據庫連接
                    database.close();
                }
            }
        });

        //登錄
        findViewById(R.id.loginButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //前提是登錄成功了
                if (cb_remember.isChecked()) {
                    String username = et_username.getText().toString().trim();
                    //查詢數據庫
                    SQLiteDatabase database = userDBHelper.getReadableDatabase();
                    Cursor cursor = database.query("t_user", null, "username=?", new String[]{username}, null,null,null);
                    User user = null;
                    while(cursor.moveToNext()) {
                        int id = cursor.getInt(cursor.getColumnIndex("id"));
                        String name = cursor.getString(cursor.getColumnIndex("username"));
                        String pwd = cursor.getString(cursor.getColumnIndex("password"));
                        user = new User(id, name, pwd);
                    }
                    //以前就存在,做更新操作
                    if(user != null) {
                        ContentValues contentValues = new ContentValues();
                        contentValues.put("password", et_password.getText().toString().trim());
                        database.update("t_user",contentValues, "username=?", new String[]{username});
                    } else {
                        //以前不存在,插入操作
                        ContentValues contentValues = new ContentValues();
                        contentValues.put("username", username);
                        contentValues.put("password", et_password.getText().toString().trim());
                        database.insert("t_user", null, contentValues);
                    }

                    database.close();
                }
            }
        });

    }

    /*
     * 1.輸入用戶名,點擊輸入密碼->查詢數據庫,查看是否記住了密碼,若記住,則填充密碼
     * 2.輸入用戶名,點擊輸入密碼->查詢數據庫,查看是否記住了密碼,若沒記住,不做操作
     * 3.輸入用戶名、密碼,勾選記住密碼點擊登錄->登錄成功,向數據庫中存儲密碼
     * */

}

效果圖:

在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章