适用于大多数全新安装,但在最新的应用更新后,很多报告都会出现此问题.在更新之间已经有一段时间了,所以我认为这可能是由于用户在添加模式之前从一个非常旧的版本更新...但其他人说他们已经从全新安装中看到了这一点.Realm Java是realm-gradle-plugin:5.1.1
我感谢任何帮助,谢谢!
错误:
Caused by io.realm.exceptions.RealmMigrationNeededException
Migration is required due to the following errors: - Property 'Loan.loanRatePct' has been made required.
...
...onCreate (Activity.java:168)
Run Code Online (Sandbox Code Playgroud)
MyMigration.java
if (oldVersion == 0) {
schema.get("Storage")
.addField("heat", String.class);
oldVersion++;
}
if (oldVersion == 1) {
schema.get("Env")
.addField("gameType", String.class);
oldVersion++;
}
if (oldVersion == 2) {
schema.get("Loan")
.addField("loanRatePct", Double.class);
schema.create("GameMode")
.addField("md", String.class)
.addField("name", String.class)
.addField("days", int.class)
.addField("term", int.class)
.addField("rate", String.class)
.addField("amount", int.class)
.addField("icon", int.class);
schema.create("Leaderboard")
.addField("score", String.class);
oldVersion++;
}
if (oldVersion == 3) { …
Run Code Online (Sandbox Code Playgroud) 我使用Realm 3.0.0作为我的Android应用程序的数据库.这就像一个问卷调查应用程序,用户在应用程序中导航很多.当我连续使用应用程序(来回)时,我收到以下错误:
Fatal Exception: io.realm.exceptions.RealmError: Unrecoverable error. mmap() failed: Out of memory size: 1073741824 offset: 0 in /Users/cm/Realm/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_SharedRealm.cpp line 109
at io.realm.internal.SharedRealm.nativeGetSharedRealm(SharedRealm.java)
at io.realm.internal.SharedRealm.(SharedRealm.java:187)
at io.realm.internal.SharedRealm.getInstance(SharedRealm.java:229)
at io.realm.internal.SharedRealm.getInstance(SharedRealm.java:204)
at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:124)
at io.realm.Realm.getDefaultInstance(Realm.java:210)
Run Code Online (Sandbox Code Playgroud)
现在我知道这主要原因不是关闭Realm实例.但我已经多次检查过了.而且我很肯定我关闭了每一个打开的实例.
该应用程序有许多活动和片段,所有活动和片段都在他们身上获得Realm实例并将其onCreate
关闭onDestroy
.还有其他后台网络作业用于上载获取Realm实例的数据.这些作业在完成运行或取消时关闭其Realm实例.
以上所有通过Dagger 2通过注入得到它们的Realm实例:
@Provides
@Nullable
static Realm realm(@Nullable RealmConfiguration configuration) {
if (configuration != null) {
Realm.setDefaultConfiguration(configuration);
return Realm.getDefaultInstance();
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
配置也在同一个Dagger模块中提供.
更具体地说,问卷由ViewPager中显示的许多问题片段组成.每个片段都注入了一个领域.给定问题片段中的许多交互将数据写入数据库(一些异步,一些阻塞).这些片段还查询数据库onResume
以获取其更新的数据.其中一些数据也是从Realm中复制出来的realm.copyFromRealm()
.现在,在发生这些情况的任何给定时间,上传作业很可能正在运行并从数据库读取数据并将其上载到服务器.上传作业完成后,它会写入数据库.
我想我可以在给定时刻在UI线程上拥有最多7-12个片段/活动.0-3其他线程上的0-6个其他引用(后台作业).
此外,我通过Realm.compactRealm(realmConfiguration)
每次应用程序启动来压缩我的领域数据库(可能作为一个单独的问题,这似乎并不是一贯的工作).
上面我试图描述性地描述我的Realm用法,而不是详细介绍.现在我的问题是,当用户过度使用应用程序(在活动/片段之间往返(领域注入+数据库读取查询),上传数据(领域注入+数据库读写查询))时,我得到上面发布的内存不足错误.
我也在使用泄漏金丝雀,它没有检测到任何泄漏.(不确定它是否可以)
我是否以不应该使用的方式使用Realm?我应该关闭Realm实例onPause
而不是onDestroy
吗?我是否应该在一个活动中只有一个领域实例并拥有它的所有碎片(在我的情况下最多为5个)使用此实例?我可以在我的应用程序中进行哪些更改,也许我的应用程序架构可以解决此问题?
我感谢任何帮助,试图解决这个问题.
编辑:我在我的后台线程中分享领域开放逻辑.
我的所有作业共享相同的领域用法,如下所示:Realm通过以下方式延迟注入: …
我正在尝试同时查询包含 Realm 中字符串值列表的多个字段。假设我有以下对象:
public class Article extends RealmObject implements Serializable{
@PrimaryKey
@Required
private String aID = UUID.randomUUID().toString();
private String title;
private String description;
private String authors;
private RealmList<Tag> tags;
}
Run Code Online (Sandbox Code Playgroud)
我想查询所有文章的标题、描述或标签包含字符串列表。
我知道谓词“ in ”可用于将值列表与字段匹配,如下所示:
realm.where(Article.class)
.in("title", listOfValues,Case.INSENSITIVE)
.or()
.in("description", listOfValues, Case.INSENSITIVE)
.or()
.in("tags.tag",listOfValues, Case.INSENSITIVE)
.findAll();
Run Code Online (Sandbox Code Playgroud)
这只会返回“匹配”值,但我正在寻找“包含”值。还有“包含”谓词,但我认为它只能与一个值进行比较。
有没有办法做到这一点?
我是Android开发的新手,并获得了一个遗留项目.所以我安装了最新版本的Android Studio并打开它.
当我尝试构建它时,我收到此错误:
Error:android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor' configuration instead.
Run Code Online (Sandbox Code Playgroud)
我正在尝试这些线程中显示的解决方案,但它没有用.
我的grandle构建脚本上没有任何android-apt参考.
许多编译包显示为过时.但是,当我按照Android的工作室建议更新参考时,我得到错误,说找不到包.
正如我所说的,我是Android Studio World的新手,所以我对这些东西都有些失落.
这是我的build.gradle(模块:app):
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
apply plugin: 'realm-android'
android {
compileSdkVersion 24
buildToolsVersion "24.0.2"
defaultConfig {
applicationId "xxxxxxxxxxxx"
minSdkVersion 19
targetSdkVersion 24
versionCode 123
versionName "1.2.3"
manifestPlaceholders = [HOCKEYAPP_APP_ID: "xxxxxxxxxxxxxxxxxxxxx"]
//For Test
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
packagingOptions {
exclude 'META-INF/services/javax.annotation.processing.Processor'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions { …
Run Code Online (Sandbox Code Playgroud) 在Realm Javascript中,可以通过主键创建对象,如果已存在,则更新现有对象:https://realm.io/docs/javascript/latest/#creating-and-updating-objects-with-主密钥
如何在Realm Java中实现相同的功能?没有在文档中找到此功能.
这是Realm Java所以我正在做
realm.beginTransaction();
realm.deleteAll();
realm.commitTransaction();
Run Code Online (Sandbox Code Playgroud)
我有20个左右的Realm
课。我只想保留一个。
而不是做
realm.beginTransaction();
realm.delete(Table1.class);
realm.delete(Table2.class);
realm.delete(Table3.class);
...
realm.commitTransaction();
Run Code Online (Sandbox Code Playgroud)
有没有办法删除除一个表之外的所有表?
“deleteAll. except(Table12.class)”等?
谢谢!