• 카테고리

    질문 & 답변
  • 세부 분야

    모바일 앱 개발

  • 해결 여부

    미해결

리얼타임 데이터베이스의 저장하기,불러오기 부분은 완성 코드가 없나요? ㅠ

23.10.17 23:38 작성 조회수 198

0

package com.android.diet_memo

import android.app.DatePickerDialog
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.widget.Button
import android.widget.DatePicker
import android.widget.EditText
import android.widget.ListView
import androidx.appcompat.app.AlertDialog
import com.android.diet_memo.databinding.ActivityMainBinding
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.google.firebase.database.ktx.database
import com.google.firebase.ktx.Firebase
import java.util.Calendar
import java.util.GregorianCalendar

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding   // private lateinit var 와 lazy를 쓰는경우 정확히 어떤차이?

    val dataModelList = mutableListOf<DataModel>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val database = Firebase.database
        val myRef = database.getReference("시발 개좆같은 fianl")
        val listView = findViewById<ListView>(R.id.mainLV)
        val adapter_list = ListVeiwAdapter(dataModelList)

        listView.adapter = adapter_list

        myRef.addValueEventListener(object : ValueEventListener {
            override fun onDataChange(snapshot: DataSnapshot) {
                for (dataModel in snapshot.children) {
                    Log.d("Data", dataModel.toString())
                    dataModelList.add(dataModel.getValue(DataModel::class.java)!!)
                }
            Log.d("DataMoel",dataModelList.toString())
            }

            override fun onCancelled(error: DatabaseError) {
                TODO("Not yet implemented")
            }

        })

        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.writebtn.setOnClickListener {

            val mDialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null)
            val mBuilder = AlertDialog.Builder(this)
                .setView(mDialogView)
                .setTitle("운동 메모 다이얼로그")

            val mAlertDialog = mBuilder.show()
            val DateSelectBtn = mAlertDialog.findViewById<Button>(R.id.dateSelectBtn)
            var dateText = "" //dateText 버튼은 변경되니까 var로

            DateSelectBtn?.setOnClickListener {

                val today = GregorianCalendar()
                val year: Int = today.get(Calendar.YEAR)
                val month: Int = today.get(Calendar.MONTH)
                val date: Int = today.get(Calendar.DATE)


                val dlg = DatePickerDialog(this, object : DatePickerDialog.OnDateSetListener {
                    override fun onDateSet(
                        view: DatePicker?,
                        year: Int,
                        month: Int,
                        dayOfMonth: Int
                    ) {

                        Log.d("Main", "${year}, ${month + 1}, ${dayOfMonth}")
                        DateSelectBtn.setText("${year}, ${month + 1}, ${dayOfMonth}")

                        dateText = "${year}, ${month + 1}, ${dayOfMonth}" // dateText를 이런식으로 묶음
                    }


                }, year, month, date)
                dlg.show()

            }
            val saveBtn = mAlertDialog.findViewById<Button>(R.id.saveBtn)
            saveBtn?.setOnClickListener {
                // Write a message to the database
                val healMemo = mAlertDialog.findViewById<EditText>(R.id.healthMemo)?.text.toString()
                val database = Firebase.database
                val myRef = database.getReference("final")
                val model = DataModel(dateText, healMemo) //계속 이런식으로 껍데기를 만드는걸 연습해야할듯,,?

                myRef.setValue(model)
                myRef
                    .push()
                    .setValue(model)
                mAlertDialog.dismiss()

            }
        }
    }
}

리스트뷰 생성후 어뎁터 연결하는부분 따라치고나서부터 알수없는 에러로,,연결이 되지않습니다42번째 라인

dataModelList.add(dataModel.getValue(DataModel::class.java)!!)

부분에서 오류가 났다고 gpt선생님이 그러시는데.. 잘모르겠습니다.

package com.android.diet_memo

data class DataModel (

    val date:String = "",
    val memo:String = ""

)
package com.android.diet_memo

import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView

class ListVeiwAdapter(val List : MutableList<DataModel>) : BaseAdapter() {
    override fun getCount(): Int {
        return List.size
    }

    override fun getItem(position: Int): Any {
        return List[position]
    }

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

    override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {

        var convertView = convertView
        if (convertView == null) {

            convertView = LayoutInflater.from(parent?.context).inflate(R.layout.listview_item,parent,false)

        }

        val date = convertView?.findViewById<TextView>(R.id.ListViewDateArea)
        val memo = convertView?.findViewById<TextView>(R.id.ListViewMemoArea)

        date!!.text = List[position].date
        memo!!.text = List[position].memo

        Log.d("Test","Date: ${date.text},Memo: ${memo.text}")
        return convertView!!
    }
}
package com.android.diet_memo

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Handler
import android.util.Log
import android.widget.Toast
import com.android.diet_memo.databinding.ActivityMainBinding
import com.android.diet_memo.databinding.ActivitySplashBinding
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.auth.ktx.auth
import com.google.firebase.ktx.Firebase
import java.lang.Exception

class Splash : AppCompatActivity() {

    private lateinit var binding: ActivitySplashBinding
    private lateinit var auth: FirebaseAuth

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = ActivitySplashBinding.inflate(layoutInflater)
        setContentView(binding.root)

        auth = Firebase.auth
        try {

            Log.d("SPLASH", auth.currentUser!!.uid)
            Toast.makeText(this,"원래 비회원 로그인이 되어있는 사람입니다",Toast.LENGTH_LONG).show()
            // splash 부분
            Handler().postDelayed({
                startActivity(Intent(this, MainActivity::class.java))
                finish()
            },3000) // splash 부분(끝)
        } catch (e: Exception) {
            Log.d("fxxk", "회원가입 시켜줘야함")

            //실패하고, 회원가입 시켜줘야하므로 catch 부분에 예외처리를 해주고,익명로그인 창으로 뜨게한다.
            auth.signInAnonymously()  //firebase 익명로그인 하는 코드 시작부분
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {
                        // Sign in success, update UI with the signed-in user's information
                        Toast.makeText(this,"비회원 로그인 성공", Toast.LENGTH_LONG).show()
                        // splash 부분
                        Handler().postDelayed({
                            startActivity(Intent(this, MainActivity::class.java))
                            finish()
                        },3000) // splash 부분(끝)
                    } else {
                        // If sign in fails, display a message to the user.
                        Toast.makeText(this,"비회원 로그인 실패", Toast.LENGTH_LONG).show()
                    }
                }
        }
    }
}

클래스파일 전체입니다

답변 1

답변을 작성해보세요.

0

전체 프로젝트를 압축해서 구글 드라이브를 통해 공유해주시면 살펴볼게요!