首页 > 解决方案 > ListView 不显示来自数据库的数据(SQLite)

问题描述

我是 android 开发的新手,所以这似乎是一个显而易见的问题,但我无法弄清楚。我正在尝试使用存储在 SQLite 数据库中的数据填充列表视图。我已经设法填充了 database.k 但是,我无法弄清楚为什么数据没有显示在列表视图中。我的代码运行良好,没有错误。有人可以帮帮我吗。我会很感激的!

ActivityMain.XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:orientation="vertical">


    <android.support.design.widget.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:layout_gravity="top|end"
            android:src="@drawable/ic_add_input_24dp"
            android:layout_marginTop="10dp"
            android:id="@+id/fab1"
            android:focusable="true"
            android:background="@color/whiteTrans" app:backgroundTint="#aaaaaa"/>
    <ListView
            android:id="@+id/mainClientList"
            android:layout_weight="1"
            android:layout_width="match_parent"
            android:layout_height="0dp"/>
</LinearLayout>

item_clients

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <ImageView
            android:layout_marginStart="20dp"
            android:layout_marginLeft="20dp"
            android:id="@+id/edt_client"
            android:tint="#898989"
            android:src="@drawable/ic_mode_edit_black_24dp"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:contentDescription="@string/todo"/>
    <TextView
            android:id="@+id/clientTxtId"
            android:text="@string/test_id"
            android:layout_marginLeft="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="15dp"
    />
    <TextView
            android:id="@+id/clientTxtName"
            android:text="@string/test_name"
            android:layout_marginLeft="5dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="5dp"
    />
    <TextView
            android:id="@+id/clientTxtAddress"
            android:text="@string/test_address"
            android:layout_marginLeft="15dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="15dp"/>
    <ImageView
            android:id="@+id/dlt_client"
            android:tint="#898989"
            android:src="@drawable/ic_delete_black_24dp"
            android:layout_marginLeft="70dp"
            android:layout_width="25dp"
            android:layout_height="25dp"
            android:contentDescription="@string/todo"
            android:layout_marginStart="70dp"/>

</LinearLayout>

AddorEditclients

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:layout_height="wrap_content"
        tools:context=".Add_or_Edit_Clients">
        <EditText

                android:layout_marginTop="250dp"
                android:id="@+id/customer_name"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:hint="@string/customer_name"/>
        <EditText
                android:id="@+id/customer_address"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:inputType="text"
                android:hint="@string/customer_address"/>
        <Button
                android:text="@string/add"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                tools:layout_editor_absoluteY="310dp"
                tools:layout_editor_absoluteX="161dp"
                android:id="@+id/btn_add"/>
</LinearLayout>

常量.kt

package com.abc.clientsapp

object Const {
    public val ADD = "add"
    public val UPDATE = "update"
    public val WHAT = "what"
    public val DATABASE_NAME = "Client_Database"
    public val DATABASE_VERSION = 1
    public val CLIENT_KEY = "client_key"
}

客户端.kt

package com.abc.clientsapp

import android.os.Parcel
import android.os.Parcelable
class Client :Parcelable {
    var id:Int = 0
    var name:String =""
    var address:String = ""
    constructor()
    constructor(id:Int,name:String,address: String)
    {
        this.id = id
        this.name = name
        this.address = address
    }

    override fun toString(): String {
        return "client_Table(id = '$id', name='$name', address = '$address')"
    }
    protected constructor(`in`: Parcel)  {
        id = `in`.readInt()
        name = `in`.readString()!!
        address = `in`.readString()!!
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(address)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<Client> {
        override fun createFromParcel(parcel: Parcel): Client {
            return Client(parcel)
        }

        override fun newArray(size: Int): Array<Client?> {
            return arrayOfNulls(size)
        }
    }
}

数据库助手.kt

package com.abc.clientsapp.Database

import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper
import com.abc.clientsapp.Client
import com.abc.clientsapp.Const.DATABASE_NAME
import com.abc.clientsapp.Const.DATABASE_VERSION
import kotlin.collections.ArrayList

class DatabaseHelper(context: Context?, name: String?, factory: SQLiteDatabase.CursorFactory?, version: Int) : SQLiteOpenHelper(context, name, factory, version) {
    val CLIENT_TABLE : String = "client_Table"
    val CLIENT_ID : String = "id"
    val CLIENT_NAME : String = "name"
    val CLIENT_ADDRESS : String = "address"
    companion object{
                        private var instance : DatabaseHelper? = null
                        fun getinstnce(ctx:Context):DatabaseHelper
                        {
                            if (instance==null)
                            {
                                instance = DatabaseHelper(ctx, DATABASE_NAME,null, DATABASE_VERSION)
                            }
                            return instance!!
                }
    }
    val createsql : String = "create table $CLIENT_TABLE($CLIENT_ID INTEGER PRIMARY KEY AUTOINCREMENT, $CLIENT_NAME TEXT , $CLIENT_ADDRESS TEXT)"
    override fun onCreate(db: SQLiteDatabase?) {
        db?.execSQL(createsql)
    }

    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL("DROP TABLE IF EXISTS $CLIENT_TABLE")
        onCreate(db)
    }
    fun addclient(name: String?,address:String?):Long
    {
        val values= ContentValues()
        values.put(CLIENT_NAME,name)
        values.put(CLIENT_ADDRESS,address)
        return this.writableDatabase.insert(CLIENT_TABLE,null,values)
    }
    fun updateclient(id:Int?,name: String?,address:String?):Int
    {
        val values = ContentValues()
        values.put(CLIENT_NAME,name)
        values.put(CLIENT_ADDRESS,address)
        return this.writableDatabase.update(CLIENT_TABLE,values,"$CLIENT_ID=?", arrayOf("$id"))
    }
    fun deleteclient(id: Int?):Int
    {
        return this.writableDatabase.delete(CLIENT_TABLE,"$CLIENT_ID=?", arrayOf("$id"))
    }
    fun getallclients() :ArrayList<Client>
    {
        var list: ArrayList<Client> = ArrayList()
        var cursor:Cursor = this.writableDatabase.query(CLIENT_TABLE, arrayOf(CLIENT_ID,CLIENT_NAME,CLIENT_ADDRESS),null,null,null,null,null)
        if (cursor.moveToFirst())
        {
            do {
                var cl = Client()
                cl.id = cursor.getInt(0)
                cl.name = cursor.getString(1)
                cl.address = cursor.getString(2)
                list.add(cl)
            }while (cursor.moveToNext())
        }
        this.writableDatabase.close()
        return list
    }
}

添加或编辑clients.kt

package com.abc.clientsapp

import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import com.abc.clientsapp.Database.DatabaseHelper
import android.view.MenuItem
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_add_or__edit__clients.*
import kotlinx.android.synthetic.main.item_clients.*

class Add_or_Edit_Clients : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_add_or__edit__clients)
        if (intent.getStringExtra(Const.WHAT).equals(Const.ADD)){
            btn_add.text = "ADD"
        }
        else{
            btn_add.text = "UPDATE"
            var cli : Client = intent.getParcelableExtra(Const.CLIENT_KEY)
            clientTxtName.setText(cli.name)
            clientTxtAddress.setText(cli.address)
        }
        btn_add.setOnClickListener{
            if (intent.getStringExtra(Const.WHAT) == Const.ADD)
            {
                addclient()
                finish()
            }
            else {
                updateclient(intent.getParcelableExtra(Const.CLIENT_KEY))
            }
        }

    }
    fun logmsg(msg:String)
    {
        Log.d("TAG",msg)
    }
    fun validateinput():Boolean
    {
        if (clientTxtName?.text.toString().trim().equals("")||clientTxtAddress?.text.toString().trim().equals(""))
        {
            Toast.makeText(this,"Please Fill all the Fields", Toast.LENGTH_SHORT).show()
            return false
        }
        else
            return true
    }

    override fun onOptionsItemSelected(item: MenuItem?): Boolean {
        if(item!=null)
        {
            when(item.itemId)
            {
                android.R.id.home->finish()
            }
        }
        return super.onOptionsItemSelected(item)
    }
    fun addclient()
    {
        if(validateinput())
        {
            DatabaseHelper.getinstnce(this).addclient(clientTxtName.text.toString(),clientTxtAddress.text.toString())
        }
    }
    fun updateclient(client: Client)
    {
        if(validateinput())
        {
            DatabaseHelper.getinstnce(this).updateclient(client.id,client.name,client.address)
        }
    }
}

主要活动

package com.abc.clientsapp

import android.content.Context
import android.content.Intent
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.os.Parcelable
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
import android.widget.TextView
import com.abc.clientsapp.Const.WHAT
import com.abc.clientsapp.Const.ADD
import com.abc.clientsapp.Database.DatabaseHelper
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        var adapter = ClientAdapter(this@MainActivity)

        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        mainClientList.adapter = adapter
        fab1.setOnClickListener {
            var intent = Intent(this@MainActivity,Add_or_Edit_Clients::class.java)
            intent.putExtra(WHAT,ADD)
            startActivity(intent)
        }

    }
    class ClientAdapter() : BaseAdapter() {
        private var list:ArrayList<Client> ?= null
        private var context:Context? = null
        constructor(context: Context?) : this()
        {
            this.list = DatabaseHelper.getinstnce(context!!).getallclients()
            this.context = context
        }
        fun updatelist() {
            this.list = DatabaseHelper.getinstnce(context!!).getallclients()
            notifyDataSetChanged()
        }

        override fun getView(position: Int, view: View?, parent: ViewGroup?): View {
            var convertView : View? = view
            if (convertView == null){
            convertView = View.inflate(context, R.layout.item_clients, null)}
            var txtId : TextView = convertView?.findViewById(R.id.clientTxtId) as TextView
            var txtName : TextView = convertView.findViewById(R.id.clientTxtName) as TextView
            var txtAddress : TextView = convertView.findViewById(R.id.clientTxtAddress) as TextView
            var imgEdt: ImageView = convertView.findViewById(R.id.edt_client) as ImageView
            var imgDlt: ImageView = convertView.findViewById(R.id.dlt_client) as ImageView
            txtId.text = list?.get(position)?.id.toString()
            txtName.text = list?.get(position)?.name
            txtAddress.text = list?.get(position)?.address
            imgEdt.setOnClickListener {

                var intent = Intent(context, Add_or_Edit_Clients::class.java)
                intent.putExtra(Const.WHAT, Const.UPDATE)
                intent.putExtra(Const.CLIENT_KEY, (list?.get(position)) as Parcelable)
                context?.startActivity(intent)

            }
            imgDlt.setOnClickListener {

                DatabaseHelper.getinstnce(context!!).deleteclient(list?.get(position)?.id)
                list?.removeAt(position)
                notifyDataSetChanged()
            }
            return convertView
        }
        override fun getItem(position: Int): Client? {
            return list?.get(position)
        }

        override fun getItemId(position: Int): Long {
            return position.toLong()
        }

        override fun getCount(): Int {
            return list!!.size
        }
    }

}

标签: androidsqlitekotlin

解决方案


推荐阅读