我遇到了一个问题,即每次执行相同的查询时,Realm有时会返回不同的数据。目前我正在使用SyncAdapter上传。这个想法是我们正在尝试实现离线模式。
因此,当用户创建一个项目时,它的GET被添加到Realm DB中。我正在通过获取maxId并向其添加1000手动生成该项目的ID。之后,我将itemID发送到UploadSyncAdapter,在那里我获得itemById并将其发送到后端,后端返回带有真实ID的项。因此,在此之后,我删除旧项,并将新项插入到Realm中。
@Override
public void onNext(TaskResponse taskResponse) {
tasksDatabaseManager.deleteTaskById(taskId);
List<Task> tasks = taskResponse.getTaskDataList();
tasksDatabaseManager.insertTasks(tasks);
}
public void deleteTaskById(int taskId){
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
RealmResults<Task> rows = realm.where(Task.class).equalTo(ID, taskId).findAll();
rows.deleteAllFromRealm();
realm.commitTransaction();
realm.close();
}
private void copyOrUpdateTasks(List<Task> tasksList){
Realm realm = Realm.getDefaultInstance();
ArrayList<Task> updatedTaskList;
//first initialize task permissions
updatedTaskList = filterTasksByPermission(tasksList);
//initialize custom task data
for (Task task : updatedTaskList) {
initializeTaskCustomFields(task);
}
//save new data
Log.d(TAG, "tasks number before update: " + getTasks().size());
realm.beginTransaction();
realm.copyToRealmOrUpdate(updatedTaskList);
realm.commitTransaction();
realm.close();
Log.d(TAG, "tasks number after update: " + getTasks().size());
}
在filterTasksByPermission中,我只是计算任务的一些权限,但任务将在列表中返回。在initializeTaskCustomFields中,在保存到Realm之前,我只计算了对象的2个字段(以便将这些值也保存到Realm中)
经过一番研究,我发现了问题所在。但是如果我错了请纠正我。在我的Rx调用中,我用subscribers.newthread()替换了subscribers.io(),现在它工作得很好。所以我的理论是:
在调用我的UploadAdapter上传更改的数据之前,我使用subscribers.io()的Rx调用在数据库中插入我的项。IO()使用线程池重用线程,或者创建新的线程。假设它产生了一个叫做“a”的线程。线程获取是一个领域实例(假设该领域快照是“1”),并将创建的项插入其中。在此之后,调用SyncAdapter get,它也得到了一个具有相同领域快照“1”的新领域实例。在SyncAdapter完成向服务器上传数据之后,它会删除旧项,并插入从服务器获得的新项。因此,在这个领域数据发生变化后,最新的领域快照现在是“2”。SyncAdapter向活动发送一个广播,说明上传已经完成,它应该从领域数据库中获得新的数据。
为了从Realm读取数据,我还将Rx与subscribers.io()一起使用。因此,当从Realm请求新数据时,Subscribers.io()的池中已经有一个等待重用的线程,这就是线程“a”。由于这个线程是一个非活套线程,它不知道域数据发生了变化,它仍然使用域快照“1”,所以这就是我从域获取旧数据的原因。刷新几次后,Subscribers.io()可能会创建一个新线程,假设线程“B”。
希望这能帮助到别人!
在KeyCloak中可以让一个领域的用户管理另一个领域吗?我的目标是拥有两个领域--adminRealm和UserRalm。在adminRealm中应该是用户,他们将能够登录到我们的管理应用程序,他们可以通过Keycloak rest api创建“普通用户”,这将被放置到UserRealm中。 目前我的解决方案工作在一个领域,在那里我有管理用户,可以登录到我的管理应用程序,在那里他可以在相同的领域
3.7 ABP领域层 - 数据过滤器 3.7.1 简介 在数据库开发中,我们一般会运用逻辑删除模式,即不直接从数据库删除数据,而是标记这笔数据为已删除。因此,如果实体被逻辑删除了,那么它就应该不会在应用程序中被检索到。要达到这种效果,我们需要在每次检索实体的查询语句上添加SQL的Where条件IsDeleted = false。这是个乏味的工作,但它是个容易被忘掉的事情。因此,我们应该要有个自动的
我有一个领域对象服务器,并试图与Android设备同步数据,如: 它与工作正常,但在低互联网连接的情况下(例如,为模拟器设置网络类型),我得到了一个错误(调用): 是否可以通过低Internet连接同步数据?
3.6 ABP领域层 - 领域事件 在C#中,一个类可以定义其专属的事件并且其它类可以注册该事件并监听,当事件被触发时可以获得事件通知。这对于对于桌面应用程序或独立的Windows Service来说非常有用。但是, 对于Web应用程序来说会有点问题,因为对象是根据请求(request)被创建并且它们的生命周期都很短暂。我们很难注册其它类别的事件。同样地,直接注册其它类别的事件也造成了类之间的耦合
3.4 ABP领域层 - 领域服务 3.4.1 简介 领域服务(或者服务,在DDD模式中)是被用来执行领域操作或者业务规则的。Eric Evans 在他的DDD书中这样说过:一个好的Service应该有以下三个特征: 与领域概念相关的操作不是Entity或Value Object 的一个自然部分; 接口是根据领域模型的其它元素定义的; 操作是无状态的。 领域服务和Application Servi
DDD DSL DSL(domain-specific languages)即领域特定语言,唯一能够确定DSL边界的方法是考虑“一门语言的一种特定用法”和“该语言的设计者或使用者的意图。在试图设计一个DSL的时候,发现了一些有意思的简单的示例。 DSL示例 jQuery 最流行的DSL jQuery是一个Internal DSL的典型的例子。它是在一门现成语言内实现针对领域问题的描述。 $('.m
问题内容: 因此,我有一个包含3个APK /应用程序的应用程序。如何在应用之间共享数据库?我假设当前在应用程序之间不可见的原因是因为它们在不同的上下文中传递。 谢谢 问题答案: 来自Realm的基督徒。目前,您要问的内容确实不可行。正如其他人指出的那样,实际上只有两种方法。 1)公开一个ContentProvider。但是,这需要您将RealmResults映射到Cursor,这并非易事。我们正计
我需要在Raspberry PI4上创建一个本地Web服务器的系统,运行用于API调用、websockets等的laravel。每个RPI将安装在多个客户的地方。 对于这个项目,我希望有能力将数据库保存/同步到远程服务器(当本地系统连接到internet时)。 多个区域设置数据库=>一个基于cutomers的远程数据库 问题是,如何同步数据库,正确地识别每个客户的数据,并将它们呈现在一个相互关联的