Загрузить и показать данные Firestore kotlin - PullRequest
0 голосов
/ 10 апреля 2020

У меня проблема с моим кодом, но я не получаю ошибок. Проблема возникает, когда я пытаюсь изменить мои переменные «artistName» и «trackName» на мой объект «SoundTrack». Если я использую мои переменные «artistName» и «trackName», это работает нормально, я могу загружать, удалять и отображать данные и т.д. c. Но когда я пытаюсь использовать мой объект, ничто не происходит, как будто оно не подключается к моей базе данных.

Мой класс:

класс SoundTrack (имя val: String, val track: String )

Вот мой MainActivity:

класс 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
    }
}

}

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Попробуйте это

fun getSongs(): LiveData<MutableList<SongTrack>> {
    firestoreInstance.collection(SONG_COLLECTION)
        .addSnapshotListener { querySnapshot,
                               firebaseFirestoreException ->
            song.clear()
            querySnapshot?.documents?.forEach {document ->
                val songTrack = document.toObject(SongTrack::class.java)
                songTrack?.let {
                    song.add(it)
                }

            }
        }
    songList.postValue(song)
    return songList
}
0 голосов
/ 10 апреля 2020

Сначала я бы изменил

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

Я просто редактирую из вашего кода, еще не тестировал !!!

Наслаждайтесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...