一、为什么要用SQLite
1.不需要一个单独的服务器进程或操作的系统(无服务器的)。
2.SQLite 不需要配置,这意味着不需要安装或管理。
3.一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
4.SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
5.SQLite 是自给自足的,这意味着不需要任何外部的依赖。
6.SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
7.SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
8.SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
9.SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
二、什么是SQLite
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
三、如何创建数据库和数据表
1.SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。 SQLiteOpenHelper 是一个抽象类
2.SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑
3.SQLiteOpenHelper中还有两个非常重要的实例方法, getReadableDatabase()和getWritableDatabase()这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
(参考:SQLite)
四、创建注册登录的布局,利用SQLite进行注册登录
1、新建一个DBHelper 继承SQLiteOpenHelper
package com.example.mysql;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
///DATABASE_NAME数据库名称
private final static String DB_NAME = "Data.db";
///DATABASE_VERSION数据库版本
private final static int DATABASE_VERSION = 1;
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DB_NAME, factory, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
//创建表
String usersInfo_table = "create table usertable" +
"(id integer primary key autoincrement, username text," +
"password text)";
db.execSQL(usersInfo_table);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table usertable add column other string");
}
}
2、注册逻辑代码
package com.example.mysql;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class RegisterActivity extends AppCompatActivity implements View.OnClickListener {
private EditText account,pwd,re_pwd;
private Button btn_regist;
private DBHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
dbHelper = new DBHelper(this, "Data.db", null, 1);
initView();
}
private void initView() {
account = (EditText) findViewById(R.id.account);
pwd = (EditText) findViewById(R.id.pwd);
re_pwd = (EditText) findViewById(R.id.re_pwd);
btn_regist = (Button) findViewById(R.id.btn_regist);
btn_regist.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_regist) {
register();
}
}
///注册
private void register() {
///获取账号文本框的值
String accountString = account.getText().toString().trim();
if (TextUtils.isEmpty(accountString)) {
Toast.makeText(this, "accountString不能为空", Toast.LENGTH_SHORT).show();
return;
}
///获取密码文本框的值
String pwdString = pwd.getText().toString().trim();
if (TextUtils.isEmpty(pwdString)) {
Toast.makeText(this, "pwdString不能为空", Toast.LENGTH_SHORT).show();
return;
}
///获取确认密码文本框的值
String repwd = re_pwd.getText().toString().trim();
if (TextUtils.isEmpty(repwd)) {
Toast.makeText(this, "pwd不能为空", Toast.LENGTH_SHORT).show();
return;
}
///判断两次输入密码是否一致
if (pwdString.equals(repwd)) {
///检验用户名是否已经注册
if (CheckIsDataAlreadyInDBorNot(accountString)) {
Toast.makeText(this, "该用户名已被注册,注册失败", Toast.LENGTH_SHORT).show();
}else {
///进行数据库访问写入账号、密码
registerUserInfo(accountString,pwdString);
Toast.makeText(this, "注册成功!", Toast.LENGTH_SHORT).show();
Intent register_intent = new Intent(RegisterActivity.this,LoginActivity.class);
startActivity(register_intent);
}
} else {
Toast.makeText(this, "两次输入密码不同,请重新输入!",
Toast.LENGTH_SHORT).show();
}
}
/**
* 利用sql创建嵌入式数据库进行注册访问
*/
private void registerUserInfo(String username, String userpassword) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("username", username);
values.put("password", userpassword);
db.insert("usertable", null, values);
db.close();
}
/**
* 检验用户名是否已经注册
*/
private boolean CheckIsDataAlreadyInDBorNot(String value) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
String Query = "Select * from usertable where username =?";
Cursor cursor = db.rawQuery(Query, new String[]{value});
if (cursor.getCount() > 0) {
cursor.close();
return true;
}
cursor.close();
return false;
}
}
3、登录逻辑代码
package com.example.mysql;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
private EditText account;
private EditText pwd;
private Button btn_login;
private TextView btn_register;
private DBHelper dbHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();
}
private void initView() {
account = (EditText) findViewById(R.id.account);
pwd = (EditText) findViewById(R.id.pwd);
btn_login = (Button) findViewById(R.id.btn_login);
btn_register = (TextView) findViewById(R.id.btn_register);
btn_login.setOnClickListener(this);
btn_register.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_login:
///登录
login();
break;
case R.id.btn_register:
///跳转到注册页面
Intent login_intent = new Intent(LoginActivity.this,
RegisterActivity.class);
startActivity(login_intent);
break;
}
}
///登录代码逻辑
private void login() {
String accountString = account.getText().toString().trim();
if (TextUtils.isEmpty(accountString)) {
Toast.makeText(this, "请输入账号", Toast.LENGTH_SHORT).show();
return;
}
String pwdString = pwd.getText().toString().trim();
if (TextUtils.isEmpty(pwdString)) {
Toast.makeText(this, "请输入密码", Toast.LENGTH_SHORT).show();
}else {
///读取Data.db中的用户信息
readUserInfo();
}
}
/**
* 读取Data.db中的用户信息
* */
protected void readUserInfo() {
String accountString =
account.getText().toString().trim();
String pwdString = pwd.getText().toString().trim();
if (login(accountString, pwdString)) {
Toast.makeText(this, "登陆成功!", Toast.LENGTH_SHORT).show();
///验证成功,跳转到主页面
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
} else {
Toast.makeText(this, "账户或密码错误,请重新输入!!", Toast.LENGTH_SHORT).show();
}
}
/**
* 验证登录信息
* */
public boolean login(String username, String password) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
String sql = "Select * from usertable where username=? and password=?";
Cursor cursor = db.rawQuery(sql, new String[]{username, password});
if (cursor.moveToFirst()) {
cursor.close();
return true;
}
return false;
}
}
总结:
通过对SQLite的了解,如何创建数据库和数据表,还有注册登录的示例,就可以快速了解SQLite在Android的实际应用,当然这是初步了解,有什么问题或遇到什么bug的话,欢迎评论区留言评论。如果可以,我们一起继续深入学习吧!