【发布时间】:2017-01-29 19:11:44
【问题描述】:
我没有太多编写 Android 应用程序的经验。为了好玩,我正在编写一个应用程序,它将我的通话记录上传到我的服务器。整个应用程序作为服务运行。服务(在手机启动时启动)是注册 ContentObserver 的服务,然后调用我的自定义 CallLog 类。我使用ContentObserver 来监听内容更改事件。不幸的是,ContentObserver 被多次调用,例如拨打号码。
因此,我有一个在成功上传(我使用 Retrofit)后调用的函数,称为 markAsUploaded()。这个函数创建了一个名为CallLogUploaded 的RealmObject(这与我的常规CallLog 模型不同)。这个CallLogUploaded 仅具有一个标识符,即调用的dateTime,它应该足够唯一。然后,当我遍历所有调用日志的列表时,我会对照 isDataUploaded() 函数检查每个调用日志,该函数执行 Realm 查询并检查是否已经存在存储在数据库(领域)。从理论上讲,它应该可以工作。
但是,我注意到它并不总是有效。似乎我的数据经常是陈旧的。当我执行realm.isAutoRefresh() 时,它返回 false(尽管我发誓它返回了一次 true)。在我的 isDataUploaded 函数中,即使我在 Realm 上执行 findAll(),我也看不到我的所有数据 - 但数据确实命中了 markDataAsUploaded 函数。
这是我的代码 - 它在 Kotlin 中,但应该很容易理解:
val callLogCall = service.sendCalLLogs(childId, dataToUpload)
callLogCall.enqueue(object : Callback<Void> {
override fun onResponse(call: Call<Void>, response: Response<Void>) {
if (response.isSuccessful) {
Log.i(AppConstants.LOG_TAG, "Call log data uploaded successfully!")
this@CallLogData.markDataAsUploaded(dataToUpload)
} else {
Log.w(AppConstants.LOG_TAG, "Call log data upload failed")
}
}
override fun onFailure(call: Call<Void>, t: Throwable) {
Log.w(AppConstants.LOG_TAG, "Call log data upload error (onFailure) called")
}
})
// This function simply stores a Realm model for all the data that has been uploaded to the server
private fun markDataAsUploaded(dataToUpload: List<CallLog>) {
realm = Realm.getDefaultInstance()
for (data in dataToUpload) {
realm.beginTransaction()
val callLogUploaded = realm.createObject(CallLogUploaded::class.java)
callLogUploaded.callDate = data.callDate
realm.commitTransaction()
}
}
// This function checks to see if the data is already uploaded.
private fun isDataUploaded(callLog: CallLog) : Boolean {
return realm
.where(CallLogUploaded::class.java)
.equalTo("callDate", callLog.callDate)
.count() > 0L
}
// Gets the call logs - not the entire function
for (call in callLogs) {
val callLog = CallLog()
callLog.id = call.id
callLog.callDate = Utilities.getTimestampAsSeconds(call.callDate)
if (this.isDataUploaded(callLog)) {
continue
}
callLog.name = call.name
callLog.number = call.number
}
我对 Realm 很陌生,对 Android 开发也很陌生,所以如果你能给我任何帮助,我将不胜感激。谢谢!
【问题讨论】:
标签: java android database realm kotlin