【问题标题】:How to create an app where user can make his own tables on sqlite and kotlin [closed]如何创建一个应用程序,用户可以在 sqlite 和 kotlin 上创建自己的表 [关闭]
【发布时间】:2021-07-04 19:14:42
【问题描述】:

嗯...我不知道从哪里开始...我正在做一门课程,老师没有教我们任何有关数据库的知识,现在他希望我们用 kotlin 和 sqlite 做一个应用程序我们使用“新表”按钮创建一个活动,用户可以在其中创建一个具有名称和动态字段的数据库表。我整天都在搜索它,但一无所获。

我想过创建一个 CRUD,但我遇到了麻烦,我不知道如何动态地制作这些。

现在我有这个 SQLiteHelper,我认为它是必要的,我使用 const 值来测试它,因为我不知道如何从用户视图传递值。

class AdminSQLiteOpenHelper(context: Context, name: String, factory: CursorFactory?, version: Int) : SQLiteOpenHelper(context, name, factory, version) {

    companion object{
        const val DATABASE_NAME = "test.db"
        var TABLE_NAME = "Testing_Table"
        const val COL_1 = "ID"
        var COL_2 = "NAME"
        var COL_3 = "SURNAME"
        var COL_4 = "YEARS"
    }
    override fun onCreate(db: SQLiteDatabase) {
        db.execSQL("create table TABLE_NAME(COL_1 primary key autoincrement, COL_2 text, COL_3 text, COL_4 int)")
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.execSQL("drop table if exists TABLE_NAME")
        onCreate(db)
    }
}

我有这个活动

class MainActivity2Crear : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main_activity2_crear)


        val buttonCrear = findViewById<Button>(R.id.buttonCrear)
        buttonCrear.setOnClickListener{
            val register = ContentValues()
            register.put(COL_1, textView.getText().toString())
            TABLE_NAME = register.toString()
            val admin = AdminSQLiteOpenHelper(this, TABLE_NAME, null, 1)
            val bd = admin.writableDatabase
            bd.insert(TABLE_NAME, null, register)
            bd.close()
            textView.setText("")
            Toast.makeText(this, "Table created", Toast.LENGTH_SHORT).show()
            val intent = Intent(this, MainActivity2::class.java)
            startActivity(intent)
        }

        val button = findViewById<Button>(R.id.button)
        button.setOnClickListener{
            val intent = Intent(this, MainActivity2::class.java)
            startActivity(intent)
        }
    }
}

我现在只是创建了按钮,因为我不知道我在做什么...... 我知道这个问题可能会被否决,但我只是想要一些帮助或教程或帮助我理解如何进行此练习的东西...

【问题讨论】:

    标签: sqlite android-studio kotlin


    【解决方案1】:

    您将遇到的第一个问题是您正在尝试使用CREATE TABLE TABLE_NAME (COL_1 PRIMARY KEY AUTOINCREMENT ..... 创建一个表

    将创建(尝试)的表将是 TABLE_NAME 而不是 Testing_Table,因为变量名称嵌入在字符串中,而不是被解析并附加到字符串中。

    字符串中包含多个变量。

    另一个错误是你有PRIMARY KEY AUTOINCREMENT autoincrement 只能用于 rowid 的别名,必须使用专门的 INTEGER PRIMARY KEY 定义。

    您不需要 AUTOINCREMENT,因为 INTEGER PRIMARY KEY 会做您想做的事情(增加 ID 列的值,因此第一个是 1,然后可能是 2,然后可能是 3 ....)。 AUTOINCREMENT 基本上是一个约束/规则,它表示数字必须更高(对于您的测试来说,它会是(并不重要))。

    我建议以下基于您的代码(但没有点击处理)成功创建表,在表中插入一些行(不是表),然后提取它们并将提取的数据写入日志.

    首先修改AdminSQLiteOpenHelper:-

    class AdminSQLiteOpenHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
    
        companion object{
            const val DATABASE_NAME = "test.db"
            const val DATABASE_VERSION = 1;
            var TABLE_NAME = "Testing_Table"
            const val COL_1 = "ID"
            var COL_2 = "NAME"
            var COL_3 = "SURNAME"
            var COL_4 = "YEARS"
        }
        val db = this.writableDatabase //<<<<<<<<<< ADDED
        override fun onCreate(db: SQLiteDatabase) {
    
            //<<<<<<<<<< NUMEROUS CHANGES >>>>>>>>>>
            db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE_NAME +
                    "("
                    + COL_1 + " INTEGER PRIMARY KEY," // no need for AUTOINCREMENT you want INTEGER PRIMARY KEY not PRIMARY KEY
                    + COL_2 + " TEXT,"
                    + COL_3 + " TEXT,"
                    + COL_4 + " INTEGER" +
                    ")"
            )
        }
    
        override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
            db.execSQL("drop table if exists " + TABLE_NAME) //<<<<<<<<<<< CHANGED
            onCreate(db)
        }
    
        //<<<<<<<<<< ADDED >>>>>>>>>
        fun insertRow(name: String, surname: String, years: Int): Long {
            val cv = ContentValues()
            cv.put(COL_2,name)
            cv.put(COL_3,surname)
            cv.put(COL_4,years)
            return db.insert(TABLE_NAME,null,cv);
        }
    
        //<<<<<<<<<< ADDED >>>>>>>>>
        fun getAllRowsFromTestingTable(): Cursor {
            return db.query(TABLE_NAME,null, null,null,null,null, COL_3)
        }
    }
    
    • 请注意与您的相比所做的更改。

    现在是一个 Activity (MainActivity),它执行从数据库中添加和提取数据的工作:-

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // Get an instance of the DB Helper with full class scope
            val db = AdminSQLiteOpenHelper(this)
    
            // Add Some data
            db.insertRow("Fred","Bloggs",10)
            db.insertRow("Jane","Doe",25)
            // Get all the data as a Cursor
            val cursor = db.getAllRowsFromTestingTable()
            // traverse the cursor writing data to the log
            while(cursor.moveToNext()) {
                Log.d("MYDATA",
                    "ID = " + cursor.getLong(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_1)) +
                            " First Name = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_2)) +
                            " Surname = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_3)) +
                            " Years = " + cursor.getInt(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_4))
                )
            }
            cursor.close() //<<<<<<<<<< should ALWAYS close cursor when done
        }
    }
    

    运行时,它会在 LOG 中生成以下内容:-

    2021-04-09 17:03:01.531 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
    2021-04-09 17:03:01.531 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
    

    附加

    这是一个修改后的 MainActivity,它有一个按钮,当点击它时会在表格中添加一行。

    • 这些行都是相同的,除了年份值,它是随机生成的。
    • 插入后将数据库的内容写入日志。
    • AdminSQLiteOpenHelper 没有变化

    :-

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            // Get an instance of the DB Helper with full class scope
            val db = AdminSQLiteOpenHelper(this)
            val buttonCrear = this.findViewById<Button>(R.id.buttonCrear)
            buttonCrear.setOnClickListener{
                db.insertRow("Button","Click", Random.nextInt(10,9999))
                logData(db)
            }
    
            // Add Some data
            db.insertRow("Fred","Bloggs",10)
            db.insertRow("Jane","Doe",25)
            // Get all the data as a Cursor
            logData(db)
        }
    
        // Function replaces the previous logging of the data 
        fun logData(db: AdminSQLiteOpenHelper) {
            val cursor = db.getAllRowsFromTestingTable()
            while(cursor.moveToNext()) {
                Log.d("MYDATA",
                        "ID = " + cursor.getLong(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_1)) +
                                " First Name = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_2)) +
                                " Surname = " + cursor.getString(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_3)) +
                                " Years = " + cursor.getInt(cursor.getColumnIndex(AdminSQLiteOpenHelper.COL_4))
                )
            }
            cursor.close() //<<<<<<<<<< should ALWAYS close cursor when done
        }
    }
    

    这是点击按钮几次后的日志示例:-

    在任何点击之前

    2021-04-09 18:45:47.813 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
    2021-04-09 18:45:47.813 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
    

    第一次点击后

    2021-04-09 18:45:58.567 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
    2021-04-09 18:45:58.567 D/MYDATA: ID = 3 First Name = Button Surname = Click Years = 9910
    2021-04-09 18:45:58.567 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
    

    第二次点击后

    2021-04-09 18:45:59.675 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
    2021-04-09 18:45:59.675 D/MYDATA: ID = 3 First Name = Button Surname = Click Years = 9910
    2021-04-09 18:45:59.675 D/MYDATA: ID = 4 First Name = Button Surname = Click Years = 8263
    2021-04-09 18:45:59.676 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
    

    第三次点击后

    2021-04-09 18:46:00.611 D/MYDATA: ID = 1 First Name = Fred Surname = Bloggs Years = 10
    2021-04-09 18:46:00.611 D/MYDATA: ID = 3 First Name = Button Surname = Click Years = 9910
    2021-04-09 18:46:00.611 D/MYDATA: ID = 4 First Name = Button Surname = Click Years = 8263
    2021-04-09 18:46:00.612 D/MYDATA: ID = 5 First Name = Button Surname = Click Years = 9625
    2021-04-09 18:46:00.613 D/MYDATA: ID = 2 First Name = Jane Surname = Doe Years = 25
    

    【讨论】:

    • 非常感谢您抽出宝贵时间回答我...我会研究您的代码以更好地理解这一点。这个老师好难学……
    猜你喜欢
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2021-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多