我特别关心迁移,因为在我的代码之后,用于迁移的API似乎发生了一些变化,而且我不确定如果我只是更新我的版本,我的迁移是否会中断。不幸的是,他们的网页上没有关于升级Realm版本的文档。
有没有人有升级领域的经验,特别是一个版本比两个主要版本增加?
在他们的GitHub上的changelog.md中可以找到中断更改的列表。
然而,值得注意的是,在道路上有相当多的突破性变化,特别是注意到0.89.0。
从0.82.0
到5.1.0
的版本如下(这是目前最稳定的版本):
@Override
public void migrate(final DynamicRealm realm, long oldVersion, long newVersion) {
RealmSchema schema = realm.getSchema();
// version check and stuff
RealmObjectSchema personSchema = schema.get("Person");
personSchema.addIndex("fieldName");
中断更改:数据库文件格式更新。以前版本的Realm不能使用此版本创建的Realm文件。
中断更改:从Realm类中删除不推荐使用的方法和构造函数。
BREAKING Change:引入了Boolean、Byte、Short、Integer、Long、Float和Double等装箱类型。添加了null支持。引入注释@Required以指示字段不可为空。默认情况下,String、Date和byte[]可为空,这意味着如果打开领域文件的先前版本,将抛出RealMigrationNeedException。
已添加异步查询。在模式方面没有新的内容。
0.85.0:
中断更改:已删除RealmEncryptionNotSupportedException,因为Realm的底层存储引擎中的加密实现发生了更改。现在所有设备都支持加密。
突破性的变化:迁移API已被一个新的API替换。
重大更改:realmresults.sort_order_ascending和realmresults.sort_order_descending常量已被sort.ascending和sort.descending枚举替换。
重大更改:realmquery.case_sensitive和realmquery.case_insensitive常量已被case.sensitive和case.insensitive枚举替换。
中断更改:Realm.AddChangeListener、RealMobject.AddChangeListener和RealmResults.AddChangeListener持有对侦听器的强引用,您应该注销侦听器以避免内存泄漏。
中断更改:删除了不推荐使用的方法RealmQuery.Minimum{Int,Float,Double}、RealmQuery.Maximum{Int,Float,Double}、RealmQuery.Sum{Int,Float,Double}和RealmQuery.Average{Int,Float,Double}。改用realmquery.min()、realmquery.max()、realmquery.sum()和realmquery.average()。
中断更改:错误地删除了公有的RealmConfiguration.getSchemaEditator()。并添加RealmConfiguration.getRealMobjectClasss()作为替代,以获得模型类集合(#1797)。
添加了使用DynamicRealm和DynamicRealMobject的新动态API。
添加了realm.getSchema()和dynamicrealm.getSchema()。
新的迁移API,使用dynamicrealm
而不是realm.gettable()
。
有些东西被重命名了,如果结果集仍然有效,您应该取消注册您的更改侦听器。但是值得注意的是,您仍然应该为realmresults
保留一个字段变量,因为领域的context
对它只有一个弱引用。
0.87.0:
RX支持。没什么重要的。
Realm现在需要作为Gradle插件安装。
DynamicRealm.ExecuteTransaction()现在直接抛出任何RuntimeException,而不是将其包装在RealmException(#1682)中。
DynamicRealm.ExecuteTransAction()现在抛出IllegalArgumentException,而不是静默接受空事务对象。
已从0.86.0中不推荐使用的公共API中删除RealmConfiguration.GetSchemaEditator()。请使用RealmConfiguration.getRealMobjectClasses()获取模型类集(#1797)。
如果领域文件不存在,则Realm.migrateRealm()抛出一个FileNotFoundException。
现在需要从所有领域RxJava可观察到的内容中退订,以便完全关闭领域(#2357)。
这是非常必要的,所以我不想被困在0.87.5。
0.89.0:
断裂性变化
从公共API中删除了不推荐使用的方法realm.gettable()。
Looper上的realm.refresh()和dynamicrealm.refresh()不再有任何作用。RealmObject和RealmResults总是在下一个事件循环中更新。
好吧,这一个是最乱的一个。
RealmObject和RealmResults总是在下一个事件循环中更新。(注意:自领域3.1+以来,这不再是真的,因为在领域3.1+中,更改侦听器将在commitTransaction()
上再次调用)
这实际上意味着realmresults
仅在事件循环发生时更新,而在调用realm.commitTransaction()
时不会立即更新。这也意味着,在后台线程上,当committransaction()
时,RealmResults没有更新,您必须对它们进行查询。
只有在调用附加的RealMChangeListener
之后,RealMResults
才会更新。在1.1.1中,当调用RealMChangeListener
时,所有结果都已更新。
RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll();
while(!stuffs.isEmpty()) {
stuffs.get(0).setSomething(true);
}
// you end up here because stuffs will be empty
// because of live auto-updates in transactions
RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll();
for(int i = 0; i < stuffs.size(); i++) {
stuffs.get(i--).setSomething(true);
}
// I end up here because of live auto-updates
这是一个问题,因为stuffs
将不再更改。我必须在代码中搜索--
并像这样修复所有迭代。
官方的变通办法过去是这样的:
RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll();
for(int i = stuffs.size()-1; i >= 0; i--) {
stuffs.get(i).setSomething(true);
}
// I end up here because of normal iteration
这在0.89.0中仍然可以正常工作。
RealmResults<Stuff> stuffs = realm.where(Stuff.class).equalTo("something", false).findAll();
for(Stuff stuff : stuffs) {
stuff.setSomething(true);
}
将RealmObject上的所有方法和所有公共类标记为final(#1594)。
已从公共API中删除BaseRealm。
已从公共API中删除HandlerController。
已从公共API中删除RealmAsyncTask的构造函数(#1594)。
RealmBaseAdapter已经移动到它自己的GitHub存储库:https://GitHub.com/realm/realm-android-adapters
域文件的文件格式已更改。文件将自动升级,但无法使用旧版本的Realm打开Realm文件。
因此realmbaseadapter
现在在realm-android-adapters
中,对于Realm的1.1.1
使用1.3.0
。还添加RealmRecycerViewAdapter
。对于3.5.0
,请使用2.0.0
或更新版本。
RealmChangeListeners获得了element
参数。耶。
此外,日期现在具有毫秒
精度。
删除了所有@deprecated方法。
从非looper线程调用realm.setautorefresh()或dynamicrealm.setautorefresh()会引发IllegalStateException,即使autoRefresh为false(#2820)。
不推荐使用0.90.0中的许多方法,因此
Realm.AllobjectsSorted(field,sort,field,sort,field,sort)。改用RealmQuery.FindAllSorted(field[],sort[])`。
RealmQuery.FindAllSorted(field,sort,field,sort,field,sort)。改用RealmQuery.FindAllSorted(field[],sort[])`。
RealmQuery.FindAllSortedAsync(field,sort,field,sort,field,sort)。改用RealmQuery.FindAllSortedAsync(field[],sort[])`。
在那之后,1.0.0出现了,所以它几乎就是这样。
顺便说一下,在1.1.0中,添加了insertorupdate()
,它比copytoRealmorupdate()
快,并且不返回代理。
2.0.2:
在3.0.0之前没有突破性的改变,但有大量的bug修复。
3.0.0:
distinct()返回一个新的RealmResults对象,而不是对原始对象进行筛选(#2947)。
OrderedRealmCollection<Thing> snapshot = results.createSnapshot();
for(int i = 0; i < snapshot.size(); i++) { ...
3.1.0:
领域文件的更新文件格式。现有的Realm文件在打开时将自动迁移到新格式,但旧版本的Realm无法打开这些文件。
这里没什么可做的,但值得一提。
3.5.0:
断裂性变化
如果给定的RealmModule不包括所有必需的模型类(#3398),将抛出IllegalStateException。
[ObjectServer]删除了不推荐使用的API SyncUser.RetrieveUser()和SyncUser.RetrieveUserAsync()。改用SyncUser.RetrieveInfoForUser()和retrieveInfoForUserAsync()。
[ObjectServer]SyncUser.Callback现在接受一个泛型参数,该参数指示调用onSuccess时返回的对象类型。
[ObjectServer]将SyncUser.GetAccessToken重命名为SyncUser.GetRefreshToken。
RealmList、RealmQuery、RealmResults、RealmCollection、OrderedRealmCollection和OrderedRealmCollectionSnapshot的类型参数的放宽上限。
Realm已将其RxJava1支持升级到RxJava2(#3497)Realm.asObservable()已重命名为Realm.asFlowable()。Realmlist.asObservable()已重命名为Realmlist.asFlowable()。RealmResults.asObservable()已重命名为RealmResults.asFlowable()。RealMobject.AsObservable()已重命名为RealMobject.AsFlowable()。RxObservableFactory现在返回RxJava2类型而不是RxJava1类型。
删除了不推荐使用的API realmSchema.close()和realmobjectSchema.close()。那些不用再叫了。
删除了不推荐使用的API RealmResults.Distinct()/RealmResults.Distinct Async()。改用realmquery.distinct()/realmquery.distinctAsync()。
RealmQuery.CreateQuery(领域,类)、RealmQuery.CreateDynamicQuery(DynamicRealm,String)、RealmQuery.CreateQueryFromResult(RealmResults)和RealmQuery.CreateQueryFromList(RealmList)已删除。改用Realm.Where(Class)、DynamicRealm.Where(String)、RealmResults.Where()和Realmlist.Where()。
因此Rx1支持被替换为Rx2支持,RemoveChangelisteners()
被重命名为RemoveAllChangelisteners()
。
4.3.1:
已弃用
realmQuery.findAllSorted()和realmQuery.findAllSortedAsync()变量支持谓词realmQuery.sort().findAll()。
realm.where(Blah.class)
.distinctValues("something") // subject to change to `distinct()`
.sort("something") // hopefully will change to `sorted()`? // nope, it's `sort`
.findAll();
还有OrderedRealmCollectionChangeListener
用于将Null
作为初始更改集发送,现在情况不再是这样了,==Null
应该替换为.getState()==OrderedCollectionChangeSet.State.initial
。这也意味着您需要在Realm5.0+中使用realm-android-adapters3.0.0
或更新版本。
此外,如果您依赖__realmproxy
类的名称:它们由其完全限定的名称命名,包括包,如my_package_someobjectrealmproxy
。
PROGUARD规则
#realm older than 0.84.1
-keepnames public class * extends io.realm.RealmObject
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.** { *; }
-dontwarn javax.**
-dontwarn io.realm.**
#realm 0.84.1+ and older than 1.0.0
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class *
-dontwarn javax.**
-dontwarn io.realm.**
#realm 0.89.0+ and older than 1.0.0
-keep class io.realm.RealmCollection
-keep class io.realm.OrderedRealmCollection
#realm 3.2.0 and 3.2.1
-keepnames public class * extends io.realm.RealmObject
我正在尝试从
我有一个maven java项目。SDK是Java8,现在我想升级到Java11。我还想将所有依赖项升级到最新的依赖项。这是一个spring项目(不是spring boot!!) 我可以解决所有不同的升级问题,但是在实体管理器工厂中设置持久性提供程序类时出错。 实现了 然而,方法需要一个 我有过 还有一件事对我来说很奇怪。在IntelliJ中,当我打开的类时,它说字节码版本是java 8,但是ja
本文介绍了如何修改 Android 项目来从 旧版的 Cordova 升级。大部分指令适用于与旧的 cordova CLI 工具创建的项目。有关 CLI 内容,可以参阅命令行界面(CLI) 升级至 4.0.0 升级至 4.0.0 有些特殊的步骤,首先, 对于非 CLI 项目,运行: bin/update path/to/project 对于 CLI 项目: 升级 cordova CLI
我一直在使用Android Studio(Beta)0.8.6来完成我当前的项目。最近,我下载了Android Studio(RC4)的最新版本。安装RC4版本后,我从“现有的Android Studio项目”加载了我的项目。在打开基于0.8.6的项目时,我得到的错误是“该项目正在使用不受支持的Android Gradle插件(0.12.2)版本。推荐的版本是1.0.0-RC4。”然后我点击“修复
我在安装一个Android Studio项目时遇到问题,我在Mountain Lion(10.8),现在正尝试在Mavericks(10.9)中运行,但当我打开一个项目时,Gradle失败,出现以下错误: 我已经检查了那里列出的路径,所有的东西都像它应该的那样存在--但是也许特定的证书从“cacerts”文件夹中丢失了?我环顾四周,似乎找不到一个解决方案,或者其他人遇到了这个问题,所以我不确定从这
我使用的是Mac OS X版本10.11.5(15F34)。我使用的是Android Studio 2.1.2(构建于2016年5月26日)。我下载了grade-2.13-all.zip并将其解压缩到/usr/local/grade-2.13并设置在一个环境变量中。当我从终端的任何位置运行'gradle-v'时,它就会工作 使用Android Studio时,我点击了文件>项目结构>项目。在屏幕上