Android ObjectBox.getAll () возвращает ноль, хотя objectBox.count равен 5 - PullRequest
0 голосов
/ 01 декабря 2018

Я не понимаю, почему цикл 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
}

// Приложение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'
}

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Оказывается, что при использовании ObjectBox в разработке для Android очень важно иметь пустой конструктор.Это может относиться к вашему ответу в некотором смысле, но именно это исправило программу.Очень тупая реализация на мой взгляд.

0 голосов
/ 09 февраля 2019

Мой ответ ужасный, но ObjectBox хорош только для "плоских" структур данных.Реализация отношений ужасна, как и RealmDb.Почему мы не можем встраивать объекты, почему все взаимосвязано?Есть гораздо более медленная альтернатива, Couchbase Mobile.Едва ли упоминается, но это больше похоже на MongoDb для мобильных устройств.Я пробовал это раньше, мне не нравилось - мне все еще не нравится, но мне не нужно тратить дни и дни, пытаясь найти документацию, чтобы это работало.Вы просто сохраняете свою структуру данных.Это не типобезопасно, как ObjectBox (который отстой).Кажется, что все предложения отстают на разных уровнях.

Так что учтите это:

  1. ObjectBox является лучшим для плоских структур и производительности, но отстой интеграции с ответами сервера (у вас естьнаписать слишком много полезного для простых вещей, таких как обновления ассоциаций TooMany - ToOne, а также документация отстой как для Kotlin, так и для Java)

  2. RealmDb имеет ужасные проблемы с многопоточностью,и медленнее, чем ObjectBox, но намного быстрее, чем Couchbase Mobile.

  3. Производительность Couchbase Mobile - отстой, но вы можете сохранять структуры вашего сервера по мере их получения с сервера.Если Couchbase Mobile исправит их производительность запросов / вставок, он сокрушит остальных, поскольку хранит ваши объектные структуры по мере необходимости (например, MAP)

Я знаю, что это не помогает, проголосуйте за меня, но я потратил некоторое время, играя со всеми из них, и до сих пор не имею четкого пути для приложений на основе автономного хранилища.

...