@Entity(tableName = "messages",
indices = [
Index(value = ["id"]),
Index(value = ["reply_id"]), // Index for faster querying on reply_id
Index(value = ["chat_id"])
])
@TypeConverters(MessageConverters::class) // Add this line
data class Message(
@ColumnInfo(name = "chat_id")
val chatId: Int,
@ColumnInfo(name = "sender_id")
val senderId: Long,
@ColumnInfo(name = "recipient_id")
val recipientId: Long,
@ColumnInfo(name = "sender_message_id")
val senderMessageId: Long,
@ColumnInfo(name = "reply_id")
val replyId: Long,
@ColumnInfo(name = "content")
val content: String,
@ColumnInfo(name = "read")
val read: Boolean = false,
@ColumnInfo(name = "status")
val status:ChatMessageStatus = ChatMessageStatus.SENDING,
@ColumnInfo(name = "type")
val type:ChatMessageType = ChatMessageType.TEXT,
@ColumnInfo(name = "file_id")
val fileId:String?=null,
@ColumnInfo(name = "last_sent_chunk_index")
val lastSentChunkIndex:Int=-1,
@ColumnInfo(name = "last_sent_byte_offset")
val lastSentByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_byte_offset")
val lastSentThumbnailByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_chunk_index")
val lastSentThumbnailChunkIndex:Int=-1,
@ColumnInfo(name = "file_abs_path")
val fileAbsolutePath:String?=null,
@ColumnInfo(name = "thumb_path")
val fileThumbPath:String?=null,
@ColumnInfo(name = "thumb_data")
val thumbData:String?=null,
@ColumnInfo(name = "cache_path")
val fileCachePath:String?=null,
@ColumnInfo(name = "download_url")
val fileDownloadUrl:String?=null,
@ColumnInfo(name = "file_metadata")
val fileMetadata: FileMetadata?=null,
@ColumnInfo(name = "timestamp")
val timestamp: Long
) {
@PrimaryKey(autoGenerate = true)
var id: Long = 0
// Function to convert ByteArray (thumbData) to Bitmap
fun getThumbnailBitmap(): Bitmap? {
return thumbData?.let {
File(thumbData).let {
if(it.exists()){
// Use 'use' to automatically close the stream after use
val options = BitmapFactory.Options().apply {
// Decode only bounds (no image data yet)
inJustDecodeBounds = true
}
// Step 1: Open the file input stream and decode just bounds
FileInputStream(it).use { inputStream ->
BitmapFactory.decodeStream(inputStream, null, options)
}
// Step 2: Set preferred config to save memory
options.inPreferredConfig = Bitmap.Config.RGB_565 // Uses 2 bytes per pixel instead of 4 (ARGB_8888)
// Step 3: Decode the image at full size (no scaling)
options.inJustDecodeBounds = false // Load the actual image data
options.inSampleSize = 1 // No scaling down, retain original size
// Step 4: Decode the image with the final options
FileInputStream(it).use { inputStream ->
BitmapFactory.decodeStream(inputStream, null, options)
}
}else{
null
}
}
}
}
}
@Deprecated("testing")
@Transaction
@Query("SELECT * FROM messages WHERE chat_id = :chatId ORDER BY id DESC LIMIT :limit")
fun getMessagesWithRepliesRaw1(chatId: Int, limit:Int): List
Ich frage eine Datenbank mit 25.000 Datensätzen ab, aber es dauert ziemlich lange, mit einer LIMIT-Klausel nur 20 Ergebnisse abzurufen. Obwohl nur 20 Zeilen angefordert werden, läuft die Abfrage langsamer als erwartet. Hier ist die Abfrage, die ich verwende:
Es dauert einige Sekunden (manchmal sogar länger), bis die Ergebnisse angezeigt werden. Ich habe die Abfrage auf grundlegende Leistungsoptimierungen wie die Einschränkung der Ergebnismenge überprüft, aber das Problem besteht weiterhin.
``
getMessagesWithRepliesRaw1(100,20)
``
[code] @Entity(tableName = "messages", indices = [ Index(value = ["id"]), Index(value = ["reply_id"]), // Index for faster querying on reply_id Index(value = ["chat_id"]) ]) @TypeConverters(MessageConverters::class) // Add this line
data class Message( @ColumnInfo(name = "chat_id") val chatId: Int,
@ColumnInfo(name = "sender_id") val senderId: Long,
@ColumnInfo(name = "recipient_id") val recipientId: Long,
@ColumnInfo(name = "sender_message_id") val senderMessageId: Long,
@ColumnInfo(name = "reply_id") val replyId: Long,
@ColumnInfo(name = "content") val content: String,
@ColumnInfo(name = "read") val read: Boolean = false,
@ColumnInfo(name = "status") val status:ChatMessageStatus = ChatMessageStatus.SENDING,
@ColumnInfo(name = "type") val type:ChatMessageType = ChatMessageType.TEXT,
@ColumnInfo(name = "file_id") val fileId:String?=null,
@ColumnInfo(name = "last_sent_chunk_index") val lastSentChunkIndex:Int=-1,
@ColumnInfo(name = "last_sent_byte_offset") val lastSentByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_byte_offset") val lastSentThumbnailByteOffset:Long=-1,
@ColumnInfo(name = "last_sent_thumbnail_chunk_index") val lastSentThumbnailChunkIndex:Int=-1,
@ColumnInfo(name = "file_abs_path") val fileAbsolutePath:String?=null,
@ColumnInfo(name = "thumb_path") val fileThumbPath:String?=null,
@ColumnInfo(name = "thumb_data") val thumbData:String?=null,
@ColumnInfo(name = "cache_path") val fileCachePath:String?=null,
@ColumnInfo(name = "download_url") val fileDownloadUrl:String?=null,
@ColumnInfo(name = "file_metadata") val fileMetadata: FileMetadata?=null,
@ColumnInfo(name = "timestamp") val timestamp: Long
) { @PrimaryKey(autoGenerate = true) var id: Long = 0
// Function to convert ByteArray (thumbData) to Bitmap fun getThumbnailBitmap(): Bitmap? { return thumbData?.let { File(thumbData).let { if(it.exists()){
// Use 'use' to automatically close the stream after use val options = BitmapFactory.Options().apply { // Decode only bounds (no image data yet) inJustDecodeBounds = true }
// Step 1: Open the file input stream and decode just bounds FileInputStream(it).use { inputStream -> BitmapFactory.decodeStream(inputStream, null, options) }
// Step 2: Set preferred config to save memory options.inPreferredConfig = Bitmap.Config.RGB_565 // Uses 2 bytes per pixel instead of 4 (ARGB_8888)
// Step 3: Decode the image at full size (no scaling) options.inJustDecodeBounds = false // Load the actual image data options.inSampleSize = 1 // No scaling down, retain original size
// Step 4: Decode the image with the final options FileInputStream(it).use { inputStream -> BitmapFactory.decodeStream(inputStream, null, options) } }else{ null } }
} } } [/code] [code] @Deprecated("testing") @Transaction @Query("SELECT * FROM messages WHERE chat_id = :chatId ORDER BY id DESC LIMIT :limit") fun getMessagesWithRepliesRaw1(chatId: Int, limit:Int): List
[/code] Ich frage eine Datenbank mit 25.000 Datensätzen ab, aber es dauert ziemlich lange, mit einer LIMIT-Klausel nur 20 Ergebnisse abzurufen. Obwohl nur 20 Zeilen angefordert werden, läuft die Abfrage langsamer als erwartet. Hier ist die Abfrage, die ich verwende: Es dauert einige Sekunden (manchmal sogar länger), bis die Ergebnisse angezeigt werden. Ich habe die Abfrage auf grundlegende Leistungsoptimierungen wie die Einschränkung der Ergebnismenge überprüft, aber das Problem besteht weiterhin. `` getMessagesWithRepliesRaw1(100,20) ``
Ich muss 250.000 Datensätze in einer MySQL-Datenbank aktualisieren. Die Aktualisierung umfasst das Zusammenführen zweier Tabellen (student_records und enrollment_details) und das Festlegen der Felder...
Ich bin von Jboss EAP 7 nach Wildfly 26 migriert. 2023, der 3-4 Minuten dauerte. WARN (Controller -Start -Thread) WFLYCTL0456: Systemeigenschaft JBoss.as.Management.Blocking.TimeOut ist bereits im...
Ich versuche, eine sehr einfache Abfrage zu lösen, aber manchmal wird das Ergebnis nicht angezeigt und ich weiß nicht, warum die Abfrage erfolgreich zu sein scheint. Ich frage mich nur, warum das...
Ich habe ein MacBook Air M3, habe auch ein UTM VM mit macOS installiert und es 8 Kerne und 16 GB RAM gegeben.
Dann habe ich Android Studio installiert und die Benutzeroberfläche ist sehr Langsam,...
Ich habe eine Abfrage, die schlecht abschneidet, und ich bin mir nicht sicher, wo das Problem ist. Eine massiv reduzierte Version der Abfrage, die immer noch dasselbe Problem zeigt, lautet:
SELECT...