当前位置: 首页 > news >正文

Android compose Room Sqlite 应用 (注入式)

1.添加room库

project build.gradle.kts

    //pluginskotlin("plugin.serialization") version "2.1.0"id("androidx.room") version "2.7.1" apply false

app build.gradle.kts

    //plugins kotlin("plugin.serialization")id("androidx.room")kotlin("kapt")
//dependencies
//roomvar room_version = "2.7.1"implementation("androidx.room:room-ktx:$room_version")implementation("androidx.room:room-runtime:$room_version")kapt("androidx.room:room-compiler:$room_version")//injectimplementation("io.insert-koin:koin-android:4.0.3")implementation("io.insert-koin:koin-androidx-compose:4.0.3")implementation("io.insert-koin:koin-androidx-compose-navigation:4.0.3")//serializationimplementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.8.0")

2.创建数据库

//Entities

@Entity(tableName = "banner")
data class BannerEntity(@PrimaryKey(autoGenerate = true) val id: Int = 0,val url: String
)@Entity(tableName = "category")
data class CategoryEntity(@PrimaryKey val id: Int,val title: String
)@Entity(tableName = "item")
data class ItemEntity(@PrimaryKey(autoGenerate = true) val id: Int = 0,val title: String,val description: String,val price: Int,val rating: Double,val showRecommended: Boolean,val categoryId: Int
)@Entity(tableName = "pic_url")
data class PicUrlEntity(@PrimaryKey(autoGenerate = true) val id: Int = 0,val itemId: Int,val url: String
)data class ItemWithPics(@Embedded val item: ItemEntity,@Relation(parentColumn = "id",entityColumn = "itemId")val pics: List<PicUrlEntity>
)data class ItemWithCategory(@Embedded val item: ItemEntity,@Relation(parentColumn = "categoryId",entityColumn = "id")val category: CategoryEntity
)data class ItemFull(@Embedded val item: ItemEntity,@Relation(parentColumn = "id",entityColumn = "itemId")val pics: List<PicUrlEntity>,@Relation(parentColumn = "categoryId",entityColumn = "id")val category: CategoryEntity
)

//Daoes


@Dao
interface BannerDao {@Insertsuspend fun insertAll(banners: List<BannerEntity>)@Query("SELECT * FROM banner")suspend fun getAll(): List<BannerEntity>
}@Dao
interface CategoryDao {@Insertsuspend fun insertAll(categories: List<CategoryEntity>)@Query("SELECT * FROM category")suspend fun getAll(): List<CategoryEntity>
}@Dao
interface ItemDao {@Insertsuspend fun insertAll(items: List<ItemEntity>)@Transaction@Query("SELECT * FROM item")suspend fun getItemsWithPics(): List<ItemWithPics>@Transaction@Query("SELECT * FROM item WHERE showRecommended = 1")suspend fun getRecommendedItems(): List<ItemWithPics>@Transaction@Query("SELECT * FROM item WHERE categoryId = :categoryId")suspend fun getItemsByCategory(categoryId: Int): List<ItemWithPics>@Transaction@Query("SELECT * FROM item")suspend fun getFullItemData(): List<ItemFull>
}@Dao
interface PicUrlDao {@Insertsuspend fun insertAll(picUrls: List<PicUrlEntity>)@Query("SELECT * FROM pic_url WHERE itemId = :itemId")suspend fun getPicsByItemId(itemId: Int): List<PicUrlEntity>
}

//Databases

@Database(entities = [BannerEntity::class,CategoryEntity::class,ItemEntity::class,PicUrlEntity::class
], version = 1)
abstract class AppDatabase : RoomDatabase() {abstract fun bannerDao(): BannerDaoabstract fun categoryDao(): CategoryDaoabstract fun itemDao(): ItemDaoabstract fun picUrlDao(): PicUrlDaocompanion object {@Volatileprivate var INSTANCE: AppDatabase? = nullprivate const val DATABASE_NAME = "database.db"fun getInstance(context: Context): AppDatabase {return INSTANCE ?: synchronized(this) {INSTANCE ?: buildDatabase(context).also { INSTANCE = it }}}private fun buildDatabase(context: Context): AppDatabase {return Room.databaseBuilder(context.applicationContext,AppDatabase::class.java,DATABASE_NAME).createFromAsset(DATABASE_NAME).build()}}
}

//数据库文件

在绑定文件中。

3. 配置模块,定义 Application

val appModule = module {single { AppDatabase.getInstance(get()) }viewModelOf(::DashboardViewModel)
}
class OnlineShopApplication: Application() {override fun onCreate() {super.onCreate()startKoin {androidContext(this@OnlineShopApplication)modules(appModule)}}
}

在AndroidManifest.xml中添加application的使用代号

    <applicationandroid:name=".OnlineShopApplication" android:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.OnlineShopApp"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"android:label="@string/app_name"android:theme="@style/Theme.OnlineShopApp"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application>

4.创建DashboardViewModel

class DashboardViewModel(private val appDatabase: AppDatabase
): ViewModel() {private val _mState = MutableStateFlow(DashboardState())val mState = _mState.onStart {initBanners()initCategories()initItemWithPics()}.stateIn(viewModelScope,SharingStarted.WhileSubscribed(5000),_mState.value)private fun initBanners(){viewModelScope.launch {val bannerEntities = appDatabase.bannerDao().getAll()_mState.update {it.copy(banners = bannerEntities)}}}private fun initCategories(){viewModelScope.launch {val categoryEntities = appDatabase.categoryDao().getAll()_mState.update {it.copy(categories = categoryEntities)}}}private fun initItemWithPics(){viewModelScope.launch {val recommandItems = appDatabase.itemDao().getRecommendedItems()_mState.update {it.copy(itemWithPics = recommandItems)}}}
}

5.创建DashboardState

data class DashboardState (val banners:List<BannerEntity> = emptyList(),val categories:List<CategoryEntity> = emptyList(),val itemWithPics:List<ItemWithPics> = emptyList(),
)

6.使用viewmodel

在@Compose中

    // val isPreview = falseval viewModel = if (isPreview) injectPreviewModel() else koinViewModel()val mState by viewModel.mState.collectAsStateWithLifecycle()//使用时//mState.banners
@Composable
fun injectPreviewModel(): DashboardViewModel {val context = LocalContext.currentreturn remember {DashboardViewModel(AppDatabase.getInstance(context))}
}

7.当viewmodel中带有参数时。

//定义带有参数的viewmodel时class DetailViewModel(private val appDatabase: AppDatabase,private val param: Route.Detail
) : ViewModel() {}

在@Compose使用时

    val viewModel =if (isPreview) injectPreviewModel(param) else koinViewModel { parameterSetOf(param)}val mState by viewModel.mState.collectAsStateWithLifecycle()

http://www.dtcms.com/a/391371.html

相关文章:

  • 缓存穿透+缓存雪崩+缓存击穿(解决方法+实战)
  • Docker技术相对于虚拟机技术的优劣势对比!
  • MyBatis框架与参数详解
  • Confluent-Kafka-go 发布超过 1M 消息失败问题解决
  • 数字图像处理-函数矩阵
  • 基于 ST-Link 和 MDK-Keil 的 STM32 程序下载实验
  • 安防监控系统的架构与组成原理
  • 【前端】【threeJs】前端事件偏移问题完整总结
  • web:ts的类型兼容性
  • 黑盒测试:测试用例设计之场景法(流程图法)(模拟用户实际使用软件的场景来设计测试用例,适用于业务流程复杂的系统测试)基本流、备选流
  • Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第二章> 之 平台功能架构整理
  • 神经网络学习笔记14——高效卷积神经网络架构EfficientNet
  • Flutter实现滑动页面停留吸附
  • 【Linux】基本指令介绍
  • 爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】----待完成
  • 【软考-系统架构设计师】特定领域软件体系结构(DSSA)
  • idea git使用提示问题处理
  • 数据结构初阶——哈希表的实现(C++)
  • Problem: lab-week3- exercise01 Insertion sort
  • 金融级虚拟机安全:虚拟化平台5大安全风险与国产化防护实践
  • 可视化在智慧城市中的应用
  • C#实现高性能拍照(旋转)与水印添加功能完整指南
  • Pandas 2.x与PyArrow:深入探索内存优化与性能提升技巧
  • opencv之轮廓识别
  • lesson65:JavaScript字符串操作完全指南:从基础到高级实战
  • 【脑电分析系列】第19篇:深度学习方法(一):卷积神经网络(CNN)在EEG图像/时频图分类中的应用
  • 写文件的几种方法
  • 序列化与反序列化漏洞及防御详解
  • uniapp 锁定竖屏,固定竖屏,锁定屏幕
  • 论文解读 | Franka 机器人的 CRISP-ROS2 集成实践:适配学习型操作策略与遥操作