单击按钮插入/查询 SQLite 数据库时,Android Studio 应用程序崩溃

标签 android sqlite android-studio kotlin crash

我正在尝试制作一个管理数据库的 Android 应用程序:该数据库处理私有(private)医生的患者。
我已经制作了主要 Activity (导航菜单)和应该在患者数据库表中添加条目的 Activity ,但是当我单击按钮添加条目时,应用程序崩溃,不管我是否填写表格.

我在自己的 Android 设备(Motorola G5S Plus,Adnroid 8.1 和 API 级别 27)和 Android Studio 的虚拟设备(Nexus 5X,相同的 API)上都进行了尝试。

这是来自 Agg_Pazienti.kt 的代码(应该添加条目的 Activity ):

class Agg_Pazienti : AppCompatActivity() {

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

        val database = CMHelper(this@Agg_Pazienti)

        agg_btn.setOnClickListener{
            val nome = nome_nuovo_paziente.text.toString()
            val cognome = cognome_nuovo_paziente.text.toString()
            val eta = eta_nuovo_paziente.text.toString().toInt()
            val telefono = telefono_nuovo_paziente.text.toString()

            /* Controllo Dati di input */

            if(nome == "" || cognome == ""){
                Toast.makeText(this@Agg_Pazienti, "Nome e Cognome non possono essere vuoti", Toast.LENGTH_LONG).show()
            }
            else {
                Toast.makeText(this@Agg_Pazienti, "Registrato con successo", Toast.LENGTH_LONG).show()
                database.addPaziente(Paziente(nome, cognome, eta, telefono))
            }

        }
}

这是继承自 SQLiteOpenHelper 的 CMHelper 类:
class CMHelper(context: Context) :
                SQLiteOpenHelper(context,
                                    DATABASE_NAME,
                                    null,
                                    DATABASE_VERSION){

    override fun onCreate(db: SQLiteDatabase) {

        val CREATE_TABLE_PAZIENTI = "CREATE TABLE $TABLE_PAZIENTI(" +
                "$COLUMN_ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "$COLUMN_NOME TEXT," +
                "$COLUMN_COGNOME TEXT" +
                "$COLUMN_ETA INTEGER," +
                "$COLUMN_TELEFONO TEXT," +
                "$COLUMN_ANAMNESIPATOLOGICAREMOTA TEXT," +
                "$COLUMN_ANAMNESIPATOLOGICAPROSSIMA TEXT," +
                "$COLUMN_ANAMNESIOSTETRICA TEXT" +
                ")"

        db.execSQL(CREATE_TABLE_PAZIENTI)

    }

    override fun onUpgrade(db: SQLiteDatabase,
                           oldVersion: Int,
                           newVersion: Int) {

        db.execSQL("DROP TABLE IF EXISTS $TABLE_PAZIENTI")
        onCreate(db)
    }

    companion object {
        private const val DATABASE_NAME = "cartella_medica.db"
        private const val DATABASE_VERSION = 1
        const val TABLE_PAZIENTI = "pazienti"

        const val COLUMN_ID = "id"
        const val COLUMN_NOME = "nome"
        const val COLUMN_COGNOME = "cognome"
        const val COLUMN_ETA = "età"
        const val COLUMN_TELEFONO = "telefono"
        const val COLUMN_ANAMNESIPATOLOGICAREMOTA = "anamnesi patologica remota"
        const val COLUMN_ANAMNESIPATOLOGICAPROSSIMA = "anamnesi patologica prossima"
        const val COLUMN_ANAMNESIOSTETRICA = "anamnesi ostetrica"
    }

    fun addPaziente(paziente: Paziente){
        val values = ContentValues()

        values.put(COLUMN_NOME, paziente.nome)
        values.put(COLUMN_COGNOME, paziente.cognome)
        values.put(COLUMN_ETA, paziente.eta)
        values.put(COLUMN_TELEFONO, paziente.telefono)

        val db = this.writableDatabase

        db.insert(TABLE_PAZIENTI, null, values)
        db.close()
    }

以及作为患者数据结构模型的 Paziente 类:
class Paziente {
    var id:Int=0
    var nome:String?=null
    var cognome:String?=null
    var eta:Int?=null
    var telefono:String?=null
    var anamnesi_patologica_remota:String?=null
    var anamnesi_patologica_prossima:String?=null
    var anamnesi_ostetrica:String?=null

    constructor()

    constructor(nome:String, cognome:String, eta:Int?, telefono:String?){
        this.nome = nome
        this.cognome = cognome
        this.eta = eta
        this.telefono = telefono
    }

    constructor(id : Int,
                nome : String?,
                cognome : String?,
                eta : Int?,
                telefono : String?,
                anamnesi_patologica_remota : String?,
                anamnesi_patologica_prossima : String?,
                anamnesi_ostetrica : String?){

        this.id = id;
        this.nome = nome;
        this.cognome = cognome;
        this.eta = eta;
        this.telefono = telefono;
        this.anamnesi_patologica_remota = anamnesi_patologica_remota;
        this.anamnesi_patologica_prossima = anamnesi_patologica_prossima;
        this.anamnesi_ostetrica = anamnesi_ostetrica;
    }
}

当我单击按钮在数据库中添加条目时会发生以下情况:

crash

和崩溃日志:
2019-07-06 18:37:04.524 8022-8022/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 8022
    android.database.sqlite.SQLiteException: duplicate column name: anamnesi (code 1): , while compiling: CREATE TABLE pazienti(id INTEGER PRIMARY KEY AUTOINCREMENT, nome TEXT,cognome TEXTetà INTEGER,telefono TEXT,anamnesi patologica remota TEXT,anamnesi patologica prossima TEXT,anamnesi ostetrica TEXT)
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:890)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:501)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
        at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1752)
        at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1682)
        at com.example.myapplication.dbhelper.CMHelper.onCreate(CMHelper.kt:28)
        at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:333)
        at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:238)
        at com.example.myapplication.dbhelper.CMHelper.addPaziente(CMHelper.kt:63)
        at com.example.myapplication.Agg_Pazienti$onCreate$1.onClick(Agg_Pazienti.kt:31)
        at android.view.View.performClick(View.java:6294)
        at android.view.View$PerformClick.run(View.java:24770)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Android Studio 不会抛出任何错误。

任何形式的帮助表示赞赏。

谢谢你。

最佳答案

列名不应包含空格。
您可以将这些名称括在方括号、反引号或双引号内。
我更喜欢方括号:

const val COLUMN_ANAMNESIPATOLOGICAREMOTA = "[anamnesi patologica remota]"
const val COLUMN_ANAMNESIPATOLOGICAPROSSIMA = "[anamnesi patologica prossima]"
const val COLUMN_ANAMNESIOSTETRICA = "[anamnesi ostetrica]"

还要在此处添加一个逗号,如下所示:
val CREATE_TABLE_PAZIENTI = "CREATE TABLE $TABLE_PAZIENTI(" +
                ....................................
                "$COLUMN_COGNOME TEXT," +
                ....................................
                ")"

在此更改后,从设备中卸载应用程序并重新运行。

关于单击按钮插入/查询 SQLite 数据库时,Android Studio 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56914288/

相关文章:

android - strings.xml 文件中的表情符号?

android - 在带有 React Native 的 Android 中使用 ListView onEndReached 无法按预期工作

java - Android Studio : Can't write to external storage?

java - Gradle 构建错误无法获取未知属性 supportVersion

linux - 如何启用 Android 虚拟设备 (AVD)

java - 优化EditText语法突出显示(可扩展)

iphone - 什么时候在 iOS 的 sqlite 中完成语句?

python - 在 SQLite 中使用 Python 列表的多行更新

Android SQLite - 没有这样的表错误(代码 1)

java - 如何防止负数/负数