4

我已经阅读了很多关于 Android、J2ME 和的问题RecordStore,但我仍然找不到能让我满意的答案。

我需要实现我的 Java 应用程序的低级部分,它应该可以在不同的平台上运行,现在是 Android 和 J2ME,将来它也应该可以在 PC 上运行。我需要存储简单的数据集,这与RecordStoreJ2ME 中的几乎相似:

应用程序应该拥有多个带有记录的记录存储,每个记录具有:

  • id(但它应该是“我的”id,而不是自动返回的 id RecordStore),
  • 数据(只是一个字节数组)。

我想我应该写一个Interfacewith 需要的方法,每个平台都应该有自己的 this 实现Interface

但是这个任务似乎很常见(至少,对于 Android + J2ME),所以,也许已经有一些轻量级的实现了?我问只是因为我不喜欢重新发明轮子。

也许有一些建议?

4

2 回答 2

1

因此,我编写了满足我要求的接口,有两个实现: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 的应用程序,这两个应用程序都做了类似的事情。(如果有人感兴趣,他们通过蓝牙与远程嵌入式设备进行通信)

这两个应用程序都有共同的低级部分来完成主要工作。

我有interface IMainApp类似的东西:

public interface IMainApp {

   public ISDataStoreFactory getDataStoreFactory();

   /*
    * ... some other methods
    */
}

两个应用程序(对于 Android 和 J2ME)都有自己的该接口实现,并且它们将其引用传递给低级部分。当底层部分想要打开一些数据存储时,它使用ISDataStoreFactory返回的IMainApp.getDataStoreFactory. 它就像我希望它工作一样工作。

希望它对任何人都有用。

于 2012-03-26T16:39:49.040 回答
0

你是我做的吗

创建配置文件..这是我要存储在数据库中的值

样品简介

    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,甚至Web服务

谢谢 :)

于 2012-03-23T09:59:58.997 回答