我没有很多编写Android应用程序的经验。为了好玩,我正在编写一个应用程序,将我的通话记录上传到我的服务器。这整个应用程序作为服务运行。服务(在电话启动时启动)是注册ContentObserver的服务,然后调用我的自定义类CallLog
。我使用ContentObserver
来收听内容更改事件。不幸的是,当我例如将ContentObserver多次调用时。拨打一个号码。返回陈旧数据的领域
由于这个原因,我有一个功能,我称为markAsUploaded()
成功上传(我使用Retrofit)后调用。此功能创建一个名为CallLogUploaded
的RealmObject
(与我的常规CallLog
型号不同)。这个CallLogUploaded
只有一个标识符,该标识符是呼叫的dateTime
,它应该足够独特。然后,当我遍历所有通话记录的列表时,我检查每个呼叫日志对照isDataUploaded()
函数,该函数执行Realm查询并检查是否已经存在具有存储在数据库中的dateTime的通话记录(领域)。理论上,它应该工作。
但是,我注意到它并不总是有效。我的数据看起来经常是陈旧的。当我做realm.isAutoRefresh()
时,它返回false(尽管我发誓它只返回一次)。在我的isDataUploaded
函数中,即使我在Realm上执行findAll()
,我也没有看到我的所有数据 - 但数据确实确实击中了markDataAsUploaded
函数。
这里是我的代码 - 它在科特林但应该是很容易理解:
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!")
[email protected](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
}
我很新的领域和相当新的Android开发,所以我希望得到任何帮助,你可以给我。谢谢!