Java 返回过时数据的领域

Java 返回过时数据的领域,java,android,database,realm,kotlin,Java,Android,Database,Realm,Kotlin,我没有很多编写Android应用程序的经验。为了好玩,我正在编写一个应用程序,将我的通话记录上传到我的服务器上。整个应用程序正在作为服务运行。该服务(在手机启动时启动)注册ContentObserver,然后调用我的自定义CallLog类。我使用ContentObserver监听内容更改事件。不幸的是,当例如拨一个号码时,ContentObserver会被调用多次 出于这个原因,我有一个函数,在成功上传(我使用改型)后调用它,名为markAsUploaded()。此函数创建一个名为calllog

我没有很多编写Android应用程序的经验。为了好玩,我正在编写一个应用程序,将我的通话记录上传到我的服务器上。整个应用程序正在作为服务运行。该服务(在手机启动时启动)注册ContentObserver,然后调用我的自定义
CallLog
类。我使用
ContentObserver
监听内容更改事件。不幸的是,当例如拨一个号码时,ContentObserver会被调用多次

出于这个原因,我有一个函数,在成功上传(我使用改型)后调用它,名为
markAsUploaded()
。此函数创建一个名为
calllogupload
RealmObject
(与我的常规
CallLog
模型不同)。此
calllogupload
仅具有一个标识符,即调用的
dateTime
,该标识符应足够唯一。然后,当我遍历所有调用日志的列表时,我会根据
isdataupload()
函数检查每个调用日志,该函数执行领域查询,并检查数据库(领域)中是否已经存在具有该日期时间的调用日志。从理论上讲,这应该是可行的

然而,我注意到它并不总是有效的。似乎我的数据经常是过时的。当我执行
realm.isAutoRefresh()
时,它返回false(尽管我发誓它曾经返回true)。在我的
isDataUploaded
函数中,即使我在域上执行
findAll()
操作,我也看不到我的所有数据-但数据确实命中了
markdataaploaded
函数

这是我的代码-它在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
 }
val callLogCall=service.sendCalLLogs(childId,dataToUpload)
排队(对象:Callback{
覆盖fun onResponse(调用:调用,响应:响应){
if(response.issucessful){
Log.i(AppConstants.Log_标记,“呼叫日志数据上传成功!”)
this@CallLogData.markDataAsUploaded(数据上传)
}否则{
Log.w(AppConstants.Log_标记,“调用日志数据上传失败”)
}
}
覆盖失效时的乐趣(调用:调用,t:可丢弃){
Log.w(AppConstants.Log_标记,“调用日志数据上载错误(onFailure)”调用)
}
})
//此函数只存储已上载到服务器的所有数据的领域模型
私人娱乐MarkDatasUploaded(dataToUpload:List){
realm=realm.getDefaultInstance()
for(dataToUpload中的数据){
realm.beginTransaction()
val calllogupload=realm.createObject(calllogupload::class.java)
CallLogUpload.callDate=data.callDate
realm.commitTransaction()
}
}
//此函数检查数据是否已上载。
private-fun-isdataupload(callLog:callLog):布尔值{
返回域
.where(calllogupload::class.java)
.equalTo(“callDate”,callLog.callDate)
.count()>0升
}
//获取调用日志,而不是整个函数
for(调用调用日志){
val callLog=callLog()
callLog.id=call.id
callLog.callDate=Utilities.getTimestampAsSeconds(call.callDate)
if(this.isDataUploaded(callLog)){
持续
}
callLog.name=call.name
callLog.number=call.number
}
我对Realm非常陌生,对Android开发也相当陌生,所以我非常感谢您能给我的任何帮助。谢谢

那是因为

// 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()
    }
}


为了了解版本保留,您可以阅读

for (data in dataToUpload) {
    realm.beginTransaction()
    val callLogUploaded = realm.createObject(CallLogUploaded::class.java)
    callLogUploaded.callDate = data.callDate

    realm.commitTransaction()
}
realm.beginTransaction()
for (data in dataToUpload) {
    val callLogUploaded = realm.createObject(CallLogUploaded::class.java)
    callLogUploaded.callDate = data.callDate
}
realm.commitTransaction()