【发布时间】:2021-01-26 14:54:12
【问题描述】:
我正在使用 SQLite 制作一个简单的 Android 应用程序。我想在用户通过注册时创建一个“user_table”。然后应用程序将用户重定向到另一个应该登录的活动。当用户输入登录名和密码并点击按钮时,我将用户名传递给 MainActivity,然后我将用户名传递给创建的 DBHandler 类具有“用户名”名称的表。那就是我想在一个数据库中创建两个表。
我不想同时创建这些表。我想注册成功后创建“user_table”,成功登录后创建第二个表。
好吧,我知道要创建第二个表,我需要在 DBHandler 类中使用 onUpdate 方法,并递增要调用的数据库版本,所以我将数据库版本传递给 DBHandler 构造函数并对其进行初始化。
欢迎活动:
dbHandler = DBHandler(this, "user_table", 1)
button.setOnClickListener {
if(dbHandler.checkUser(et_username.text.toString())) {
if(et_username.text.isEmpty() && et_password.text.isEmpty()) {
et_username.error = "The field is empty"
et_password.error = "The field is empty"
} else if (et_username.text.isEmpty()) {
et_username.error = "The field is empty"
} else if(et_password.text.isEmpty()) {
et_password.error = "The field is empty"
} else {
val sharedPref = this.getSharedPreferences("user_login_pref", Context.MODE_PRIVATE)
val editorPref = sharedPref.edit()
editorPref.putString("username", et_username.text.toString())
editorPref.apply()
val intent = Intent(this, MainActivity::class.java)
intent.putExtra("username", et_username.text.toString())
startActivity(intent)
}
} else {
Toast.makeText(this, "This user doesn't exists. Please Signup.", Toast.LENGTH_SHORT).show()
}
}
主活动:
val username = intent.getStringExtra("username").toString()
dbHandler = DBHandler(this, username, 2)
val exampleList = dbHandler.read_from_words_table(username)
adapter = CustomAdapter(exampleList, this)
rv_allWords.adapter = adapter
adapter.notifyDataSetChanged()
DBHandler 类:
private val DB_NAME = "words_db"
private var DB_VERSION = 1
class DBHandler(context: Context, db_name: String, version: Int) :
SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
private var USER_TABLE_NAME = "user_table"
private var USER_KEY_ID = "id"
private var USER_KEY_UNAME = "uname"
private var USER_KEY_PSW = "password"
private var WORDS_TABLE_NAME = "words_table_name"
private var WORDS_KEY_ID = "id"
private var WORDS_KEY_FRONT = "front"
private var WORDS_KEY_BACK = "back"
val CREATE_USER_TABLE = ("CREATE TABLE " + USER_TABLE_NAME + "("
+ USER_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + USER_KEY_UNAME + " TEXT,"
+ USER_KEY_PSW + " TEXT" + ")")
init {
USER_TABLE_NAME = db_name
WORDS_TABLE_NAME = db_name
DB_VERSION = version
}
override fun onCreate(db: SQLiteDatabase?) {
db?.execSQL(CREATE_USER_TABLE)
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
val CREATE_WORDS_TABLE = ("CREATE TABLE " + WORDS_TABLE_NAME + "("
+ WORDS_KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + WORDS_KEY_FRONT + " TEXT,"
+ WORDS_KEY_BACK + " TEXT" + ")")
onCreate(db)
}
fun insert_user(uname: String, password: String) {
val db = this.writableDatabase
val contentValues = ContentValues()
contentValues.put(USER_KEY_UNAME, uname)
contentValues.put(USER_KEY_PSW, password)
var success = db.insert(USER_TABLE_NAME, null, contentValues)
}
fun checkUser(uname: String): Boolean {
val query = "SELECT * FROM $USER_TABLE_NAME WHERE $USER_KEY_UNAME = ?"
var cursor: Cursor? = null
val db = this.readableDatabase
cursor = db.rawQuery(query, arrayOf(uname))
if(cursor.count > 0)
return true
else
return false
}
fun get_user_entries() : ArrayList<String>{
var username_list: ArrayList<String> = ArrayList<String>()
val db = this.readableDatabase
val query = "SELECT * FROM $USER_TABLE_NAME"
var cursor: Cursor? = null
cursor = db.rawQuery(query, null)
if(cursor.moveToFirst()) {
do {
var id = cursor.getInt(cursor.getColumnIndex(USER_KEY_ID))
var username = cursor.getString(cursor.getColumnIndex(USER_KEY_UNAME))
username_list.add(username)
} while(cursor.moveToNext())
cursor.close()
username_list.clear()
}
return username_list
}
fun insert_word(ds: DataSource) {
val db = this.readableDatabase
val contentValues = ContentValues()
}
fun read_from_words_table(username: String): ArrayList<DataSource> {
val ds: ArrayList<DataSource> = ArrayList<DataSource>()
val select_query = "SELECT * FROM $username"
val db = this.readableDatabase
var cursor: Cursor? = null
cursor = db.rawQuery(select_query, null)
if (cursor.moveToFirst()) {
do {
var id = cursor.getInt(cursor.getColumnIndex(WORDS_KEY_ID))
var front = cursor.getString(cursor.getColumnIndex(WORDS_KEY_FRONT))
var back = cursor.getString(cursor.getColumnIndex(WORDS_KEY_BACK))
val item = DataSource(id, front, back)
Log.i("tag", id.toString())
Log.i("tag", front.toString())
Log.i("tag", back.toString())
ds.add(item)
} while (cursor.moveToNext())
}
cursor.close()
Log.i("tag", ds.size.toString())
return ds
}
当用户使用他的凭据登录时,我的应用程序崩溃并出现错误,我不明白为什么:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.app/com.example.app.activities.MainActivity}: android.database.sqlite.SQLiteException: no such table: admin (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM admin
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3449)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3601)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
Caused by: android.database.sqlite.SQLiteException: no such table: admin (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM admin
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1045)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:652)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:61)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1545)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1484)
at com.example.app.words_db.DBHandler.read_from_words_table(DBHandler.kt:100)
at com.example.app.activities.MainActivity.onCreate(MainActivity.kt:38)
at android.app.Activity.performCreate(Activity.java:8000)
at android.app.Activity.performCreate(Activity.java:7984)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
我似乎在某个地方写错了,但我不知道在哪里。
【问题讨论】:
标签: android database sqlite kotlin