<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><br><div apple-content-edited="true">
<div>—</div><div>Tadeas Kriz</div><div><a href="mailto:tkriz@redhat.com">tkriz@redhat.com</a></div>
</div>
<br><div><div>On 08 Jan 2014, at 16:04, Summers Pittman <<a href="mailto:supittma@redhat.com">supittma@redhat.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
<div bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 01/08/2014 09:57 AM, Tadeas Kriz
wrote:<br>
</div>
<blockquote cite="mid:B5C99187-AF43-4FB9-A62A-C0287B89738F@redhat.com" type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<br>
<br>
<div>
<div>On 08 Jan 2014, at 15:53, Summers Pittman <<a moz-do-not-send="true" href="mailto:supittma@redhat.com">supittma@redhat.com</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<blockquote type="cite">
<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type">
<div bgcolor="#FFFFFF" text="#000000">
<div class="moz-cite-prefix">On 01/08/2014 09:42 AM, Tadeas
Kriz wrote:<br>
</div>
<blockquote cite="mid:0BE571A7-F030-4561-AEE8-FF87406E5877@redhat.com" type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
<br>
<div>
<div>On 08 Jan 2014, at 15:30, Summers Pittman <<a moz-do-not-send="true" href="mailto:supittma@redhat.com">supittma@redhat.com</a>>
wrote:</div>
<br class="Apple-interchange-newline">
<blockquote type="cite">
<div style="font-size: 12px; font-style: normal;
font-variant: normal; font-weight: normal;
letter-spacing: normal; line-height: normal;
orphans: auto; text-align: start; text-indent: 0px;
text-transform: none; white-space: normal; widows:
auto; word-spacing: 0px; -webkit-text-stroke-width:
0px;">On 01/08/2014 05:51 AM, Tadeas Kriz wrote:<br>
<blockquote type="cite">Hey everyone,<br>
<br>
I’ve been recently going through the DataManager
API in aerogear-android. In this email, I’d like
to suggest addiction of two method (or possibly
three) into the `Store<T>` interface. These
would be:<br>
<br>
```java<br>
/**<br>
* If store is open, it can be read or written to.<br>
*/<br>
boolean isOpen();<br>
<br>
/**<br>
* Opens store in current thread (blocking).<br>
*/<br>
Store<T> open();<br>
<br>
/**<br>
* Opens store in background thread and then
callback#onSuccess is called.<br>
*/<br>
void open(Callback<Store<T>>
callback);<br>
```<br>
</blockquote>
I think those are fine. Feel free to JIRA it up and
Passos and I will<span class="Apple-converted-space"> </span><br>
review.<br>
<blockquote type="cite"><br>
<blockquote type="cite">From my point of view,
this makes sense to be in the `Store<T>`
so I can switch between stores easily during
development with no need to change other code.
Also, if `read` or `write` operations are done
with closed store, there are two possible
workflows. First one is, that I’d fail and throw
an exception. Second (and for me a preferred
one) is, that all those methods would internally
check if the store is open and if not, they’d
call the `open` method. This also leads me to
another API change for `Store<T>`.<br>
</blockquote>
<br>
```java<br>
/**<br>
* Reads all the data from the underlying storage
system asynchronously.<br>
*/<br>
void readAll(Callback<Collection<T>>
callback);<br>
<br>
/**<br>
* Reads a specific object/record from the
underlying storage system asynchronously.<br>
*/<br>
void read(Serializable id, Callback<T>
callback);<br>
<br>
/**<br>
* Search for objects/records from the underlying
storage system asynchronously.<br>
*/<br>
void readWithFilter(ReadFilter filter,
Callback<List<T>> callback);<br>
<br>
/**<br>
* Saves the given object in the underlying
storage system asynchronously.<br>
*/<br>
void save(T item, Callback<Void> callback);<br>
<br>
/**<br>
* Resets the entire storage system
asynchronously.<br>
*/<br>
void reset(Callback<Void> callback);<br>
<br>
/**<br>
* Removes a specific object/record from the
underlying storage system asynchronously.<br>
*/<br>
void remove(Serializable id, Callback<Void>
callback);<br>
<br>
/**<br>
* Checks if the storage system contains no stored
elements asynchronously.<br>
*/<br>
void isEmpty(Callback<Boolean> callback);<br>
```<br>
<br>
That’s right, async methods for easy access to the
storage from background thread, without the pain
of writing it myself (for example, it makes no
sense if I want to just call `store.save(..)` and
I’d have to write all the `AsyncTask`
boilerplate).<br>
<br>
So, what do you think?<br>
</blockquote>
<br>
I would rather throw an exception than open a
database when you call<span class="Apple-converted-space"> </span><br>
read and friends. That way a developer doesn't
accidentally open a<span class="Apple-converted-space"> </span><br>
database he meant to be closed. I don't have that
strong of a feeling on<span class="Apple-converted-space"> </span><br>
that point one way or another however.</div>
</blockquote>
<div><br>
</div>
<div>That’s right, it’s probably less error prone in
scenarios when you want the store closed.</div>
<br>
<blockquote type="cite">
<div style="font-size: 12px; font-style: normal;
font-variant: normal; font-weight: normal;
letter-spacing: normal; line-height: normal;
orphans: auto; text-align: start; text-indent: 0px;
text-transform: none; white-space: normal; widows:
auto; word-spacing: 0px; -webkit-text-stroke-width:
0px;"><br>
My stronger feeling is on adding callbacks to the
stores methods. I<span class="Apple-converted-space"> </span><br>
prefer for the Store to be synchronous and Pipes to
be asynchronous. We<span class="Apple-converted-space"> </span><br>
could add a StorePipe to our PypeTipes which may
solve some of the headache.<br>
<br>
</div>
</blockquote>
<div><br>
</div>
<div>Would “void open(Callback<Store<T>>
callback);” make sense then? I mean, that would add
another inconsistency in the API, as one method would
be async and the rest would be only synchronous,
wouldn’t it?</div>
</div>
</blockquote>
True. The reason for the exception here was that opening a
SQL store or an encrypted store COULD take significant
amount of time. For in Memory data stores this is instant of
course.<br>
</div>
</blockquote>
<div>I understand, but that’s just an assumption. Let’s say that
there’s a storage, that’d take an instant to load data from,
but a lot of time to save data (like XML file based store).
What’s the main reason to not have async “read”/“write”
methods?</div>
</div>
</blockquote>
<br>
The best reason I can give is if your Store implementation will be
that slow either a) Write a Pipe instead or b) Manage the latency
yourself.<br>
<br>
In Android land you want code on your main thread to be fast or non
blocking. If we are working off the main thread then having things
be slow and blocking is less of an issue. Synchronous code is
easier to debug (in Java) and easier to write (in Java) and faster
(because we don't have to route through callback classes).<br>
<br>
Having either or, in my opinion, clouds what your usage target
should be.<br>
<br>
Also this is the most though Stores have been given in a long time.
Anything we come up with we will probably need to get the other
platforms alerted to as well.<br>
<br></div></blockquote>Well, sometimes you want to reload a ListView data and it’d make it so easy to just call “store.readAll(callback)” where in callback#onSuccess you’d remove progress indicator and notify the ListView about new data.</div><div><br></div><div>BTW, I’ve been working on new DataManager API, which would be a lot more interesting for users (right now the need to cast it and also that it’s not easily extendable is a pain), so when I’m done with that, I’ll start another thread here on ML ;)<br><blockquote type="cite"><div bgcolor="#FFFFFF" text="#000000">
<br>
<blockquote cite="mid:B5C99187-AF43-4FB9-A62A-C0287B89738F@redhat.com" type="cite">
<div>
<blockquote type="cite">
<div bgcolor="#FFFFFF" text="#000000">
<blockquote cite="mid:0BE571A7-F030-4561-AEE8-FF87406E5877@redhat.com" type="cite">
<div><br>
<blockquote type="cite">
<div style="font-size: 12px; font-style: normal;
font-variant: normal; font-weight: normal;
letter-spacing: normal; line-height: normal;
orphans: auto; text-align: start; text-indent: 0px;
text-transform: none; white-space: normal; widows:
auto; word-spacing: 0px; -webkit-text-stroke-width:
0px;">Passos, wdyt?<br>
<br>
<br>
<blockquote type="cite"><br>
PS: You can find the whole text with highlighted
syntax here:<br>
<br>
—<br>
Tadeas Kriz<br>
<a moz-do-not-send="true" href="mailto:tkriz@redhat.com">tkriz@redhat.com</a><br>
<br>
<br>
_______________________________________________<br>
aerogear-dev mailing list<br>
<a moz-do-not-send="true" href="mailto:aerogear-dev@lists.jboss.org">aerogear-dev@lists.jboss.org</a><br>
<a moz-do-not-send="true" href="https://lists.jboss.org/mailman/listinfo/aerogear-dev">https://lists.jboss.org/mailman/listinfo/aerogear-dev</a><br>
</blockquote>
<br>
_______________________________________________<br>
aerogear-dev mailing list<br>
<a moz-do-not-send="true" href="mailto:aerogear-dev@lists.jboss.org">aerogear-dev@lists.jboss.org</a><br>
<a moz-do-not-send="true" href="https://lists.jboss.org/mailman/listinfo/aerogear-dev">https://lists.jboss.org/mailman/listinfo/aerogear-dev</a></div>
</blockquote>
</div>
<br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
aerogear-dev mailing list
<a moz-do-not-send="true" class="moz-txt-link-abbreviated" href="mailto:aerogear-dev@lists.jboss.org">aerogear-dev@lists.jboss.org</a>
<a moz-do-not-send="true" class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/aerogear-dev">https://lists.jboss.org/mailman/listinfo/aerogear-dev</a></pre>
</blockquote>
<br>
</div>
_______________________________________________<br>
aerogear-dev mailing list<br>
<a moz-do-not-send="true" href="mailto:aerogear-dev@lists.jboss.org">aerogear-dev@lists.jboss.org</a><br>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/aerogear-dev">https://lists.jboss.org/mailman/listinfo/aerogear-dev</a></blockquote>
</div>
<br>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
aerogear-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:aerogear-dev@lists.jboss.org">aerogear-dev@lists.jboss.org</a>
<a class="moz-txt-link-freetext" href="https://lists.jboss.org/mailman/listinfo/aerogear-dev">https://lists.jboss.org/mailman/listinfo/aerogear-dev</a></pre>
</blockquote>
<br>
</div>
_______________________________________________<br>aerogear-dev mailing list<br><a href="mailto:aerogear-dev@lists.jboss.org">aerogear-dev@lists.jboss.org</a><br>https://lists.jboss.org/mailman/listinfo/aerogear-dev</blockquote></div><br></body></html>