Общий простой интерфейс хранения данных для Android, J2ME и ПК - PullRequest
4 голосов
/ 22 марта 2012

Я прочитал много вопросов об Android, J2ME и RecordStore, но до сих пор не могу найти ответ, который мог бы меня удовлетворить.

Мне нужно реализовать низкоуровневую часть моего Java-приложения, которая должна работать на разных платформах, сейчас это Android и J2ME, и в будущем оно должно работать и на ПК. Мне нужно хранить простые наборы данных, которые почти аналогичны RecordStore в J2ME:

Приложение должно иметь несколько хранилищ записей с записями, каждая запись имеет:

  • идентификатор (но это должен быть идентификатор " my ", а не автоматически возвращаемый, как в RecordStore),
  • данные (просто байтовый массив).

Я думаю, что я должен написать Interface с необходимыми методами, и у каждой платформы должна быть своя реализация этой Interface.

Но эта задача кажется очень распространенной (по крайней мере, для Android + J2ME), так что, может быть, уже есть какая-то облегченная реализация? Я спрашиваю только потому, что не люблю изобретать велосипед.

А может быть, какие-то предложения?

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Итак, я написал интерфейс, который удовлетворяет моим требованиям, с двумя реализациями: для 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. Это работает так же, как я хочу, чтобы это работало.

Надеюсь, это кому-нибудь пригодится.

0 голосов
/ 23 марта 2012

Ты покажешь, что я сделал

создать профили .. это значения, которые я хочу сохранить в базе данных

Пример профиля

    public class NewsProfile {

        public String uniqid = "", category = "", title = "" ;

        public NewsProfile(String uniqid) {
            this.uniqid = uniqid;
        }
    }

Создать магазин новостей, который принимает новый профиль

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();
}

Это означает, что в любое время, когда я хочу сохранить данные в базе данных .... что в любой момент времени сохраняется, это NewsProfile .... Вы не можете реализовать для другого хранилища вы хотите .. SQLite, RMS, даже веб-сервис

Спасибо :)

...