领域findfirst()返回null

时间:2017-08-02 07:45:23

标签: java android realm

领域的新手,面对我项目中的问题。所以我想要实现的是,在我的应用程序中,当我单击一张照片时,我将在我的数据库中保存一个领域对象,并在本地缓存该图像以供以后使用。以下是两者的代码:

@Override
public void onPhotoSelected(PXImage photo) {

    PXComposition composition = null;
    PXPhoto photoParent = null;
    for (PXComposition pxComposition : mSession.getCompositions()) {
        if (pxComposition.getItems() == null || pxComposition.getItems().size() < 1)
            continue;

        for (PXPhoto item : pxComposition.getItems()) {
            if (item.getImage().getOriginalPath().equals(photo.getOriginalPath())) {
                composition = pxComposition;
                photoParent = item;
                break;
            }
        }
    }
    if (composition == null && photo.isSelected()) {
        mRealm.beginTransaction();
        String uuid = mSession.addPhoto(photo).getUuid();
        mRealm.commitTransaction(); // IMPORTANT to commit transaction. ContentDownloadTask requires PXImage to be written in Realm.
        ThreadUtils.getDefaultExecutorService().submit(new ContentDownloadTask(this, photo.getOriginalPath(), uuid));
    } else if (composition != null && !photo.isSelected()) {
        mRealm.beginTransaction();
        if (photoParent.getImage().isDownloaded()) // FIXME What if not copied yet ???
            FileUtils.deleteFile(photoParent.getImage().getApplicationPath());
        mSession.removePhoto(photoParent);
        mRealm.commitTransaction();
    }
    onCheckChanged(photo);
    App.log().v("SESSION", mSession.toString());
}

这是处理照片上的点击事件的地方。选择后,单击我调用ThreadUtils.getDefaultExecutorService().submit(new ContentDownloadTask(this, photo.getOriginalPath(), uuid));以在本地缓存图像。以下是ContentDownloadTask的代码:

public class ContentDownloadTask implements Callable<Void> {

private String id;

private String path;

private Context context;

private Realm mRealm;

public static final String TAG = "ContentDownloadTask";

private static final String DIR_EXTERNAL_NAME = "Local";
private static final String FILE_EXTENSION = ".jpg";

public ContentDownloadTask(Context context, String path, String id) {
    this.path = path;
    this.id = id;
    this.context = context;
}

@Override
public Void call() throws Exception {

    try {
        Log.d(TAG, "Copying From " + path);
        //create output directory if it doesn't exist
        final File file = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        if (file == null) {
            throw new IllegalStateException("Failed to get external storage files directory");
        } else if (file.exists()) {
            if (!file.isDirectory()) {
                throw new IllegalStateException(file.getAbsolutePath() +
                        " already exists and is not a directory");
            }
        } else {
            if (!file.mkdirs()) {
                throw new IllegalStateException("Unable to create directory: " +
                        file.getAbsolutePath());
            }
        }

        File to = new File(file, DIR_EXTERNAL_NAME);
        if (to.exists()) {
            if (!to.isDirectory()) {
                throw new IllegalStateException(file.getAbsolutePath() +
                        " already exists and is not a directory");
            }
        } else if (!to.mkdirs()) {
            throw new IllegalStateException("Unable to create directory: " +
                    file.getAbsolutePath());
        }

        to = new File(to, fileName(this.id));
        if (!to.exists())
            to.createNewFile();

        InputStream in = null;
        if (PackageUtils.isContentUri(path)) {
            Uri uri = PackageUtils.toUri(path);
            in = context.getContentResolver().openInputStream(uri);
        } else {
            File from = new File(this.path);
            in = new FileInputStream(from);
        }

        OutputStream out = new FileOutputStream(to);

        // Transfer bytes from in to out
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();

        mRealm = Realm.getDefaultInstance();
        PXImage image = mRealm.where(PXImage.class).equalTo("uuid", this.id).findFirst();

        if (image == null) {
            to.delete();
            throw new Exception("Photo Not Found ID: " + this.id);
        }

        mRealm.beginTransaction();
        image.setApplicationPath(to.getPath());
        mRealm.commitTransaction();
        mRealm.close();
        Log.d(TAG, "Complete Copied From " + path + " To " + to.getAbsolutePath());
    } catch (Exception e) {
        Log.e(TAG, e.getMessage());
    }

    return null;
}

现在在此语句处返回null:PXImage image = mRealm.where(PXImage.class).equalTo("uuid", this.id).findFirst();。基本上我需要保存我在realm对象中本地缓存的图像的应用程序路径。但它返回null。每次点击照片时都不会发生这种情况。这有时只会发生,并且错误不可重复。任何形式的帮助将不胜感激。我已经检查了以下重复的问题:

first

second

third

fourth

public PXPhoto addPhoto(PXImage image) {
    PXComposition composition = null;
    PXPhoto photo = null;
    boolean isLandscape = false;
    int photosPerItem = getProduct().getSelectedPhotosPerItem();
    switch (getProduct().getRootShortCode()) {
        case Product.CategoryType.SQUARES:
        case Product.CategoryType.CLASSIC:
        case Product.CategoryType.WALLOGRAPHS:
        case Product.CategoryType.SIGNATURES:
        case Product.CategoryType.MOSAIC:
            setLayoutType(image.isLandscape() ? C.LayoutType.LANDSCAPE.ordinal() : C.LayoutType.PORTRAIT.ordinal());
            composition = PXComposition.initializeNewComposition(this);
            photo = PXPhoto.initializePhoto(image);
            break;
        case Product.CategoryType.PANORAMA:
            composition = PXComposition.initializeNewComposition(this);
            photo = PXPhoto.initializePhoto(image);
            break;
        case Product.CategoryType.STRIPS:
        case Product.CategoryType.POSTERS:
            if (getCompositions() == null || getCompositions().size() == 0
                    || (getProduct().getRootShortCode().equals(Product.CategoryType.STRIPS) &&
                    getCompositions().last().getItems().size() % photosPerItem == 0))
                composition = PXComposition.initializeNewComposition(this);
            else
                composition = getCompositions().last();
            photo = PXPhoto.initializePhoto(image);
            break;
    }
    composition.addItem(photo);
    composition.updateComposition();
    if (!composition.isManaged()) {
        Realm realm = Realm.getDefaultInstance();
        composition = realm.copyToRealmOrUpdate(composition);
        realm.close();
        photo.setComposition(composition);
        addComposition(composition);
    } else
        photo.setComposition(composition);
    return photo;
}

编辑:

uuid generation:

public PXPhoto() {
    this.uuid = UUID.randomUUID().toString();
    this.autoEnhance = false;
    this.zoom = 1;
}

0 个答案:

没有答案