Interfaz simple de almacenamiento de datos para Android, J2ME y PC
He leído muchas preguntas sobre Android, J2ME y RecordStore
, pero todavía no puedo encontrar la respuesta que podría satisfacerme.
Tengo que implementar parte de bajo nivel de mi aplicación Java que debería funcionar en diferentes plataformas, ahora mismo es Android y J2ME, y en el futuro debería funcionar en PC también. Necesito almacenar conjuntos de datos simples, que es casi similar a RecordStore
en J2ME:
- Personalizar cifrar las llamadas GSM
- Lectura de código de barras con foto tomada con cámara de teléfono móvil
- ¿Cuál es la diferencia entre los paquetes android.opengl y javax.microedition.khronos.opengles?
- BlackBerry API equivalente a la tostada de Android?
- Programación móvil
App debe poseer varias tiendas de discos con registros, cada registro tiene:
- El id (pero debe ser " mi " id, no devuelto automáticamente como está en
RecordStore
), - Los datos (sólo una matriz de bytes).
Creo que debería escribir una Interface
con los métodos necesarios, y cada plataforma debe tener su propia implementación de esta Interface
.
Pero esta tarea parece ser muy común (al menos, para Android + J2ME), por lo que, tal vez ya hay alguna aplicación ligera? Le estoy preguntando sólo porque no me gusta volver a inventar la rueda.
Y tal vez algunas sugerencias?
- J2ME / Android / BlackBerry - Direcciones de conducción, ruta entre dos ubicaciones
- Medición de la fuerza de la señal del teléfono "real" en un teléfono móvil
- ¿Qué tan bien el conocimiento de J2ME se generaliza a otras plataformas móviles?
- Java (Eclipse) - Recopilación condicional
- ¿Cuál es la mejor manera de desarrollar una aplicación multi-móvil con soporte para bluetooth?
- ¿Hay puntos de referencia sobre J2MEPolish para convertir una aplicación J2ME a Android?
- Capa de compatibilidad Java ME para Android
- Diferencia entre la clase DataInputStream / DataOutputStream y la clase InputStream / OutputStream
Por lo tanto, escribí la interfaz que satisface mis requisitos, con dos implementaciones: para Android y J2ME.
Aquí es cómo aspecto de la interfaz:
public interface ISDataStore { /** * Get number of records in data store. */ public int getNumRecords() throws SDataStoreException; /** * Get size of one record with specified id in bytes. * * @param record_id id of the record */ public int getRecordSize(int record_id) throws SDataStoreException; /** * Get record. * * @param record_id id of the record to read * @param data byte array where to put the data * @param offset offset in 'data' array from which should start to copy */ public void getRecord(int record_id, byte[] data, int offset) throws SDataStoreException; /** * Get record. * * @param record_id id of the record to read */ public byte[] getRecord(int record_id) throws SDataStoreException; /** * Resolves is record with specified id exists or not. * * @param record_id id of the record * @return true if record exists, otherwise false */ public boolean isRecordExists(int record_id) throws SDataStoreException; /** * Put new record or update existing one. * * @param record_id id of the record * @param data byte array of data * @param offset offset in the data byte array * @param length number of bytes to store * * @return true if operation was successful, otherwise false * */ public boolean setRecord(int record_id, byte[] data, int offset, int length) throws SDataStoreException; /** * Delete the record. * * @param record_id id of the record * * @return true if operation was successful, otherwise false */ public boolean deleteRecord(int record_id) throws SDataStoreException; /** * Clear all the records. */ public void deleteAll() throws SDataStoreException; /** * Close the data store. */ public void close() throws SDataStoreException; }
También hay una fábrica para almacenes de datos:
public interface ISDataStoreFactory { /** * @param dataStoreId id of the data store * @return ISDataStore with given id. Type of this id depends on target platform */ public ISDataStore getDataStore(Object dataStoreId) throws SDataStoreException; /** * Destroys data store with given id. * @param dataStoreId id of the data store. Type of this id depends on target platform */ public void destroyDataStore(Object dataStoreId) throws SDataStoreException; }
Los documentos generados automáticamente por Doxygen se pueden encontrar aquí .
El repositorio Mercurial con Interfaz y todas las implementaciones se pueden encontrar aquí .
Como lo uso:
Como ya he dicho en mi pregunta, tengo la aplicación para Android y la aplicación para J2ME, ambas aplicaciones hace lo mismo. (Si alguien está interesado, que hace la comunicación a través de bluetooth con dispositivo remoto incorporado)
Ambas aplicaciones tienen una parte común de bajo nivel que hace el trabajo principal.
Tengo interface IMainApp
, algo así:
public interface IMainApp { public ISDataStoreFactory getDataStoreFactory(); /* * ... some other methods */ }
Ambas aplicaciones (para Android y para J2ME) tienen sus propias implementaciones de esta interfaz, y pasan su referencia a la parte de bajo nivel. Cuando la parte de bajo nivel desea abrir algún almacén de datos, utiliza ISDataStoreFactory
devuelto por IMainApp.getDataStoreFactory
. Funciona igual que yo quiero que funcione.
Espero que sea útil para cualquiera.
Te echo lo que hice
Crear perfiles .. que son los valores que quiero almacenar en la base de datos
Perfil de muestra
public class NewsProfile { public String uniqid = "", category = "", title = "" ; public NewsProfile(String uniqid) { this.uniqid = uniqid; } }
Crear una tienda de noticias que acepte nuevo perfil
public void saveProfile(int id, NewsProfile profile) { try { if (rs != null) { profile.id = id; byte[] bytes = toByteArray(profile); setRecord(profile.id, bytes); System.err.println("Exists = " + profile.catKey + String.valueOf(profile.status)); } } catch (Exception e) { System.err.println("ERROR: saveUpdateProfile" + e.getMessage()); } } public NewsProfile getProfileint id) throws RecordStoreException, IOException { byte[] bytes = rs.getRecord(id); DataInputStream is = new DataInputStream(new ByteArrayInputStream(bytes)); String uniqid = is.readUTF(); OptionsProfile profile = new NewsProfile (uniqid); profile.id = id; profile.catKey = uniqid; profile.category = is.readUTF(); profile.title = is.readUTF(); return profile; } private byte[] toByteArray(NewsProfile profile) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream os = new DataOutputStream(baos); os.writeUTF(profile.uniqid); os.writeUTF(profile.category); os.writeUTF(profile.title); return baos.toByteArray(); }
Lo que esto significa es que en cualquier momento quiero guardar datos en una base de datos …. lo que estoy ahorrando en cualquier momento es NewsProfile …. No se puede implementar para el almacenamiento diferente que desea .. SQLite, RMS, incluso Servicio Web
Gracias 🙂