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.
'(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
@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. –
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. –