首页 > 解决方案 > 上传并显示数据 Firestore kotlin

问题描述

我的代码有问题,但没有错误。当我尝试将变量“artistName”和“trackName”更改为我的对象“SoundTrack”时,问题就出现了。如果我使用变量“artistName”和“trackName”,它可以正常工作,我可以上传、删除和显示数据等。但是当我尝试使用我的对象时,什么都没有发生,就像它没有连接到我的数据库一样。

我的课:

类 SoundTrack(val 名称:字符串,val 轨道:字符串)

这是我的主要活动:

类 MainActivity : AppCompatActivity(), View.OnClickListener {

val collection = "song"
//val artistName = "name"
//val trackName = "track"
var docId =""

lateinit var newTrack : SoundTrack
lateinit var  db : FirebaseFirestore
lateinit var alSongs : ArrayList<HashMap<String,Any>>
lateinit var adapter: SimpleAdapter


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

    alSongs = ArrayList()
    addData.setOnClickListener(this)
    updateInfo.setOnClickListener(this)
    deleteInfo.setOnClickListener(this)
    IsData.setOnItemClickListener(itemClick)

}

override fun onStart() {
    super.onStart()
    db = FirebaseFirestore.getInstance()
    db.collection(collection).addSnapshotListener { querySnapshot, e ->
        if(e != null) Log.d("fireStore", e.message)
        showData()
    }
}

//add new data by input
override fun onClick(v: View?) {
    when(v?.id){
        R.id.addData ->{
            println("hej")
            if(::newTrack.isInitialized){
                val hm = HashMap<String, Any>()
                hm.set(newTrack.name,artistNametxt.text.toString())
                hm.set(newTrack.track,trackNametxt.text.toString())

                db.collection(collection).document(artistNametxt.text.toString()).set(hm).
                    addOnSuccessListener {
                        Toast.makeText(this, "Data Successfully added", Toast.LENGTH_SHORT)
                            .show()
                    }.addOnFailureListener { e ->
                    Toast.makeText(this, "Data unSuccessfully added : ${e.message}", Toast.LENGTH_SHORT)
                        .show()
                }
            }
        }
        //Update input
        R.id.updateInfo -> {
            if(::newTrack.isInitialized){
                val hm = HashMap<String, Any>()
                hm.set(newTrack.name,artistNametxt.text.toString())
                hm.set(newTrack.track,trackNametxt.text.toString())
                db.collection(collection).document(docId).update(hm)
                    .addOnSuccessListener { Toast.makeText(this, "Data Successfully updated", Toast.LENGTH_SHORT)
                        .show() }
                    .addOnFailureListener { e ->
                        Toast.makeText(this, "Data unSuccessfully updated : ${e.message}", Toast.LENGTH_SHORT)
                            .show()
                    }
            }
        }
        //delete Input

        R.id.deleteInfo -> {
            if(::newTrack.isInitialized){
                db.collection(collection).whereEqualTo(newTrack.name,docId).get().addOnSuccessListener {
                        results ->
                    for(doc in results){
                        db.collection(collection).document(doc.id).delete()
                            .addOnSuccessListener {
                                Toast.makeText(this, "Data Successfully updated", Toast.LENGTH_SHORT)
                                    .show()
                            }.addOnFailureListener { e ->
                                Toast.makeText(this, "Data unSuccessfully updated : ${e.message}", Toast.LENGTH_SHORT)
                                    .show()
                            }
                    }
                }.addOnFailureListener { e ->
                    Toast.makeText(this, "Cant get data reference: ${e.message}", Toast.LENGTH_SHORT)
                        .show()
                }
            }
        }
    }
}

val itemClick = AdapterView.OnItemClickListener { parent, view, position, id ->
    val hm = alSongs.get(position)
    docId = hm.get(newTrack.name).toString()
    artistNametxt.setText(hm.get(newTrack.name).toString())
    trackNametxt.setText(hm.get(newTrack.name).toString())
}
//Show input data
fun showData(){
    if(::newTrack.isInitialized){
        db.collection(collection).get().addOnSuccessListener { result ->

            alSongs.clear()
            for(doc in result){
                val hm = HashMap<String,Any>()
                hm.set(newTrack.name,doc.get(newTrack.name).toString())
                hm.set(newTrack.track,doc.get(newTrack.track).toString())
                alSongs.add(hm)
            }
        }

        adapter = SimpleAdapter(this,alSongs,R.layout.row_data,
            arrayOf(newTrack.name,newTrack.track),
            intArrayOf(R.id.txName, R.id.TxTrack))
        IsData.adapter = adapter
    }
}

}

标签: androidfirebasekotlin

解决方案


首先我会改变

class SoundTrack (val name : String, val track : String)

data class SoundTrack(val name : String ="",val track : String ="")

并删除

lateinit var newTrack : SoundTrack

所以你不再需要这样做了

if(::newTrack.isInitialized)

删除

lateinit var  db : FirebaseFirestore

并创建对象类

object FirestoreUtil {
    private val firestoreInstance: FirebaseFirestore by lazy {
        FirebaseFirestore.getInstance()
    }
}

或者更好

class MainActivity : AppCompatActivity() {
    lateinit var adapter: SimpleAdapter

    val itemClick = AdapterView.OnItemClickListener { parent, view, position, id ->

        val selectedSong = FirestoreUtils.songList.value?.get(position)

        selectedSong?.let {
            artistNametxt.setText(it.name.toString())
            trackNametxt.setText(it.track.toString())
        }

    }

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

        FirestoreUtils.getSongs().observe(this, Observer { songList ->
            adapter = SimpleAdapter(
                this, songList, R.layout.row_data,
                arrayOf(SongTrack().name, SongTrack().track),
                intArrayOf(R.id.txName, R.id.TxTrack)
            )
            IsData.adapter = adapter
        })

        addData.setOnClickListener {
            FirestoreUtils.addSong(
                SongTrack(
                    artistNametxt.text.toString(),
                    trackNametxt.text.toString()
                )
            ) { message -> Toast.makeText(this, message, Toast.LENGTH_SHORT).show() }
        }

        updateInfo.setOnClickListener {
            FirestoreUtils.updateSong(
                SongTrack(
                    artistNametxt.text.toString(),
                    trackNametxt.text.toString()
                )
            ) { message ->
                Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
            }
        }

        deleteInfo.setOnClickListener(FirestoreUtils.deleteSong(artistNametxt.text.toString()) { message ->
            Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
        })

        IsData.setOnItemClickListener {
            itemClick
        }

    }
}

const val SONG_COLLECTION = "song"

data class SongTrack(val name: String = "", val track: String = "")

object FirestoreUtils {
    private val firestoreInstance: FirebaseFirestore by lazy {
        FirebaseFirestore.getInstance()
    }
    private val songCollection = firestoreInstance.collection(SONG_COLLECTION)

    private val song = mutableListOf<SongTrack>()

    val songList: MutableLiveData<MutableList<SongTrack>> = MutableLiveData()


    fun getSongs(): LiveData<MutableList<SongTrack>> {
        firestoreInstance.collection(SONG_COLLECTION)
            .addSnapshotListener { querySnapshot,
                                   firebaseFirestoreException ->
                song.clear()

                querySnapshot?.documents?.forEach {
                    it.toObject<SongTrack>()?.let { songTrack ->
                        song.add(songTrack)
                    }
                }
            }
        songList.postValue(song)
        return songList
    }

    fun addSong(songTrack: SongTrack, onComplete: (String) -> Unit) {
        songCollection.document(songTrack.name)
            .set(songTrack)
            .addOnSuccessListener { onComplete("Data Successfully added") }
            .addOnFailureListener { onComplete("Data unSuccessfully added : ${it.message}") }

    }

    fun updateSong(songTrack: SongTrack, onComplete: (String) -> Unit) {
        songCollection.document(songTrack.name)
            .set(songTrack)
            .addOnSuccessListener { onComplete("Data Successfully updated") }
            .addOnFailureListener { onComplete("Data unSuccessfully updated : ${it.message}") }
    }

    fun deleteSong(songTrack: SongTrack, onComplete: (String) -> Unit) {
        val deleteSong = songTrack.name
        songCollection.document(songTrack.name).delete()
            .addOnSuccessListener { onComplete("Song $deleteSong deleted") }
            .addOnFailureListener { onComplete("Not found the song id : ${songTrack.name}") }
    }
}

我只是从您的代码中编辑,尚未测试!

享受。


推荐阅读