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

隨著移動互聯(lián)網(wǎng)的普及,移動應(yīng)用的開發(fā)變得越來越重要。而在移動應(yīng)用中,用戶注冊登錄是最基礎(chǔ)、也是最通用的功能,是每個應(yīng)用必須要解決的問題。而在安卓應(yīng)用中,如何實現(xiàn)用戶注冊和登錄功能呢?就需要用到安卓數(shù)據(jù)庫技術(shù)了。
本文將為大家詳細介紹安卓數(shù)據(jù)庫注冊登錄代碼的實現(xiàn)方法,包括數(shù)據(jù)庫的創(chuàng)建、表結(jié)構(gòu)的設(shè)計、代碼的編寫等多個方面。
之一步:創(chuàng)建數(shù)據(jù)庫
在安卓應(yīng)用中,使用 SQLite 嵌入式數(shù)據(jù)庫進行數(shù)據(jù)存儲,可以輕松地實現(xiàn)注冊登錄功能。而要使用 SQLite 數(shù)據(jù)庫,就需要先創(chuàng)建一個數(shù)據(jù)庫。
創(chuàng)建數(shù)據(jù)庫需要以下步驟:
1. 創(chuàng)建 DatabaseHelper 類
在創(chuàng)建數(shù)據(jù)庫之前,需要先定義一個 DatabaseHelper 類,用于管理數(shù)據(jù)庫的創(chuàng)建、升級等操作。在客戶端應(yīng)用程序中,一般會有多個 Activity,如果每個 Activity 都進行數(shù)據(jù)庫的創(chuàng)建和操作,會產(chǎn)生不必要的重復(fù)勞動,造成代碼冗余。而通過這個 DatabaseHelper 類,可以將數(shù)據(jù)庫的創(chuàng)建和操作集中起來,實現(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)
}
}
“`
以上代碼中,我們定義了一個名為 DataBaseHelper 的類,繼承自 SQLiteOpenHelper。其中,DATABASE_NAME 表示數(shù)據(jù)庫名稱,DATABASE_VERSION 表示數(shù)據(jù)庫版本號。還重載了 onCreate() 和 onUpgrade() 方法,onCreate() 方法會在之一次創(chuàng)建數(shù)據(jù)庫時執(zhí)行,用于創(chuàng)建數(shù)據(jù)庫表結(jié)構(gòu);而 onUpgrade() 方法用于更新數(shù)據(jù)庫版本時執(zhí)行,可以根據(jù)不同的版本更新表結(jié)構(gòu)。需要注意的是,當(dāng)表發(fā)生變化時,需要先刪除舊表再創(chuàng)建新表。
2. 調(diào)用 getWritableDatabase() 方法創(chuàng)建數(shù)據(jù)庫
在 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
}
“`
以上代碼中,我們定義了一個名為 db 的變量,變量類型為 SQLiteDatabase,旨在提供方便的獲取數(shù)據(jù)庫實例的方式。當(dāng)調(diào)用 db 對象時,首先判斷 database 是否為 null,如果是,則通過 DBHelper 類獲取數(shù)據(jù)庫實例,否則直接返回 database 的實例,并且當(dāng) Activity 被銷毀時需要關(guān)閉數(shù)據(jù)庫。
第二步:設(shè)計表結(jié)構(gòu)
在創(chuàng)建好數(shù)據(jù)庫之后,還需要設(shè)計一個表結(jié)構(gòu),用于存儲用戶的信息,包括用戶名、密碼等。在安卓中,SQLite 數(shù)據(jù)庫提供了輕量級、快速的本地數(shù)據(jù)存儲方案。SQLite 數(shù)據(jù)庫存儲數(shù)據(jù)的方式是關(guān)系型數(shù)據(jù)庫,因此在設(shè)計表結(jié)構(gòu)時能夠使數(shù)據(jù)采用行列式的結(jié)構(gòu)進行組織,表格中的每行表示一條記錄,表格中的每列則表示一種數(shù)據(jù)類型。
在用戶登錄和注冊功能的場景中,一般需要存儲用戶的用戶名和密碼。因此我們可以設(shè)計一張名為 User 的表,表中包含三個字段:id、username、password。
在本文中,我們通過 Kotlin 語言來實現(xiàn) SQLite 嵌入式數(shù)據(jù)庫的表創(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
}
}
“`
以上是用戶表的具體代碼實現(xiàn),我們在 UserData 類中定義了用戶信息的三個字段(id、username、password)。而 UserDataSQL 類則實現(xiàn)了對這三個字段的 CRUD(增、刪、改、查)操作。此類中的靜態(tài)自執(zhí)行語句 SQL_CREATE_TABLE 用來定義表的結(jié)構(gòu),而 SQL_DELETE_TABLE 語句用來刪除表。
除此之外,還需要注意創(chuàng)建表格假如已經(jīng)存在,則不會重新創(chuàng)建,而是會直接退出。在這里,我們使用了 insert 命令來插入一條新的記錄,使用 update 命令來更新已有的記錄,使用 delete 命令來刪除記錄,使用 query 命令來查詢記錄。以上 5 個命令均是針對 SQLite 數(shù)據(jù)庫的操作,具體用法可以參見官方文檔。
第三步:實現(xiàn)注冊和登錄
上述代碼實現(xiàn)了數(shù)據(jù)庫的創(chuàng)建和表結(jié)構(gòu)的設(shè)計,但是沒有涉及到注冊登錄的業(yè)務(wù)邏輯。因此我們接下來來看一下怎么實現(xiàn)用戶注冊和登錄。
用戶名和密碼在注冊和登錄的過程中,需要通過用戶輸入來獲取。當(dāng)用戶注冊時,對輸入的信息進行插入操作;當(dāng)用戶登錄時,對輸入的信息進行查詢操作。
接下來看下面這兩個函數(shù):
“`kotlin
fun signUp(username: String, password: String) {
if (username.isNotEmpty() && password.isNotEmpty()) {
val users = UserDataSQL.queryByUsername(username)
if (users.isNotEmpty()) {
Toast.makeText(this, “用戶名已經(jīng)存在!”, Toast.LENGTH_SHORT).show()
} else {
val user = UserData()
user.username = username
user.password = password
UserDataSQL.insert(user)
Toast.makeText(this, “注冊成功!”, Toast.LENGTH_SHORT).show()
}
} else {
Toast.makeText(this, “用戶名和密碼不能為空!”, 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, “用戶名不存在!”, 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, “用戶名和密碼不能為空!”, Toast.LENGTH_SHORT).show()
}
}
“`
以上代碼分別實現(xiàn)了用戶注冊和登錄的業(yè)務(wù)邏輯,其中 signUp() 函數(shù)用于用戶注冊,signIn() 函數(shù)用于用戶登錄。當(dāng)用戶注冊時,會先通過用戶名查詢數(shù)據(jù)庫中是否已經(jīng)存在該用戶,如果沒有,則將該用戶的用戶名和密碼存入數(shù)據(jù)庫表中。而當(dāng)用戶登錄時,會先通過用戶名查詢數(shù)據(jù)庫中是否存在該用戶,如果不存在,則提示“用戶名不存在”;如果存在,則將該用戶的密碼和輸入的密碼進行比較,如果密碼相同,則提示“登錄成功”,否則提示“密碼不正確”。
需要注意的是,以上代碼純粹為了演示數(shù)據(jù)庫的業(yè)務(wù)邏輯,實際應(yīng)用開發(fā)中需要優(yōu)化代碼、加入容錯機制、進行網(wǎng)絡(luò)安全性等處理。
結(jié)語
相關(guān)問題拓展閱讀:
- 如何實現(xiàn)登陸操作安卓sqlite
- 網(wǎng)站登錄代碼怎么寫
如何實現(xiàn)登陸操作安卓sqlite
首先寫javabean
由于該類很簡單,只是定義id,username,password,age,sex,所以在此不在給出!直接說service層業(yè)務(wù)類的代碼:
使用SQLiteOpenHelper抽象類建立沒畝數(shù)據(jù)庫
抽象類SQLiteOpenHelper用來對數(shù)據(jù)庫進行版本管理,不是必須使用的。
為了實現(xiàn)對數(shù)據(jù)庫版本進行管理, SQLiteOpenHelper 類提供了兩個重要的方法 , 分別onCreate(SQLiteDatabasedb) 和 onUpgrade(SQLiteDatabase db, int oldVersion, intnewVersion)用于初次使用軟件時生成數(shù)據(jù)庫表,后者用于升級軟件時更新數(shù)據(jù)庫表結(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)建的時候用一次
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) 可以用來執(zhí)行非查詢 SQL 指令,這些指令沒有結(jié)果
包括: CREATE TABLE / DROP TABLE / INSERT 等等
然后就是UserService.java實現(xiàn)對表的操作:
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;
}
//注冊用
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) 來導(dǎo)航瀏覽查詢結(jié)果
游標(biāo) (Cursors) 被 android.database.Cursor 對象來描述
一個游標(biāo) (Cursors) 是一個簡單的指針,它從查詢結(jié)果的一
一個或是 …… )
游標(biāo) (Cursors) 在它定位位置的那一刻返回元組數(shù)據(jù)
有以下代碼來解釋:
// 為了創(chuàng)建一個 Cursor( 游標(biāo) ) ,必須執(zhí)行一個查詢,要么通過 SQL 使用 rawQuery() 方法
// 或是更精心設(shè)計的方法,像 query() 方法
Cursor cur=my_DataBase.rawQuery( “SELECT * FORM test” , null null null null );
ifififif (cur!= null null null null ){ // 游標(biāo)不為空
// 返回給定名稱的列的基于 0 開始的 index ,如果該屬性列不存在則返回 -1
// 通過它們的 index 來檢索屬性值
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 提供了不同的方法來回索不同的數(shù)據(jù)類型
例如 getInt( int index)/getString( int index) 等等 */
/* 做一些事情 */
} while while while while (cur.moveToNext());
/ * 游標(biāo)移動到下一行,如果游標(biāo)已經(jīng)通過了結(jié)果集中的最后,
即沒有行可以移動時,則返回 false */
// 其他可能移動的是 previous() 和 first() 方法
}
}
最后要關(guān)閉游標(biāo)?。?!
下面是測試代碼:
public class UserTest extends AndroidTestCase {
public void datatest() throws Throwable{
DatabaseHelper dbhepler=new DatabaseHelper(this.getContext());
dbhepler.getReadableDatabase();
}
//注冊
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”,”登錄失敗”);
}
}
}
常見異常
android.database.sqlite.SQLiteException:Can’t upgrade read-only database from version 0 to 1:
這個錯誤基本上都是sql有問題導(dǎo)致的,仔細檢查sql即可。
最后想說:在寫好了實現(xiàn)類以后更好再寫這個測試類來測試一下,不然以后碰到錯很麻煩,所以把所有的測試都通過了,再寫界面和activity,界面和activity的代碼就不給出了,源碼地址給出,有興趣的同學(xué)可以下載來參考參考!?。?/p>
網(wǎng)站登錄代碼怎么寫
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ù)庫注冊登錄代碼怎么寫的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于安卓數(shù)據(jù)庫注冊登錄代碼怎么寫,「安卓數(shù)據(jù)庫注冊登錄代碼」教程全解析,如何實現(xiàn)登陸操作安卓sqlite,網(wǎng)站登錄代碼怎么寫的信息別忘了在本站進行查找喔。
創(chuàng)新互聯(lián)服務(wù)器托管擁有成都T3+級標(biāo)準(zhǔn)機房資源,具備完善的安防設(shè)施、三線及BGP網(wǎng)絡(luò)接入帶寬達10T,機柜接入千兆交換機,能夠有效保證服務(wù)器托管業(yè)務(wù)安全、可靠、穩(wěn)定、高效運行;創(chuàng)新互聯(lián)專注于成都服務(wù)器托管租用十余年,得到成都等地區(qū)行業(yè)客戶的一致認可。
網(wǎng)站欄目:「安卓數(shù)據(jù)庫注冊登錄代碼」教程全解析(安卓數(shù)據(jù)庫注冊登錄代碼怎么寫)
文章位置:http://m.fisionsoft.com.cn/article/ccssejs.html


咨詢
建站咨詢
