【问题标题】:Android SQLite Create two tables in one database. Not at the same timeAndroid SQLite 在一个数据库中创建两个表。不是同时
【发布时间】: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


    【解决方案1】:

    问题出在这一行:

    val select_query = "SELECT * FROM $username"

    您说的是select * from table named username(在您的情况下,我假设您注册了一个名为 admin 的用户)。

    我支持你可能想要的是select * from table words_table_name

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 2018-12-24
      相关资源
      最近更新 更多