Android ObjectBox.getAll() возвращает ноль, даже если objectBox.count равен 5
Я не понимаю, почему цикл for ломает мое приложение. Я понимаю, что это простой вопрос, но я часами смотрел на этот код, пытаясь понять его. Я уверен, что все зависимости в build.gradle верны. Дайте мне знать, если вам нужна дополнительная информация. Спасибо.
// Класс приложения
package edu.uncw.seahawktours;
import android.app.Application;
import java.util.ArrayList;
import java.util.List;
import io.objectbox.Box;
import io.objectbox.BoxStore;
public class App extends Application {
private BoxStore boxStore;
@Override
public void onCreate() {
super.onCreate();
// Initialize the main data access object
boxStore = MyObjectBox.builder().androidContext(App.this).build();
// Get the wrapper (Box) for the Book table that lets us store Book objects
Box<Building> buildingBox = boxStore.boxFor(Building.class);
// Initialize with some data
if (buildingBox.count() == 0) {
List<Building> initialBooks = new ArrayList<>();
initialBooks.add(new Building("CIS", "https://library.uncw.edu/web/collections/archives/bnl/cis.html", R.drawable.cis));
initialBooks.add(new Building("Depaolo Hall", "https://library.uncw.edu/web/collections/archives/bnl/6.html", R.drawable.depaolo));
initialBooks.add(new Building("Trask Coliseum", "https://library.uncw.edu/web/collections/archives/bnl/10.html", R.drawable.trask));
initialBooks.add(new Building("King Hall", "https://library.uncw.edu/web/collections/archives/bnl/4.html", R.drawable.kinghall2));
initialBooks.add(new Building("Leutze Hall", "https://library.uncw.edu/web/collections/archives/bnl/17.html", R.drawable.leutzehall));
// ObjectBox is smart enough to handle CRUD on Collections of entities
buildingBox.put(initialBooks);
}
System.out.println(buildingBox.count());
for (Building book : buildingBox.getAll()) {
System.out.println(book.getBuildingName());
}
}
public BoxStore getBoxStore() {
return boxStore;
}
}
// Строительный класс
package edu.uncw.seahawktours;
import io.objectbox.annotation.Entity;
import io.objectbox.annotation.Id;
@Entity
public class Building {
@Id public long id;
private String buildingName;
private String description;
private String url;
private int imageID;
public Building(String name, String url ,int buildingPictureID){
this.buildingName = name;
this.url = url;
this.imageID = buildingPictureID;
}
public long getId() {
return id;
}
public String getDescription() {
return description;
}
public String getBuildingName() {
return buildingName;
}
public String getUrl() {
return url;
}
public int getImageID() {
return imageID;
}
public void setId(long id) {
this.id = id;
}
public void setBuildingName(String buildingName) {
this.buildingName = buildingName;
}
public void setDescription(String description) {
this.description = description;
}
public void setUrl(String url) {
this.url = url;
}
public void setImageID(int imageID) {
this.imageID = imageID;
}
@Override
public String toString() {
return this.buildingName;
}
}
// Project Build.Gradle
// Top-level build file where you can add configuration options common to
all sub-projects/modules.
buildscript {
ext.objectboxVersion = '2.2.0'
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
// App Build.Gradle
apply plugin: 'com.android.application'
apply plugin: 'io.objectbox'
android {
compileSdkVersion 28
defaultConfig {
applicationId "edu.uncw.seahawktours"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
implementation 'com.android.support:design:28.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
}
0 ответов
Оказывается, что при использовании ObjectBox в разработке для Android очень важно иметь пустой конструктор. Это может относиться к вашему ответу в некотором смысле, но именно это исправило программу. Очень тупая реализация на мой взгляд.
Мой ответ ужасный, но ObjectBox хорош только для "плоских" структур данных. Реализация отношений ужасна, как и RealmDb. Почему мы не можем встраивать объекты, почему все взаимосвязано? Есть гораздо более медленная альтернатива, Couchbase Mobile. Едва ли упоминается, но это больше похоже на MongoDb для мобильных устройств. Я пробовал это раньше, мне не нравилось - мне все еще не нравится, но мне не нужно тратить дни и дни, пытаясь найти документацию, чтобы это работало. Вы просто сохраняете свою структуру данных. Это не типобезопасно, как ObjectBox (который отстой). Кажется, все предложения сосут на разных уровнях.
Итак, рассмотрим это:
ObjectBox лучше всего подходит для плоских структур и производительности, но не подходит для интеграции с ответами сервера (вам нужно написать слишком много для таких простых вещей, как обновления ассоциаций TooMany - ToOne, а документация - для Kotlin и Java)
RealmDb имеет ужасные проблемы с многопоточностью и работает медленнее, чем ObjectBox, но намного быстрее, чем Couchbase Mobile.
Производительность Couchbase Mobile - отстой, но вы можете хранить свои серверные структуры по мере их получения с сервера. Если Couchbase Mobile исправит их производительность запросов / вставок, он разбьет остальных, так как хранит ваши объектные структуры по мере необходимости (например, MAP).
Я знаю, что это не помогает, проголосуйте за меня, но я потратил некоторое время, играя со всеми из них, и до сих пор не имею четкого пути для приложений на основе автономного хранилища.