2017-09-17 131 views
0

我想了解如何在我正在制作的图书馆中使用Realm,经过几天的研究后,我现在了解了RealmModules(如果有人来自Realm读取此内容,则应该真正改进关于在图书馆中使用的文档)。我做了一个简单的类,它给了我与库配置的领域:如何在图书馆中使用Realm

object ChatRealm { 
    fun getChatRealm(): Realm{ 
     val config = RealmConfiguration.Builder() 
       .name("mtchat_realmDB") 
       .schemaVersion(2) 
       .deleteRealmIfMigrationNeeded() 
       .modules(ChatModule()) 
       .build() 
     return Realm.getInstance(config) 
    } 
} 

模块是本

@RealmModule(library = true, allClasses = true) 
class ChatModule {} 

,并在工程中的应用I类设置的境界这样

class App: Application() { 
    override fun onCreate() { 
     super.onCreate() 

     initRealm() 
     setupRealm() 
    } 

    private fun initRealm() { 
     Realm.init(this) 
    } 

    private fun setupRealm(){ 
     Realm.setDefaultConfiguration(
       RealmConfiguration.Builder() 
         .deleteRealmIfMigrationNeeded() 
         .modules(Realm.getDefaultModule(), ChatModule()) 
         .build() 
     ) 
    } 
} 

现在我遇到的麻烦是构建失败或应用程序基于各种原因崩溃基于我如何配置gradle文件。

我:应用gradle这个是这个

apply plugin: 'com.android.application' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-android-extensions' 
apply plugin: 'realm-android' 

repositories { 
    maven { url "https://jitpack.io" } 
    maven { url 'https://maven.google.com' } 
    mavenCentral() 
} 

buildscript { 
    repositories { 
     jcenter() 
    } 
} 

android { 
    compileSdkVersion 26 
    buildToolsVersion "26.0.0" 
    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
     vectorDrawables.useSupportLibrary= true 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:26.0.2' 
    compile 'com.android.support:design:26.0.2' 
    compile 'com.android.support.constraint:constraint-layout:1.0.2' 
    compile 'com.android.support:support-vector-drawable:26.0.2' 
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
    compile project(':mtchat') 
} 

和我的图书馆gradle这个是这个

apply plugin: 'com.android.library' 
apply plugin: 'kotlin-android' 
apply plugin: 'kotlin-android-extensions' 
apply plugin: 'kotlin-kapt' 
apply plugin: 'realm-android' 

repositories { 
    maven { url "https://jitpack.io" } 
    maven { url 'https://maven.google.com' } 
    mavenCentral() 
} 

buildscript { 
    repositories { 
     jcenter() 
    } 
} 

android { 
    compileSdkVersion 26 
    buildToolsVersion "26.0.0" 

    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 26 
     versionCode 1 
     versionName "1.0" 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 

} 

dependencies { 
    compile "com.android.support:appcompat-v7:$compat_version" 
    compile "com.android.support:support-v4:$compat_version" 
    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" 
    compile "com.android.support:cardview-v7:$compat_version" 
    compile "com.android.support:recyclerview-v7:$compat_version" 
    compile "com.android.support:design:$compat_version" 
    compile "de.hdodenhof:circleimageview:2.1.0" 
    compile 'com.github.bumptech.glide:glide:4.1.1' 
    compile 'com.android.volley:volley:1.0.0' 
} 

,这是我的项目gradle这个

buildscript { 
    ext.kotlin_version = '1.1.4-3' 
    ext.compat_version = '26.0.2' 

    repositories { 
     jcenter() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:2.3.3' 
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
     classpath "io.realm:realm-gradle-plugin:3.7.2" 
     // NOTE: Do not place your application dependencies here; they belong 
     // in the individual module build.gradle files 
    } 
} 

allprojects { 
    repositories { 
     jcenter() 
    } 
} 

task clean(type: Delete) { 
    delete rootProject.buildDir 
} 

,并根据若添加或不是应用插件:'realm-android'到:app模块我得到RealmObject“X”不是该领域模式的一部分,或者如果我将该插件添加到应用程序gradle中,则无法完全构建该项目。

是否有已使用领域在库中,并希望任何人来解释如何,清晰和深入的,也许这可以作为未来的参考

编辑:在上述结构中我得到这个错误时,建筑

Execution failed for task ':app:transformClassesWithDexForDebug'. 
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lio/realm/ChatRealmProxyInterface; 

编辑2:

我设法得到它的工作通过定义模块以实现应用程序和库,避免在应用程序命名的境界车型相同的那些图书馆(这是必需的?或者是否有办法隔离库模型,以便用户可以使用库模型使用的相同名称?)但是,这仍然花了我2天的研究时间,我仍然不确定自己做得对不对。如果有人比我有更多的知识做了一个很好的教程或什么的,那真是太棒了。

+0

'(如果从境界有人读这一点,你真的应该对关于使用文档改善图书馆)'有[这是一个正式的例子。](https://github.com/realm/realm-java/tree/8a3c4ce1f0d47c64dc4d97cfafbea1d65f5e5827/examples/moduleExample) – EpicPandaForce

+0

@EpicPandaForce是的,我读了它,它澄清了一些事情,但在那里没有真正解释在库中使用领域的规则的文档,例如如果您必须在应用程序gradle中包含“apply plugin”,如果您已经在库中包含它,如果库用户可以使用与库中的名称相同的RealmObjects,并且深入了解这种情况。 –

+1

Realm不会为模块和模型类考虑软件包名称,所以是的,在库和应用程序中拥有相同的名称会导致冲突。我们的确尝试记录文档https://realm.io/docs/java/latest/#schemas中有关模式的限制,以及上面链接的示例项目,但听起来我们需要描述文档更好。 –

回答

0

一下添加到

dependencies { 
    classpath "io.realm:realm-gradle-plugin:3.5.0" 
} 
+0

它已经在那里,对不起,我忘了写它,我会更新问题 –

2

你正面临着在64K方法多DEX文件的问题不相关的领域库,你需要添加依赖

配置您的应用multidex

项目gradle这个文件
android { 
    defaultConfig { 
     ... 
     multiDexEnabled true 
    } 
    productFlavors { 
     dev { 
      // Enable pre-dexing to produce an APK that can be tested on 
      // Android 5.0+ without the time-consuming DEX build processes. 
      minSdkVersion 21 
     } 
     prod { 
      // The actual minSdkVersion for the production version. 
      minSdkVersion 14 
     } 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 
               'proguard-rules.pro' 
     } 
    } 
} 
dependencies { 
    compile 'com.android.support:multidex:1.0.1' 
} 

如果您不重写应用程序类,请编辑您的清单文件以在标记中设置android:name,如下所示:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.myapp"> 
    <application 
      android:name="android.support.multidex.MultiDexApplication" > 
     ... 
    </application> 
</manifest> 

如果你重写应用程序类,将其更改为延长MultiDexApplication(如果可能)如下:

public class MyApplication extends SomeOtherApplication { 
    @Override 
    protected void attachBaseContext(Context base) { 
    super.attachBaseContext(base); 
    MultiDex.install(this); 
    } 
} 
+0

谢谢,但这不是问题,dex错误带走了干净构建,这是模块和模型名称的配置问题 –