当前位置: 首页 > 知识库问答 >
问题:

在Android项目中升级领域

闻人宝
2023-03-14

我特别关心迁移,因为在我的代码之后,用于迁移的API似乎发生了一些变化,而且我不确定如果我只是更新我的版本,我的迁移是否会中断。不幸的是,他们的网页上没有关于升级Realm版本的文档。

有没有人有升级领域的经验,特别是一个版本比两个主要版本增加?

共有1个答案

弘阳德
2023-03-14

在他们的GitHub上的changelog.md中可以找到中断更改的列表。

然而,值得注意的是,在道路上有相当多的突破性变化,特别是注意到0.89.0。

0.82.05.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时,我点击了文件>项目结构>项目。在屏幕上