当前位置: 首页 > 知识库问答 >
问题:

SQLite-数据库列

朱高超
2023-03-14

你能帮我解决缺栏的问题吗?在我看来,我做的每件事都是对的,但我得到的错误是,某一列有问题。

错误

E/SQLiteLog:(1)没有这样的列:Stezenie D/AndroidRuntime:关闭VM E/AndroidRuntime:致命异常:主进程:com。实例apkadlapacjenta,PID:11261 java。lang.RuntimeException:无法启动活动组件信息{com.example.apkadlapacjenta/com.example.apkadlapacjenta.HistoriaPomiarow}:android。数据库sqlite。SQLiteException:没有这样的列:Stezenie(代码1 SQLITE_错误):,编译时:android Pomiary的SELECT Id、Stezenie、Zegar、Data、Posilek、Stres、Samopoczucie、Hiperglikemia。应用程序。活动线程。在android上执行启动活动(ActivityThread.java:3270)。应用程序。活动线程。android上的handleLaunchActivity(ActivityThread.java:3409)。应用程序。服务器事务。启动ActivityItem。在android上执行(LaunchActivityItem.java:83)。应用程序。服务器事务。事务执行器。android上的executeCallbacks(TransactionExecutor.java:135)。应用程序。服务器事务。事务执行器。在android上执行(TransactionExecutor.java:95)。应用程序。android上的ActivityThread$H.handleMessage(ActivityThread.java:2016)。操作系统。处理程序。android上的dispatchMessage(Handler.java:107)。操作系统。活套。android上的loop(Looper.java:214)。应用程序。活动线程。java上的main(ActivityThread.java:7356)。朗。反思。方法在com上调用(本机方法)。Android内部的操作系统。RuntimeInit$MethodAndArgsCaller。在com上运行(RuntimeInit.java:492)。Android内部的操作系统。合子体。main(ZygoteInit.java:930)由以下原因引起:android。数据库sqlite。SQLiteException:没有这样的列:Stezenie(代码1 SQLITE_错误):,编译时:android Pomiary的SELECT Id、Stezenie、Zegar、Data、Posilek、Stres、Samopoczucie、Hiperglikemia。数据库sqlite。SQLiteConnection。android上的nativePrepareStatement(本机方法)。数据库sqlite。SQLiteConnection。android上的acquirePreparedStatement(SQLiteConnection.java:986)。数据库sqlite。SQLiteConnection。在android上准备(SQLiteConnection.java:593)。数据库sqlite。SQLiteSession。在android上准备(SQLiteSession.java:590)。数据库sqlite。SQLiteProgram。(SQLiteProgram.java:61)在android上。数据库sqlite。SQLiteQuery。(SQLiteQuery.java:37)在android上。数据库sqlite。SQLiteDirectCursorDriver。android上的查询(SQLiteDirectCursorDriver.java:46)。数据库sqlite。SQLiteDatabase。android上的rawQueryWithFactory(SQLiteDatabase.java:1443)。数据库sqlite。SQLiteQueryBuilder。android上的查询(SQLiteQueryBuilder.java:515)。数据库sqlite。SQLiteQueryBuilder。在com上查询(SQLiteQueryBuilder.java:392)。实例阿普卡德拉切塔。DbMenager。在com上查询(DbMenager.kt:65)。实例阿普卡德拉切塔。历史博物馆。LoadQuery(HistoriaPomiarow.kt:55)位于com。实例阿普卡德拉切塔。历史博物馆。Android上的onCreate(HistoriaPomiarow.kt:33)。应用程序。活动在android上执行创建(Activity.java:7802)。应用程序。活动在android上执行创建(Activity.java:7791)。应用程序。仪器仪表。android上的callActivityOnCreate(Instrumentation.java:1299)。应用程序。活动线程。在android上执行启动活动(ActivityThread.java:3245)。应用程序。活动线程。handleLaunchActivity(ActivityThread.java:3409)

主要活动

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)

    }
}

DBMENAGER

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
}

伙计们,你能解释一下怎么了吗?谢谢

共有2个答案

史宸
2023-03-14

我相信你的问题可能是因为这一行:-

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)"

然后在卸载应用程序或删除应用程序的数据后,尝试重新运行。

宇文鸣
2023-03-14

可能您添加了此列,但忘记添加从旧数据库版本的迁移。您可以通过清除所有应用程序数据(或删除并安装它)来检查它。如果重新安装修复问题,您应该创建从旧数据库到新数据库的迁移

您还可以重构所有数据库,以使用Room而不是丑陋的ORMLite。这是谷歌提供的友好且强大的持久性库

 类似资料:
  • 然而,敬虔加上知足的心便是大利了,因为我们没有带什么到世上来,也不能带什么去,只要有衣有食,就当知足。但那些想要发财的人,就陷在迷惑、落在网罗和许多无知有害的私欲里,叫人沉在败坏和灭亡中。贪财是万恶之根。有人贪恋钱财,就被引诱离了真道,用许多愁苦把自己刺透了。(1 TIMOTHY 6:6-10) SQLite数据库 SQLite是一个小型的关系型数据库,它最大的特点在于不需要服务器、零配置。前面的

  • 主要内容:语法,实例SQLite 的 DETACH DATABASE 语句是用来把命名数据库从一个数据库连接分离和游离出来,连接是之前使用 ATTACH 语句附加的。如果同一个数据库文件已经被附加上多个别名,DETACH 命令将只断开给定名称的连接,而其余的仍然有效。您无法分离 main 或 temp 数据库。 如果数据库是在内存中或者是临时数据库,则该数据库将被摧毁,且内容将会丢失。 语法 SQLite 的 DET

  • 主要内容:语法,实例假设这样一种情况,当在同一时间有多个数据库可用,您想使用其中的任何一个。SQLite 的 ATTACH DATABASE 语句是用来选择一个特定的数据库,使用该命令后,所有的 SQLite 语句将在附加的数据库下执行。 语法 SQLite 的 ATTACH DATABASE 语句的基本语法如下: 如果数据库尚未被创建,上面的命令将创建一个数据库,如果数据库已存在,则把数据库文件名称与逻辑数据库 '

  • 主要内容:语法,实例,.dump 命令SQLite 的 sqlite3 命令被用来创建新的 SQLite 数据库。您不需要任何特殊的权限即可创建一个数据。 语法 sqlite3 命令的基本语法如下: 通常情况下,数据库名称在 RDBMS 内应该是唯一的。 另外我们也可以使用 .open 来建立新的数据库文件: 上面的命令创建了数据库文件 test.db,位于 sqlite3 命令同一目录下。 打开已存在数据库也是用 .open 命令,

  • 本文讲解了如何在WeX5中使用SQLite数据库,同时展示了如何在App中加入自己的cordova插件。 SQLite是嵌入式的和轻量级的SQL数据库。广泛用于IOS、Android等设备,实现本地数据存储。 在WeX5中使用SQLlite数据库,步骤如下 1、下载SQLite的cordova插件 (1)、访问https://github.com/brodysoft/Cordova-SQLiteP