新聞中心
安卓數(shù)據(jù)庫(kù)注冊(cè)登錄代碼教程全解析

隨著移動(dòng)互聯(lián)網(wǎng)的普及,移動(dòng)應(yīng)用的開(kāi)發(fā)變得越來(lái)越重要。而在移動(dòng)應(yīng)用中,用戶(hù)注冊(cè)登錄是最基礎(chǔ)、也是最通用的功能,是每個(gè)應(yīng)用必須要解決的問(wèn)題。而在安卓應(yīng)用中,如何實(shí)現(xiàn)用戶(hù)注冊(cè)和登錄功能呢?就需要用到安卓數(shù)據(jù)庫(kù)技術(shù)了。
本文將為大家詳細(xì)介紹安卓數(shù)據(jù)庫(kù)注冊(cè)登錄代碼的實(shí)現(xiàn)方法,包括數(shù)據(jù)庫(kù)的創(chuàng)建、表結(jié)構(gòu)的設(shè)計(jì)、代碼的編寫(xiě)等多個(gè)方面。
之一步:創(chuàng)建數(shù)據(jù)庫(kù)
在安卓應(yīng)用中,使用 SQLite 嵌入式數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)存儲(chǔ),可以輕松地實(shí)現(xiàn)注冊(cè)登錄功能。而要使用 SQLite 數(shù)據(jù)庫(kù),就需要先創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。
創(chuàng)建數(shù)據(jù)庫(kù)需要以下步驟:
1. 創(chuàng)建 DatabaseHelper 類(lèi)
在創(chuàng)建數(shù)據(jù)庫(kù)之前,需要先定義一個(gè) DatabaseHelper 類(lèi),用于管理數(shù)據(jù)庫(kù)的創(chuàng)建、升級(jí)等操作。在客戶(hù)端應(yīng)用程序中,一般會(huì)有多個(gè) Activity,如果每個(gè) Activity 都進(jìn)行數(shù)據(jù)庫(kù)的創(chuàng)建和操作,會(huì)產(chǎn)生不必要的重復(fù)勞動(dòng),造成代碼冗余。而通過(guò)這個(gè) DatabaseHelper 類(lèi),可以將數(shù)據(jù)庫(kù)的創(chuàng)建和操作集中起來(lái),實(shí)現(xiàn)了數(shù)據(jù)和業(yè)務(wù)的邏輯分離,提供了良好的代碼組織方式。
“`kotlin
class DataBaseHelper(context: Context) : SQLiteOpenHelper(context,DATABASE_NAME,null, DATABASE_VERSION) {
companion object {
private val DATABASE_NAME = “sample.db”
private val DATABASE_VERSION = 1
}
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(UserDataSQL.SQL_CREATE_TABLE)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
db.execSQL(UserDataSQL.SQL_DELETE_TABLE)
onCreate(db)
}
}
“`
以上代碼中,我們定義了一個(gè)名為 DataBaseHelper 的類(lèi),繼承自 SQLiteOpenHelper。其中,DATABASE_NAME 表示數(shù)據(jù)庫(kù)名稱(chēng),DATABASE_VERSION 表示數(shù)據(jù)庫(kù)版本號(hào)。還重載了 onCreate() 和 onUpgrade() 方法,onCreate() 方法會(huì)在之一次創(chuàng)建數(shù)據(jù)庫(kù)時(shí)執(zhí)行,用于創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu);而 onUpgrade() 方法用于更新數(shù)據(jù)庫(kù)版本時(shí)執(zhí)行,可以根據(jù)不同的版本更新表結(jié)構(gòu)。需要注意的是,當(dāng)表發(fā)生變化時(shí),需要先刪除舊表再創(chuàng)建新表。
2. 調(diào)用 getWritableDatabase() 方法創(chuàng)建數(shù)據(jù)庫(kù)
在 BaseActivity 里加下面的代碼:
“`kotlin
var database: SQLiteDatabase? = null
val db: SQLiteDatabase
get() {
if (database == null) {
database = DBHelper(this).writableDatabase
}
return database!!
}
override fun onDestroy() {
super.onDestroy()
database?.close()
database = null
}
“`
以上代碼中,我們定義了一個(gè)名為 db 的變量,變量類(lèi)型為 SQLiteDatabase,旨在提供方便的獲取數(shù)據(jù)庫(kù)實(shí)例的方式。當(dāng)調(diào)用 db 對(duì)象時(shí),首先判斷 database 是否為 null,如果是,則通過(guò) DBHelper 類(lèi)獲取數(shù)據(jù)庫(kù)實(shí)例,否則直接返回 database 的實(shí)例,并且當(dāng) Activity 被銷(xiāo)毀時(shí)需要關(guān)閉數(shù)據(jù)庫(kù)。
第二步:設(shè)計(jì)表結(jié)構(gòu)
在創(chuàng)建好數(shù)據(jù)庫(kù)之后,還需要設(shè)計(jì)一個(gè)表結(jié)構(gòu),用于存儲(chǔ)用戶(hù)的信息,包括用戶(hù)名、密碼等。在安卓中,SQLite 數(shù)據(jù)庫(kù)提供了輕量級(jí)、快速的本地?cái)?shù)據(jù)存儲(chǔ)方案。SQLite 數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)的方式是關(guān)系型數(shù)據(jù)庫(kù),因此在設(shè)計(jì)表結(jié)構(gòu)時(shí)能夠使數(shù)據(jù)采用行列式的結(jié)構(gòu)進(jìn)行組織,表格中的每行表示一條記錄,表格中的每列則表示一種數(shù)據(jù)類(lèi)型。
在用戶(hù)登錄和注冊(cè)功能的場(chǎng)景中,一般需要存儲(chǔ)用戶(hù)的用戶(hù)名和密碼。因此我們可以設(shè)計(jì)一張名為 User 的表,表中包含三個(gè)字段:id、username、password。
在本文中,我們通過(guò) Kotlin 語(yǔ)言來(lái)實(shí)現(xiàn) SQLite 嵌入式數(shù)據(jù)庫(kù)的表創(chuàng)建。
UserData.kt
“`kotlin
class UserData {
var id: Int = 0
var username: String = “”
var password: String = “”
}
“`
UserDataSQL.kt
“`kotlin
object UserDataSQL{
private const val TABLE_NAME = “users”
private const val ID = “id”
private const val USERNAME = “username”
private const val PASSWORD = “password”
private const val SQL_CREATE_TABLE = “CREATE TABLE IF NOT EXISTS $TABLE_NAME ($ID INTEGER PRIMARY KEY AUTOINCREMENT, $USERNAME TEXT, $PASSWORD TEXT)”
private const val SQL_DELETE_TABLE = “DROP TABLE IF EXISTS $TABLE_NAME”
fun insert(user: UserData): Long {
val values = ContentValues()
values.put(USERNAME, user.username)
values.put(PASSWORD, user.password)
return db.insert(TABLE_NAME, null, values)
}
fun update(user: UserData): Int {
val values = ContentValues()
values.put(USERNAME, user.username)
values.put(PASSWORD, user.password)
val selection = “$ID = ?”
val selectionArgs = arrayOf(user.id.toString())
return db.update(TABLE_NAME, values, selection, selectionArgs)
}
fun deleteAll(): Int {
return db.delete(TABLE_NAME, null, null)
}
fun delete(user: UserData): Int {
val selection = “$ID = ?”
val selectionArgs = arrayOf(user.id.toString())
return db.delete(TABLE_NAME, selection, selectionArgs)
}
fun queryAll(): List {
val cursor = db.query(TABLE_NAME, null, null, null, null, null, null)
return cursorToUsers(cursor)
}
fun queryByUsername(username: String): List {
val selection = “$USERNAME = ?”
val selectionArgs = arrayOf(username)
val cursor = db.query(TABLE_NAME, null, selection, selectionArgs, null, null, null)
return cursorToUsers(cursor)
}
private fun cursorToUsers(cursor: Cursor): List {
val users = ArrayList()
while (cursor.moveToNext()) {
val user = UserData()
user.id = cursor.getInt(cursor.getColumnIndex(ID))
user.username = cursor.getString(cursor.getColumnIndex(USERNAME))
user.password = cursor.getString(cursor.getColumnIndex(PASSWORD))
users.add(user)
}
cursor.close()
return users
}
}
“`
以上是用戶(hù)表的具體代碼實(shí)現(xiàn),我們?cè)?UserData 類(lèi)中定義了用戶(hù)信息的三個(gè)字段(id、username、password)。而 UserDataSQL 類(lèi)則實(shí)現(xiàn)了對(duì)這三個(gè)字段的 CRUD(增、刪、改、查)操作。此類(lèi)中的靜態(tài)自執(zhí)行語(yǔ)句 SQL_CREATE_TABLE 用來(lái)定義表的結(jié)構(gòu),而 SQL_DELETE_TABLE 語(yǔ)句用來(lái)刪除表。
除此之外,還需要注意創(chuàng)建表格假如已經(jīng)存在,則不會(huì)重新創(chuàng)建,而是會(huì)直接退出。在這里,我們使用了 insert 命令來(lái)插入一條新的記錄,使用 update 命令來(lái)更新已有的記錄,使用 delete 命令來(lái)刪除記錄,使用 query 命令來(lái)查詢(xún)記錄。以上 5 個(gè)命令均是針對(duì) SQLite 數(shù)據(jù)庫(kù)的操作,具體用法可以參見(jiàn)官方文檔。
第三步:實(shí)現(xiàn)注冊(cè)和登錄
上述代碼實(shí)現(xiàn)了數(shù)據(jù)庫(kù)的創(chuàng)建和表結(jié)構(gòu)的設(shè)計(jì),但是沒(méi)有涉及到注冊(cè)登錄的業(yè)務(wù)邏輯。因此我們接下來(lái)來(lái)看一下怎么實(shí)現(xiàn)用戶(hù)注冊(cè)和登錄。
用戶(hù)名和密碼在注冊(cè)和登錄的過(guò)程中,需要通過(guò)用戶(hù)輸入來(lái)獲取。當(dāng)用戶(hù)注冊(cè)時(shí),對(duì)輸入的信息進(jìn)行插入操作;當(dāng)用戶(hù)登錄時(shí),對(duì)輸入的信息進(jìn)行查詢(xún)操作。
接下來(lái)看下面這兩個(gè)函數(shù):
“`kotlin
fun signUp(username: String, password: String) {
if (username.isNotEmpty() && password.isNotEmpty()) {
val users = UserDataSQL.queryByUsername(username)
if (users.isNotEmpty()) {
Toast.makeText(this, “用戶(hù)名已經(jīng)存在!”, Toast.LENGTH_SHORT).show()
} else {
val user = UserData()
user.username = username
user.password = password
UserDataSQL.insert(user)
Toast.makeText(this, “注冊(cè)成功!”, Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(this, “用戶(hù)名和密碼不能為空!”, Toast.LENGTH_SHORT).show()
}
}
fun signIn(username: String, password: String) {
if (username.isNotEmpty() && password.isNotEmpty()) {
val users = UserDataSQL.queryByUsername(username)
if (users.isEmpty()) {
Toast.makeText(this, “用戶(hù)名不存在!”, Toast.LENGTH_SHORT).show()
} else {
for (user in users) {
if (user.password == password) {
Toast.makeText(this, “登錄成功!”, Toast.LENGTH_SHORT).show()
return
}
}
Toast.makeText(this, “密碼不正確!”, Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(this, “用戶(hù)名和密碼不能為空!”, Toast.LENGTH_SHORT).show()
}
}
“`
以上代碼分別實(shí)現(xiàn)了用戶(hù)注冊(cè)和登錄的業(yè)務(wù)邏輯,其中 signUp() 函數(shù)用于用戶(hù)注冊(cè),signIn() 函數(shù)用于用戶(hù)登錄。當(dāng)用戶(hù)注冊(cè)時(shí),會(huì)先通過(guò)用戶(hù)名查詢(xún)數(shù)據(jù)庫(kù)中是否已經(jīng)存在該用戶(hù),如果沒(méi)有,則將該用戶(hù)的用戶(hù)名和密碼存入數(shù)據(jù)庫(kù)表中。而當(dāng)用戶(hù)登錄時(shí),會(huì)先通過(guò)用戶(hù)名查詢(xún)數(shù)據(jù)庫(kù)中是否存在該用戶(hù),如果不存在,則提示“用戶(hù)名不存在”;如果存在,則將該用戶(hù)的密碼和輸入的密碼進(jìn)行比較,如果密碼相同,則提示“登錄成功”,否則提示“密碼不正確”。
需要注意的是,以上代碼純粹為了演示數(shù)據(jù)庫(kù)的業(yè)務(wù)邏輯,實(shí)際應(yīng)用開(kāi)發(fā)中需要優(yōu)化代碼、加入容錯(cuò)機(jī)制、進(jìn)行網(wǎng)絡(luò)安全性等處理。
結(jié)語(yǔ)
相關(guān)問(wèn)題拓展閱讀:
- 如何實(shí)現(xiàn)登陸操作安卓sqlite
- 網(wǎng)站登錄代碼怎么寫(xiě)
如何實(shí)現(xiàn)登陸操作安卓sqlite
首先寫(xiě)javabean
由于該類(lèi)很簡(jiǎn)單,只是定義id,username,password,age,sex,所以在此不在給出!直接說(shuō)service層業(yè)務(wù)類(lèi)的代碼:
使用SQLiteOpenHelper抽象類(lèi)建立沒(méi)畝數(shù)據(jù)庫(kù)
抽象類(lèi)SQLiteOpenHelper用來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行版本管理,不是必須使用的。
為了實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)版本進(jìn)行管理, SQLiteOpenHelper 類(lèi)提供了兩個(gè)重要的方法 , 分別onCreate(SQLiteDatabasedb) 和 onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion)用于初次使用軟件時(shí)生成數(shù)據(jù)庫(kù)表,后者用于升級(jí)軟件時(shí)更新數(shù)據(jù)庫(kù)表結(jié)構(gòu)。
DatabaseHelper.java
public class DatabaseHelper extends SQLiteOpenHelper {
static String name=”user.db”;
static int dbVersion=1;
public DatabaseHelper(Context context) {
super(context, name, null, dbVersion);
}
//只弊察源在創(chuàng)建的時(shí)候用一次
public void onCreate(SQLiteDatabase db) {
String sql=”create table user(id integer primary key autoincrement,username varchar(20),password varchar(20),age integer,sex varchar(2))”;
db.execSQL(sql);
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
SQLiteDatabase.execSQL(String sql) 可以用來(lái)執(zhí)行非查詢(xún) SQL 指令,這些指令沒(méi)有結(jié)果
包括: CREATE TABLE / DROP TABLE / INSERT 等等
然后就是UserService.java實(shí)現(xiàn)對(duì)表的操作:
public class UserService {
private DatabaseHelper dbHelper;
public UserService(Context context){
dbHelper=new DatabaseHelper(context);
}
//登錄用
public boolean login(String username,String password){
SQLiteDatabase sdb=dbHelper.getReadableDatabase();
String sql=”租態(tài)select * from user where username=? and password=?”;
Cursor cursor=sdb.rawQuery(sql, new String{username,password});
if(cursor.moveToFirst()==true){
cursor.close();
return true;
}
return false;
}
//注冊(cè)用
public boolean register(User user){
SQLiteDatabase sdb=dbHelper.getReadableDatabase();
String sql=”insert into user(username,password,age,sex) values(?,?,?,?)”;
Object obj={user.getUsername(),user.getPassword(),user.getAge(),user.getSex()};
sdb.execSQL(sql, obj);
return true;
}
}
Android 使用游標(biāo) (Cursors) 來(lái)導(dǎo)航瀏覽查詢(xún)結(jié)果
游標(biāo) (Cursors) 被 android.database.Cursor 對(duì)象來(lái)描述
一個(gè)游標(biāo) (Cursors) 是一個(gè)簡(jiǎn)單的指針,它從查詢(xún)結(jié)果的一
一個(gè)或是 …… )
游標(biāo) (Cursors) 在它定位位置的那一刻返回元組數(shù)據(jù)
有以下代碼來(lái)解釋?zhuān)?/p>
// 為了創(chuàng)建一個(gè) Cursor( 游標(biāo) ) ,必須執(zhí)行一個(gè)查詢(xún),要么通過(guò) SQL 使用 rawQuery() 方法
// 或是更精心設(shè)計(jì)的方法,像 query() 方法
Cursor cur=my_DataBase.rawQuery( “SELECT * FORM test” , null null null null );
ifififif (cur!= null null null null ){ // 游標(biāo)不為空
// 返回給定名稱(chēng)的列的基于 0 開(kāi)始的 index ,如果該屬性列不存在則返回 -1
// 通過(guò)它們的 index 來(lái)檢索屬性值
int int int int numColumn=cur.getColumnIndex( “someNumber” );
ifififif (cur. moveToFirst() ){
// cur.moveToFirst() 讓游標(biāo)指向之一行, 如果游標(biāo)指向之一行,則返回 true
do {
int int int int num =cur.getInt(numColumn); / / 獲得當(dāng)前行該屬性的值
/ * Cursor 提供了不同的方法來(lái)回索不同的數(shù)據(jù)類(lèi)型
例如 getInt( int index)/getString( int index) 等等 */
/* 做一些事情 */
} while while while while (cur.moveToNext());
/ * 游標(biāo)移動(dòng)到下一行,如果游標(biāo)已經(jīng)通過(guò)了結(jié)果集中的最后,
即沒(méi)有行可以移動(dòng)時(shí),則返回 false */
// 其他可能移動(dòng)的是 previous() 和 first() 方法
}
}
最后要關(guān)閉游標(biāo)?。?!
下面是測(cè)試代碼:
public class UserTest extends AndroidTestCase {
public void datatest() throws Throwable{
DatabaseHelper dbhepler=new DatabaseHelper(this.getContext());
dbhepler.getReadableDatabase();
}
//注冊(cè)
public void registerTest() throws Throwable{
UserService uService=new UserService(this.getContext());
User user=new User();
user.setUsername(“renhaili”);
user.setPassword(“123”);
user.setAge(20);
user.setSex(“女”);
uService.register(user);
}
//登錄
public void loginTest() throws Throwable{
UserService uService=new UserService(this.getContext());
String username=”renhaili”;
String password=”123″;
boolean flag=uService.login(username, password);
if(flag){
Log.i(“TAG”,”登錄成功”);
}else{
Log.i(“TAG”,”登錄失敗”);
}
}
}
常見(jiàn)異常
android.database.sqlite.SQLiteException:Can’t upgrade read-only database from version 0 to 1:
這個(gè)錯(cuò)誤基本上都是sql有問(wèn)題導(dǎo)致的,仔細(xì)檢查sql即可。
最后想說(shuō):在寫(xiě)好了實(shí)現(xiàn)類(lèi)以后更好再寫(xiě)這個(gè)測(cè)試類(lèi)來(lái)測(cè)試一下,不然以后碰到錯(cuò)很麻煩,所以把所有的測(cè)試都通過(guò)了,再寫(xiě)界面和activity,界面和activity的代碼就不給出了,源碼地址給出,有興趣的同學(xué)可以下載來(lái)參考參考?。?!
網(wǎng)站登錄代碼怎么寫(xiě)
yonghu=request.Form(“yonghu”)
mima= request.Form(“mima”)
SqlStr = “select * from Where yonghu=”&yonghu&” and mima=”旁悔& mima &” order by id desc”談旦
Set Rs = Server.CreateObject(“adodb.recordset”)
Rs.Open SqlStr, Conn, 1, 1
IF Not(Rs.bof and Rs.EOF) Then
response.write(“登陸成功含啟擾”)
Else
response.write(“登陸失敗”)
End If
Rs.close
安卓數(shù)據(jù)庫(kù)注冊(cè)登錄代碼怎么寫(xiě)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于安卓數(shù)據(jù)庫(kù)注冊(cè)登錄代碼怎么寫(xiě),「安卓數(shù)據(jù)庫(kù)注冊(cè)登錄代碼」教程全解析,如何實(shí)現(xiàn)登陸操作安卓sqlite,網(wǎng)站登錄代碼怎么寫(xiě)的信息別忘了在本站進(jìn)行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級(jí)標(biāo)準(zhǔn)機(jī)房資源,具備完善的安防設(shè)施、三線(xiàn)及BGP網(wǎng)絡(luò)接入帶寬達(dá)10T,機(jī)柜接入千兆交換機(jī),能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運(yùn)行;創(chuàng)新互聯(lián)專(zhuān)注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶(hù)的一致認(rèn)可。
本文名稱(chēng):「安卓數(shù)據(jù)庫(kù)注冊(cè)登錄代碼」教程全解析(安卓數(shù)據(jù)庫(kù)注冊(cè)登錄代碼怎么寫(xiě))
分享網(wǎng)址:http://www.dlmjj.cn/article/ccssejs.html


咨詢(xún)
建站咨詢(xún)
