如何在Kotlin中向房间数据库添加模型类

zbdgwd5y  于 2022-11-16  发布在  Kotlin
关注(0)|答案(1)|浏览(181)

我有一个保存的模型,我需要添加到我的数据库。我怎样才能把它们导入到我的数据库。下面是模型类。

  1. {
  2. "AccountNumber": "S234567",
  3. "ActionRequiredID": "6,7",
  4. "AdditionalRemarks": "",
  5. "AndroidVersion": "31",
  6. "AntennaTypeID": 6,
  7. "AppVersion": "2.1.3",
  8. "CTRatio": "",
  9. "CategoryID": 1,
  10. "CurrentMeterSealNumber": "thhjj",
  11. "CycleName": "Nov-2022",
  12. "EndTime": "2022-11-07 12:05:51",
  13. "ICCIDNumber": "thb",
  14. "Images": [
  15. {
  16. "ID": 0,
  17. "PicFormat": "jpg",
  18. "PicName": "S23456-TRS_6-TI1-team1_2022-11-07_17-35-05.jpg",
  19. "PicPath": "/storage/emulated/0/Download/team1/MReader/troubleshoot/Troubleshooting-Nov-2022/Photos/",
  20. "PicSize": "36 KB",
  21. "PictureTypeID": 18,
  22. "ServiceID": 5,
  23. "SurveyID": 6
  24. }
  25. ],
  26. "IsGPSEnabled": true,
  27. "IsLiveGPS": true,
  28. "IsOnline": true,
  29. "Latitude": 11.0501224,
  30. "LocationAccuracy": 9.133,
  31. "LocationProvider": "fused",
  32. "Longitude": 76.9678775,
  33. "MeterLocationID": 1,
  34. "MeterModelID": 5,
  35. "MeterSerialNumber": "61604448",
  36. "NewMeterSealNumber": "",
  37. "PingTestID": 1,
  38. "ReasonForFailureID": "5",
  39. "ReasonID": 39,
  40. "Remarks": "",
  41. "Seal1": "",
  42. "Seal2": "",
  43. "Seal3": "",
  44. "Seal4": "",
  45. "ServiceID": 5,
  46. "SignalLevelID": 2,
  47. "SimInField": "cghb",
  48. "StartTime": "2022-11-07 12:05:05",
  49. "StatusID": 12,
  50. "StatusTroubleshootID": 4,
  51. "UserID": 161,
  52. "WorkOrderID": 6,
  53. "WorkOrderNumber": "TRS_6",
  54. "reason": "Completed",
  55. "status": "Completed"

}
List以外的信息需要添加到名为“ReplacedData”的单独表中,图像则添加到“Images”中。
我应该怎么做,对此有什么疑问?

vsdwdz23

vsdwdz231#

第1步基于模型创建一个@Entity(也称为表)注解类,表名为ReplacedData(根据 * List以外的信息需要添加到一个名为“ReplacedData”的单独表中 *)类,List字段具有@Ignore注解。
第2步基于Image类创建一个@Entity(第2个表)注解类,其中包含一个附加字段,用于存储所属ReplacedData行的主键(假设存在一对多关系,即图像可以有一个父代ReplacedData)

  • 可以选择包含ForeignKey定义以强制引用完整性
  • 可以选择对CASCACDE执行onDelete和onUpdate操作,从而帮助维护参照完整性

步骤3创建一个POJO,用于提取ReplacedData行沿着图像(子级),其中步骤1中的类是@Embedded,步骤2中的类是@Relation
例如,考虑以下工作示例(具有缩减的类):

步骤1

  1. @Entity
  2. data class ReplacedData(
  3. @PrimaryKey
  4. val replacedDataId: Long?=null,
  5. val AccountNumber: String,
  6. val ActionRequired: String,
  7. val AdditionalRemarks: String,
  8. val AndroidVersion: Int,
  9. val AppVersion: String,
  10. /* etc */
  11. )
  • 请注意,不确定AccountNumber是否是唯一的,是否适合主键,因此添加了replacedDataId。
    步骤2
  1. @Entity(
  2. /* Optional but suggested to enforce referential integrity */
  3. foreignKeys = [
  4. ForeignKey(
  5. entity = ReplacedData::class,
  6. parentColumns = ["replacedDataId"],
  7. childColumns = ["parentReplacedData"],
  8. onDelete = ForeignKey.CASCADE,
  9. onUpdate = ForeignKey.CASCADE
  10. )
  11. ]
  12. )
  13. data class Images(
  14. @PrimaryKey
  15. val imageId: Long?=null,
  16. @ColumnInfo(index = true)
  17. val parentReplacedData: Long,
  18. val ID: Long,
  19. val PicFormat: String,
  20. /* etc */
  21. )
  • 再次添加特定主键
  • 具有CASCADE的外键,以便实施和维护参照完整性
    步骤3
  1. data class ReplacedDataWithImages(
  2. @Embedded
  3. val replacedData: ReplacedData,
  4. @Relation(
  5. entity = Images::class,
  6. parentColumn = "replacedDataId",
  7. entityColumn = "parentReplacedData"
  8. )
  9. val imagesList: List<Images>
  10. )

演示的附加内容

  1. data class TheModel(
  2. val replacedData: ReplacedData,
  3. val ImageList: List<Images>
  4. )
  • 类似于Model类(但通过基于@Entity注解类对其进行简化而作弊)

:-

  1. @Dao
  2. interface AllDao {
  3. @Insert(onConflict = OnConflictStrategy.IGNORE)
  4. fun insert(replacedData: ReplacedData): Long
  5. @Insert(onConflict = OnConflictStrategy.IGNORE)
  6. fun insert(images: Images): Long
  7. @Transaction
  8. @Query("")
  9. fun insert(theModel: TheModel) {
  10. val replacedDataId = insert(theModel.replacedData)
  11. var imagesInserted=0
  12. if (replacedDataId > 0) {
  13. for(i: Images in theModel.ImageList) {
  14. if (insert(Images(parentReplacedData = replacedDataId, ID = i.ID, PicFormat = i.PicFormat)) > 0) {
  15. imagesInserted +=1
  16. }
  17. }
  18. }
  19. }
  20. @Transaction
  21. @Query("SELECT * FROM replaceddata")
  22. fun getAllFromReplacedDataWithImages(): List<ReplacedDataWithImages>
  23. }
  • 3个用于插入的函数,请注意,第3个函数采用**TheModel**,并插入ReplacedData和具有对父级的正确引用的相关图像(子级)。

:-

  1. @Database(entities = [ReplacedData::class,Images::class], exportSchema = false, version = 1)
  2. abstract class TheDatabase: RoomDatabase() {
  3. abstract fun getAllDao(): AllDao
  4. companion object {
  5. private var instance: TheDatabase? = null
  6. fun getInstance(context: Context): TheDatabase {
  7. if (instance==null) {
  8. instance = Room.databaseBuilder(context,TheDatabase::class.java,"thedatabase.db")
  9. .allowMainThreadQueries() /* to allow demo to use the main thread for brevity */
  10. .build()
  11. }
  12. return instance as TheDatabase
  13. }
  14. }
  15. }
  • 一个带有@Database注解的基本类沿着一个单例方法
  • 注意,为了简洁起见,它允许使用主线程,
    最后一句
  1. class MainActivity : AppCompatActivity() {
  2. lateinit var db: TheDatabase
  3. lateinit var dao: AllDao
  4. override fun onCreate(savedInstanceState: Bundle?) {
  5. super.onCreate(savedInstanceState)
  6. setContentView(R.layout.activity_main)
  7. db = TheDatabase.getInstance(this)
  8. dao = db.getAllDao()
  9. val listOfImages = listOf<Images>(
  10. Images(parentReplacedData = 0, ID = 0, PicFormat = "JPG"),
  11. Images(parentReplacedData = -1, ID = 10, PicFormat = "GIF"),
  12. Images(parentReplacedData = 0, ID = 100, PicFormat = "GIF")
  13. )
  14. dao.insert(
  15. TheModel(
  16. ReplacedData(
  17. AccountNumber = "S1234567",
  18. ActionRequired = "doit",
  19. AdditionalRemarks = "quickly",
  20. AndroidVersion = 31,
  21. AppVersion = "2.3.1"
  22. ),
  23. listOfImages
  24. )
  25. )
  26. val sb = StringBuilder()
  27. for (rdwi in dao.getAllFromReplacedDataWithImages()) {
  28. sb.clear()
  29. for (i in rdwi.imagesList) {
  30. sb.append("\n\t ID=${i.ID} Parent=${i.parentReplacedData} ImageId=${i.imageId} PivFormat=${i.PicFormat}")
  31. }
  32. Log.d("DBINFO"," Account Number=${rdwi.replacedData.AccountNumber} Image Count = ${rdwi.imagesList.size}. They are:-${sb}")
  33. }
  34. }
  35. }
  • 一些活动代码插入一些数据,然后提取它,将相关数据写入日志。

运行时(仅设计为运行一次),日志包含:-

  1. D/DBINFO: Account Number=S1234567 Image Count = 3. They are:-
  2. ID=0 Parent=1 ImageId=1 PivFormat=JPG
  3. ID=10 Parent=1 ImageId=2 PivFormat=GIF
  4. ID=100 Parent=1 ImageId=3 PivFormat=GIF

使用应用程序检查,然后:-

展开查看全部

相关问题