Я пытаюсь создать приложение для Android, которое управляет базой данных: база данных обрабатывает пациентов частного доктора.Я уже выполнил основное действие (меню навигации) и действие, которое должно добавлять записи в таблицу базы данных пациентов, но когда я нажимаю кнопку, чтобы добавить запись, приложение вылетает, не имеет значения, заполняю ли я форму или нет.
Я пробовал как на своем собственном устройстве Android (Motorola G5S Plus, с Adnroid 8.1 и уровнями API 27), так и на виртуальном устройстве студии Android (Nexus 5X, те же API).
Воткод из Agg_Pazienti.kt (действие, которое должно добавлять записи):
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))
}
}
}
А вот класс CMHelper, который наследуется от SQLiteOpenHelper:
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;
}
}
и вот что происходит, когда я нажимаю кнопку, чтобы добавить записи в базу данных:
сбой
И журнал сбоев:
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 не выдает никаких ошибок.
Любая форма помощи приветствуется.
Спасибо.