# #android #firebase #kotlin #firebase-realtime-database #android-room
Вопрос:
я попытался разделить строку на две переменные, одна из которых строковая, а другая длинная. это работает, когда я регистрирую его, я вижу его и могу вставить в базу данных, но я не знаю, почему «когда-нибудь» я получаю эту ошибку. строка выглядит так
m8fw5sMdAcaX4Ezv7vzImeRAjkq2_1635234951781
java.lang.NumberFormatException: For input string: "m8fw5sMdAcaX4Ezv7vzImeRAjkq2" at java.lang.Long.parseLong(Long.java:594) at java.lang.Long.parseLong(Long.java:636) at com.animals.snowy.MainActivity$insertMessage$1$messageListener$1.onChildAdded(MainActivity.kt:88)
моя Модель
@IgnoreExtraProperties @Entity(tableName = "message_table") data class MessageModel( @NonNull @PrimaryKey var messageId: String = "", var messageType: String? = null, var messageTimestamp: Long? = null, var messageData: String? = null, var messageSenderId: String? = null, var roomId: String = "", var isSeen: Boolean = false, var uploadSuccess : Boolean = false ) : Serializable { }
и это мой код , я хочу получить новое сообщение о друзьях, поэтому я получаю список друзей из базы данных комнат и использую цикл for для получения идентификатора комнаты(имя дочернего контейнерного сообщения меня и моего друга).
private fun insertMessage() { viewModel.readRoomIdFriendsDAO().observe(this, { listRoomId -gt; if (listRoomId != null amp;amp; listRoomId.isNotEmpty()) { for (item in listRoomId) { val messageListener = object : ChildEventListener { override fun onChildAdded(snapshot:DataSnapshot,previousChildName: String?) { val messageModel: MessageModel? = snapshot.getValue(MessageModel::class.java) if (messageModel != null) { messageModel.messageId = snapshot.key.toString().trim() messageModel.roomId = item messageModel.uploadSuccess = true val listTemp = messageModel.messageId.split("_") messageModel.messageSenderId = listTemp[0] messageModel.messageTimestamp = listTemp[1].trim().toLong() Log.e(TAG,"senderId: ${messageModel.messageSenderId}") Log.e(TAG,"timestamp: ${messageModel.messageTimestamp}") // messageViewModel.insertMessageDAO(messageModel) } } override fun onChildChanged( snapshot: DataSnapshot, previousChildName: String? ) { } override fun onChildRemoved(snapshot: DataSnapshot) { } override fun onChildMoved( snapshot: DataSnapshot, previousChildName: String? ) { TODO("Not yet implemented") } override fun onCancelled(error: DatabaseError) { TODO("Not yet implemented") } } messageRef .child(item) .addChildEventListener(messageListener) } } }) }
Комментарии:
1. Вы уверены, что этот формат всегда соблюдается? Может ли строка иметь 2
_
секунды или что-то в этом роде?2. очевидно, что это не всегда в том формате, о котором вы подозревали. Я предлагаю создать журнал сразу после создания listTemp, чтобы посмотреть, что в нем содержится, прежде чем делать
toLong()
это, потому что именно там происходит сбой3. я пытаюсь , но большое спасибо
Ответ №1:
java.lang.NumberFormatException
выбрасывается всякий раз, когда компилятор пытается ввести в число недопустимый ввод.
Например:
String validInputToCast = "123456789"; Long validInputToCast = validInputToCast.toLong(); // this casting will succeed. String invalidInputToCast = "abce124"; Long invalidCastedInput = inputToCast.toLong(); // compiler will throw number exception on this line.
Попробуйте отладить строку ниже, и, надеюсь, вы обнаружите ошибку.
messageModel.messageTimestamp = listTemp[1].trim().toLong()