rehacktive / waspdb

key/value data storage library for Android, pure java and encrypted
Apache License 2.0
226 stars 24 forks source link

Buffer Underflow when putting object #12

Closed Night4Us closed 5 years ago

Night4Us commented 7 years ago

Hi,

It seems that we can't use the DB from a different thread, (even when trying to runFromUiThread after using the thread). Trace : com.esotericsoftware.kryo.KryoException: Buffer overflow. Available: 0, required: 31 Serialization trace: artwork_url (com.night4us.night4us.entities.SongHolder) songs (com.night4us.night4us.entities.ArtisteHolder) at com.esotericsoftware.kryo.io.Output.require(Output.java:163) at com.esotericsoftware.kryo.io.Output.writeAscii_slow(Output.java:488) at com.esotericsoftware.kryo.io.Output.writeString(Output.java:343) at com.esotericsoftware.kryo.serializers.DefaultSerializers$StringSerializer.write(DefaultSerializers.java:191) at com.esotericsoftware.kryo.serializers.DefaultSerializers$StringSerializer.write(DefaultSerializers.java:184) at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:606) at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:87) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518) at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:628) at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:100) at com.esotericsoftware.kryo.serializers.CollectionSerializer.write(CollectionSerializer.java:40) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:552) at com.esotericsoftware.kryo.serializers.ObjectField.write(ObjectField.java:80) at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:518) at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:628) at com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:113) at com.esotericsoftware.kryo.serializers.MapSerializer.write(MapSerializer.java:39) at com.esotericsoftware.kryo.Kryo.writeObject(Kryo.java:534) at net.rehacktive.waspdb.internals.collision.KryoStoreUtils.serialize(KryoStoreUtils.java:95) at net.rehacktive.waspdb.internals.collision.KryoStoreUtils.serializeToDisk(KryoStoreUtils.java:41) at net.rehacktive.waspdb.internals.collision.CollisionHash.storeHashByKey(CollisionHash.java:276) at net.rehacktive.waspdb.internals.collision.CollisionHash.storeObject(CollisionHash.java:55) at net.rehacktive.waspdb.internals.collision.CollisionHash.updateObject(CollisionHash.java:45) at net.rehacktive.waspdb.WaspHash.put(WaspHash.java:34) at com.night4us.night4us.db.Storage$1.run(Storage.java:85) at android.os.Handler.handleCallback(Handler.java:746) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5443) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)

It seems like it's due to several threads writing to the same file, I will probably write a fix...

rehacktive commented 7 years ago

Yes, it's definitely due to several threads writing on the same file. WaspDB is supposed to be used with a single (possibly background) thread. It should not be used from the UI thread, as anything that could possibly delay the UI interaction (networking, data access..).

Working on a fix.

PauloLeal commented 7 years ago

Hello. I'm trying to make a generic Dao using waspdb but getAllValues() always returns null. If I get (by key) my keys are there.

public abstract class BaseDao { private static String appPath;

private final WaspDb db;
private final String hashName;

BaseDao(String hashName) {
    this.hashName = hashName;

    String databaseName = "qpos";
    String password = "passw0rd";

    db = WaspFactory.openOrCreateDatabase(appPath, databaseName, password);
}

private WaspHash getDbHash() {
    return db.openOrCreateHash(this.hashName);
}

private List<T> findAll() {
    return getDbHash().getAllValues();
}

}