How to save a list of objects with Proto DataStore
Asked Answered
T

2

9

If I have the following class, how can I save a list of it with Proto DataStore?

data class Tag(
    val id: int,
    val name: String
)

All guides that I saw were teaching how to save only a single object. Is it possible to have a list of it?

Temporary answered 19/10, 2020 at 15:51 Comment(0)
C
10

You should consider storing list of content in Room, Even proto-datastore isnt a proper solution to store complex stuff,

If you still want then, I will suggest you to restrict the data stored to 10-15 items

to the code --->

  1. Create your proto file, repeated is used to create list type for Java
message Student {
  string id = 1;
  string name = 2;
}

message ClassRoom {
  string teacher = 1;
  repeated Student students  = 2; // repeated => list
}

  1. Inside your proto-store,
dataStore.updateData { store ->
       store.toBuilder()
      .clearStudents() // clear previous list
      .setAllStudents(students)// add the new list
      .build()
}


if you want example checkout my sample app, read the data/domain layer https://github.com/ch8n/Jetpack-compose-thatsMine

Choreography answered 4/11, 2020 at 7:33 Comment(6)
Thank you! For this case, I used Room. Thanks for the explanation.Temporary
Hi Chetan, I'm curious, why do you suggest to restrict the data stored to 10-15 items?Vat
Not a big reason, 1mb is limit for data store, and with data getting serialized and deseralized time will increase with size @DanielWeidensdörferChoreography
@ChetanGupta Thanks, I get the data limit reason. Will the serialization/deserialization time be significant/noticable on a big dataset? I'm just curious, I don't intend to use protobuffers for big amounts of data.Vat
they would be obviously faster than shared preferences, but I'm not sure between sqllite and proto buffer, but I can say protobuff are used on Back End than sqllite. Might me some advantages. @DanielWeidensdörferChoreography
The reason for limiting the items size to 10-15 is not because of the file size limit (I haven't seen any limit on that anywhere in the documentation, actually). The reason is because you cannot just fetch or update a part of data from a list like you can with SQLite libraries such as Room. This is true for both Proto and Preferences version. So if you have 10 thousand elements and you save them to DataStore and then you want to update 2 of them based on a condition you'll have to fetch the entire list, manipulate it and put it back. Here Room (or any DB solution) will be a way to goGunsmith
B
1

You can encode your class object into json string by the help of kotlinx json library and store that string into datastore preference like below ->

@Serializable
data class EmployeeCorporateInfo(
    @SerialName("companyName")
    val companyName: String,
    @SerialName("employeeInfo")
    val employeeInfo: EmployeeInfo,
    @SerialName("firstName")
    val firstName: String,
    @SerialName("id")
    val id: String,
    @SerialName("lastName")
    val lastName: String,
    @SerialName("middleName")
    val middleName: String
)

@Serializable
data class EmployeeCorporates(val corporates:List<EmployeeCorporateInfo>)

Encode into JSON:

val employeeCorporates = EmployeeCorporates(emptyList()) 
val rawCorporate:String = Json.encodeToString(employeeCorporates ))

Store rawCorporate into preference data store. After whenever you need that get from preference data store and decode that string into our class object.

val employeeCorporates = Json.decodeFromString<EmployeeCorporate(rawCorporate)
Beatup answered 18/5, 2023 at 10:21 Comment(1)
if you have big list consider use room library thereBeatup

© 2022 - 2025 — McMap. All rights reserved.