2017-09-17 8 views
0

J'essaie de comprendre comment utiliser Realm dans une bibliothèque, je comprends maintenant RealmModules après quelques jours de recherche (si quelqu'un de Realm lit cela, vous devriez vraiment améliorer la documentation sur l'utilisation dans les bibliothèques). Je l'ai fait une classe simple qui me donne le royaume avec configuration de la bibliothèque:Comment utiliser Realm dans une bibliothèque

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

le module est ce

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

et dans le projet d'application domaine de configuration i classe comme celui-ci

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() 
     ) 
    } 
} 

Maintenant le problème que j'ai est que la construction échoue ou l'application plante pour diverses raisons basées sur la façon dont je configure les fichiers gradle.

My: app gradle est ce

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') 
} 

et ma bibliothèque gradle est ce

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' 
} 

ce qui est mon projet 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 
} 

et basé sur si j'ajouter ou pas le plugin apply: 'realm-android' au: module d'application je reçois soit RealmObject "X" ne fait pas partie du schéma pour ce domaine ou Si j'ajoute le plugin à l'application, il échoue à construire le projet complètement.

Est-ce qu'il ya quelqu'un qui a utilisé Realm dans une bibliothèque et veut expliquer comment, de façon claire et en profondeur, peut-être cela pourrait être utilisé comme référence future

EDIT: Avec la configuration ci-dessus je reçois cette erreur lorsque bâtiment

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; 

EDIT 2:

J'ai réussi à le faire fonctionner en définissant des modules pour les applications et à la bibliothèque et en évitant de nommer les modèles de royaume dans l'application les mêmes que ceux de la bibliothèque (est-ce nécessaire? Ou existe-t-il un moyen d'isoler les modèles de bibliothèque pour que l'utilisateur puisse utiliser les mêmes noms que les modèles de bibliothèque?) Cela m'a pris deux jours de recherche et je ne sais toujours pas si je le fais correctement. Ce serait vraiment génial si quelqu'un avec plus de connaissances que moi a fait un joli tutoriel ou quelque chose comme ça.

+0

'(si quelqu'un de Realm lit cela, vous devriez vraiment améliorer la documentation sur l'utilisation dans bibliothèques) 'il y a [un exemple officiel pour cela.] (https://github.com/realm/realm-java/tree/8a3c4ce1f0d47c64dc4d97cfafbea1d65f5e5827/examples/moduleExample) – EpicPandaForce

+0

@EpicPandaForce Oui je l'ai lu et ça clarifie certaines choses mais là Il n'y a pas de documentation qui explique vraiment les règles d'utilisation d'un domaine dans une bibliothèque, comme si vous deviez inclure le "plugin d'application" dans: grad grad de l'application si vous l'avez déjà dans la bibliothèque , si l'utilisateur de la bibliothèque peut utiliser RealmObjects avec le même nom que ceux de la bibliothèque et de façon approfondie. –

+1

Le domaine ne tient pas compte des noms de paquetages pour les modules et les classes de modèles, donc oui, avoir le même nom dans la bibliothèque et dans l'application créera des conflits. Nous avons essayé de documenter les restrictions autour des schémas dans les docs https://realm.io/docs/java/latest/#schemas ainsi que d'avoir le projet exemple lié ci-dessus, mais il semble que nous ayons besoin de décrire les restrictions dans le docs mieux. –

Répondre

0

Ajoutez ceci à votre projet fichier gradle

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

Il est déjà là, désolé j'ai oublié de l'écrire, je vais mettre à jour la question –

2

vous face Plus 64K plusieurs méthodes problème de fichier dex non lié à la bibliothèque de domaine vous devez ajouter des dépendances

Configurez votre application pour multidex

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' 
} 

Si vous ne remplacez pas la classe Application, éditez votre fichier manifeste pour définir le nom android: name dans la balise comme suit:

<?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> 

Si vous faites remplacer la classe d'application, changer pour étendre MultiDexApplication (si possible) comme suit:

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

Merci, mais ce n'était pas le problème, l'erreur dex est parti avec un nettoyage build, c'était un problème de configuration avec les modules et les noms de modèles –