Итак, я написал интерфейс, который удовлетворяет моим требованиям, с двумя реализациями: для Android и J2ME.
Вот как выглядит интерфейс:
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;
}
Существует также фабрика для хранилищ данных:
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;
}
Документы, автоматически сгенерированные Doxygen, можно найти здесь .
Mercurial репозиторий с интерфейсом и всеми реализациями можно найти здесь .
Как мне его использовать:
Как я уже сказал в своем вопросе, у меня есть приложение для Android и приложение для J2ME, оба эти приложения делают то же самое. (если кому интересно, они общаются через bluetooth с удаленным встроенным устройством)
Оба приложения имеют общую низкоуровневую часть, которая выполняет основную работу.
У меня interface IMainApp
, что-то вроде этого:
public interface IMainApp {
public ISDataStoreFactory getDataStoreFactory();
/*
* ... some other methods
*/
}
Оба приложения (для Android и для J2ME) имеют собственные реализации этого интерфейса и передают его ссылку на низкоуровневую часть. Когда низкоуровневая деталь хочет открыть какое-либо хранилище данных, она использует ISDataStoreFactory
, возвращаемое IMainApp.getDataStoreFactory
. Это работает так же, как я хочу, чтобы это работало.
Надеюсь, это кому-нибудь пригодится.