使用Room将数据保存到本地存储



如果这个问题看起来难以理解,我提前道歉,因为android开发和kotlin不是我的主要堆栈。我将尽量用清楚的语言来解释。

我有一个类,负责从http请求拦截数据。这个实现反映了以下代码

class PocketScoutInterceptor() : Interceptor {

fun buildPacket(timestamp: Long, duration: Double, request: Request, response: Response) {
val reqBody = request.body
val respBody = response.body?.string()
val packet = Packet(
id = 0,
userId = PocketScoutConfig.userId,
deviceId = PocketScoutConfig.deviceId,
sessionId = PocketScoutConfig.sessionId,
timestamp = timestamp,
duration = duration.roundToInt(),
protocol = "http",
request = room.entities.Request(
request_method = request.method,
request_url = request.url.toUrl().toString(),
request_headers = request.headers.toMultimap() as Mapping,
request_body = (reqBody?.toString() ?: ""),
request_size = (reqBody?.toString()?.length ?: 0),
),
room.entities.Response(
response_code = response.code,
response_headers = response.headers.toMultimap() as Mapping,
response_body = (respBody ?: ""),
response_size = (respBody?.length ?: 0),
)
)
}
}

此外,我需要将这些数据保存在本地数据库中,我选择了room.

接下来创建一个数据库类

@TypeConverters(value = [RoomTypeConverters::class])
@Database(
version = 1,
entities = [Packet::class],
exportSchema = false
)
abstract class NetworkDatabase : RoomDatabase() {
abstract fun packetDao(): PacketDao
}

我只需要学习如何在本地存储中保存数据。我看了几个关于这个主题的视频,也读了几次文档,但就我的例子而言,我找不到答案。也许你可以帮助我

1).您需要通过RoomdatabaseBuilder函数/方法构建数据库。对@Database注释类的以下更改将执行此操作,并返回一个单例:-

@TypeConverters(value = [RoomTypeConverters::class])
@Database(entities = [Packet::class], version = 1, exportSchema = false)
abstract class NetworkDatabase: RoomDatabase() {
abstract fun packetDao(): PacketDao
companion object {
@Volatile
private var instance: NetworkDatabase? = null;
fun getInstance(context: Context): NetworkDatabase {
if (instance == null) {
instance = Room.databaseBuilder(context,NetworkDatabase::class.java,"the_database.db")
.allowMainThreadQueries() /* for brevity/convenience but shouldn't really run stuff on the main thread */
.build()
}
return instance as NetworkDatabase
}
}
}
  • 注意,理想情况下,您将在主线程之外访问数据库。然而,以上允许通过主线程访问数据库,因此更容易演示。

2)。下一阶段是实际使用上面的,作为一个例子考虑以下活动代码(工作示例):-

class MainActivity : AppCompatActivity() {
lateinit var db: NetworkDatabase
lateinit var dao: PacketDao
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
/* Get an instance of NetworkDatabase  and the packetDao */
db = NetworkDatabase.getInstance(this)
dao = db.packetDao()
/* add some data (1 row)*/
val m1 = Mapping(header = mapOf())
dao.add(
Packet(
id = 10,
deviceId =
"device10",
sessionId = "session100",
timestamp = System.currentTimeMillis(),
protocol = "HTML",
request = Request(requestMethod = "the method", requestUrl = "blah", requestHeaders = m1,
requestBody = "ReqBody", requestSize = 10),
userId = "userxxx",
duration = 200,
response = Response(100,m1,"RspBody",210)
)
)
/* Extract all rows and write to the log */
for(p in dao.getAll()) {
Log.d("DBINFO","Packet ID is ${p.id} DeviceId is ${p.deviceId} Duration is ${p.duration} ....")
}
}
}

以上,当(第一次)运行时,会产生包含以下内容的日志:-

D/DBINFO: Packet ID is 10 DeviceId is device10 Duration is 200 ....

显然你会通过拦截器构建数据包

最新更新