android - SQLite - 数据库列
问题描述
您能帮助解决缺少列的问题吗?在我看来,我做的一切都是正确的,但我得到的错误是某一列有问题。
错误
E/SQLiteLog:(1)没有这样的列:Stezenie D/AndroidRuntime:关闭 VM E/AndroidRuntime:致命异常:主进程:com.example.apkadlapacjenta,PID:11261 java.lang.RuntimeException:无法启动活动 ComponentInfo{ com.example.apkadlapacjenta/com.example.apkadlapacjenta.HistoriaPomiarow}:android.database.sqlite.SQLiteException:没有这样的列:Stezenie(代码 1 SQLITE_ERROR):,编译时:SELECT Id、Stezenie、Zegar、Data、Posilek、Stres , Samopoczucie, Hiperglikemia FROM Pomiary 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409) 在 android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83) 在 android。 app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 在 android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016) 在 android .os.Handler.dispatchMessage(Handler.java:107) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect。 com.android.internal.os 上的 Method.invoke(Native Method)。RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 原因:android.database.sqlite.SQLiteException:没有这样的列:Stezenie(代码 1 SQLITE_ERROR): , 编译时: SELECT Id, Stezenie, Zegar, Data, Posilek, Stres, Samopoczucie, Hiperglikemia FROM Pomiary at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePreparedStatement( SQLiteConnection.java:986) 在 android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:593) 在 android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:590) 在 android.database.sqlite.SQLiteProgram.( SQLiteProgram.java:61) 在 android.database.sqlite.SQLiteQuery。(SQLiteQuery.java:37) 在 android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46) 在 android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1443) 在 android.database.sqlite.SQLiteQueryBuilder。查询(SQLiteQueryBuilder.java:515)在 android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:392) 在 com.example.apkadlapacjenta.DbMenager.Query(DbMenager.kt:65) 在 com.example.apkadlapacjenta.HistoriaPomiarow.LoadQuery(HistoriaPomiarow.kt:55) 在 com.example.apkadlapacjenta.HistoriaPomiarow.onCreate(HistoriaPomiarow.kt:33) ) 107) 在 android.os.Looper.loop(Looper.java:214) 在 android.app.ActivityThread.main(ActivityThread.java:7356) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android .internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) I/Process:发送信号。PID:11261 SIG:9 与目标 VM 断开连接,地址:'localhost:8630',传输:'socket' java:930) I/Process: 发送信号。PID:11261 SIG:9 与目标 VM 断开连接,地址:'localhost:8630',传输:'socket' java:930) I/Process: 发送信号。PID:11261 SIG:9 与目标 VM 断开连接,地址:'localhost:8630',传输:'socket'
主要活动
package com.example.apkadlapacjenta
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.app.SearchManager
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.SearchView
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_historia_pomiarow.*
import kotlinx.android.synthetic.main.content_historia_pomiarow.*
import kotlinx.android.synthetic.main.row.view.deleteBtn
import kotlinx.android.synthetic.main.row1.view.*
@Suppress("DEPRECATION")
class HistoriaPomiarow : AppCompatActivity() {
var listaWynikow = ArrayList<FIrebaseVal>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_historia_pomiarow)
setSupportActionBar(toolbar)
//Wczytujemy baze danych
LoadQuery("%")
}
override fun onResume() {
super.onResume()
LoadQuery("%")
}
private fun LoadQuery(pomiary: String) {
val dbManager = DbMenager(this)
val projections = arrayOf(
"Id",
"Stezenie",
"Zegar",
"Data",
"Posilek",
"Stres",
"Samopoczucie",
"Hiperglikemia"
)
val selectionArgs = arrayOf(pomiary)
val cursor =
dbManager.Query(projections,null,null,null)
listaWynikow.clear()
if (cursor.moveToFirst()) {
do {
val ID = cursor.getInt(cursor.getColumnIndex("Id"))
val Stezenie = cursor.getString(cursor.getColumnIndex("Stezenie"))
val Zegar = cursor.getString(cursor.getColumnIndex("Zegar"))
val Data = cursor.getString(cursor.getColumnIndex("Data"))
val Posilek = cursor.getString(cursor.getColumnIndex("Posilek"))
val Stres = cursor.getString(cursor.getColumnIndex("Stres"))
val Samopoczucie = cursor.getString(cursor.getColumnIndex("Samopoczucie"))
val Hiperglikemia = cursor.getString(cursor.getColumnIndex("Hiperglikemia"))
listaWynikow.add(
FIrebaseVal(
ID,
Stezenie,
Zegar,
Data,
Posilek,
Stres,
Samopoczucie,
Hiperglikemia ))
} while (cursor.moveToNext())
}
//Adapter
val ListaWynikowAdapter = MylistApdater(this, listaWynikow)
//ustawienia adaptera
listapomiarow.adapter = ListaWynikowAdapter
// Wszystkie zadania
val total = listapomiarow.count
//actionbar
val mActionBar = supportActionBar
if(mActionBar !=null){
//ustawienia Action Bara
mActionBar.subtitle = "Masz $total wyników"
}
}
override fun onCreateOptionsMenu(menu: Menu?):Boolean {
menuInflater.inflate(R.menu.notemenu, menu)
//searchView
val sv: SearchView = menu!!.findItem(R.id.app_bar_search).actionView as SearchView
val sm = getSystemService(Context.SEARCH_SERVICE) as SearchManager
sv.setSearchableInfo(sm.getSearchableInfo(componentName))
sv.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
//implementujemy dwie metody
override fun onQueryTextSubmit(query: String?): Boolean {
LoadQuery("%$query%")
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
LoadQuery("%$newText%")
return false
}
})
return super.onCreateOptionsMenu(menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.dodaj_notatke->{
startActivity(Intent(this,AddNote::class.java))
}
R.id.sortuj->{
showSortDialog()
}
}
return super.onOptionsItemSelected(item)
}
private fun showSortDialog() {
//lista opcji
val sortOption = arrayListOf("Najnowsze","starsze","Tytul rosnaco","Tytul malejaco")
val mBuilder = AlertDialog.Builder(this)
mBuilder.setTitle("Sort by")
mBuilder.setIcon(R.drawable.ic_sort)
}
inner class MylistApdater(
context: Context,
private var ListaWynikowAdapter: ArrayList<FIrebaseVal>
) : BaseAdapter() {
var listWynikiArray = ArrayList<FIrebaseVal>()
var context: Context? = context
@SuppressLint("ViewHolder","InflateParams")
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
val myView = layoutInflater.inflate(R.layout.row1, null)
val Wynik = ListaWynikowAdapter[position]
myView.stezenienumberpicker.text = Wynik.nodeNumberPicker.toString()
myView.godzina.text = Wynik.nodezegar
myView.data.text = Wynik.nodedata
myView.posilekRG.text = Wynik.nodeposilek
myView.SP1.text = Wynik.nodehiperglikemia
myView.SP2.text = Wynik.nodestres
myView.SP3.text = Wynik.nodesamopoczucie
//Przycisk kasowania
myView.deleteBtn.setOnClickListener {
val dbMenager = DbMenager(this.context!!)
val selectionArgs = arrayOf(Wynik.nodeID.toString())
dbMenager.delete("ID=?", selectionArgs)
LoadQuery("%")
}
return myView
}
override fun getItem(position: Int): Any {
return ListaWynikowAdapter[position]
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getCount(): Int {
return ListaWynikowAdapter.size
}
}
private fun GoToUpdateFun(Wyniki: FIrebaseVal) {
val intent = Intent(this,AddPomiary::class.java)
intent.putExtra("Id",Wyniki.nodeID)//wpisz Id
intent.putExtra("Stezenie",Wyniki.nodeNumberPicker)
intent.putExtra("Zegar",Wyniki.nodezegar)
intent.putExtra("Data",Wyniki.nodedata)
intent.putExtra("Posilek",Wyniki.nodeposilek)
intent.putExtra("Hiperglikemia",Wyniki.nodehiperglikemia)
intent.putExtra("Stres",Wyniki.nodestres)
intent.putExtra("Samopoczucie",Wyniki.nodesamopoczucie)
startActivity(intent)
}
}
数据库管理器
package com.example.apkadlapacjenta
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import android.database.sqlite.SQLiteQueryBuilder
import android.widget.RadioGroup
import android.widget.Toast
class DatebaseMenagerPomiary(context: Context) {
//Database name
var dbName = "Historia Pomiarów"
//table name
var dbTable = "Wyniki"
//kolumny
var colID = "Id"
var colStezenie = "Stezenie"
var colZegar = "Zegar"
var colData = "Data"
var colPosilek = "Posilek"
var colStres = "Stres"
var colSamopoczucie = "Samopoczucie"
var colHiperglikemia = "Hiperglikemia"
//wersja
var dbVersion = 1
//Tworzymy tabele
val sqlCreateTable =
"CREATE TABLE$dbTable($colID INTEGER PRIMARY KEY, $colStezenie TEXT, $colZegar TEXT, $colData TEXT, $colPosilek TEXT, $colStres TEXT,$colSamopoczucie TEXT, $colHiperglikemia TEXT)"
var sqlDB: SQLiteDatabase? = null
init {
val db = DatabaseHelperWyniki(context)
sqlDB = db.writableDatabase
}
inner class DatabaseHelperWyniki : SQLiteOpenHelper {
var context: Context? = null
constructor(context: Context) : super(context, dbName, null, dbVersion) {
this.context = context
}
override fun onCreate(db: SQLiteDatabase?) {
db!!.execSQL(sqlCreateTable)
Toast.makeText(this.context,"baza danych utworzona...",Toast.LENGTH_SHORT).show()
}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
db!!.execSQL("zamknij tabele jeśli nie istnieje" + dbTable)
}
}
fun insert(values:ContentValues):Long{
val ID = sqlDB!!.insert(dbTable,"",values)
return ID
}
fun Query(projection:Array<String>,selection:String,selectionArgs:Array<String>,sorOrder:String): Cursor {
val qb = SQLiteQueryBuilder()
qb.tables=dbTable
val cursor = qb.query(sqlDB,projection,selection,selectionArgs,null,null,sorOrder)
return cursor
}
fun delete(selection: String,selectionArgs: Array<String>):Int{
val count = sqlDB!!.delete(dbTable,selection,selectionArgs)
return count
}
fun update(values:ContentValues,selection: String,selectionArgs: Array<String>): Int {
val count = sqlDB!!.update(dbTable,values,selection,selectionArgs)
return count
}
}
节点类在名称上看不到:D
package com.example.apkadlapacjenta
class FIrebaseVal(
nodeID: Int, nodeNumberPicker:String,
nodezegar:String,
nodedata:String,
nodeposilek: String,
nodehiperglikemia: String,
nodestres: String,
nodesamopoczucie: String
) {
var nodeID: Int?= nodeID
var nodeNumberPicker: String? = nodeNumberPicker
var nodezegar:String?=nodezegar
var nodedata:String?=nodedata
var nodeposilek: String? =nodeposilek
var nodehiperglikemia:String?=nodehiperglikemia
var nodestres:String?=nodestres
var nodesamopoczucie:String?=nodesamopoczucie
}
各位大侠能解释一下怎么回事吗?谢谢
解决方案
我相信你的问题可能是由于这条线: -
val sqlCreateTable =
"CREATE TABLE$dbTable($colID INTEGER PRIMARY KEY, $colStezenie TEXT, $colZegar TEXT, $colData TEXT, $colPosilek TEXT, $colStres TEXT,$colSamopoczucie TEXT, $colHiperglikemia TEXT)"
TABLE关键字和表名之间没有空格。
尝试更改为:-
val sqlCreateTable =
"CREATE TABLE $dbTable($colID INTEGER PRIMARY KEY, $colStezenie TEXT, $colZegar TEXT, $colData TEXT, $colPosilek TEXT, $colStres TEXT,$colSamopoczucie TEXT, $colHiperglikemia TEXT)"
然后在卸载应用程序或删除应用程序的数据后尝试重新运行。
推荐阅读
- python - 如何在 Open CV Python 中消除这些噪音?
- python - 错误消息:无法找到软件包 libatlas3gf-base
- javascript - 使用 Blazor(即 WebAssembly)+ javascript
- php - MYSQL 更新 PHP 文件停止更新
- ios - 在标题视图字段iOS上阅读水龙头
- react-native - 视图不是全屏 React-Native
- javascript - JavaScript 倒计时在到达 00:00 时重定向另一个页面
- c - 我正在尝试通过指针和二维数组访问数据,但出现总线错误,有人知道为什么会这样吗?
- audio - Bot 在离开前未完成播放音频
- tensorflow - Tensorflow:如何根据条件一次仅更新多个变量中的单个变量