0

以下问题已单独讨论,但我找不到有效的解决方案。因此发布完整的故事和问题列表。
我们正在构建一个供多个应用程序使用的 SDK(midlet jar)。此 SDK 使用持久存储来存储某些数据。现在有几个问题困扰着我们:
1. 访问商店的密钥已被硬编码在 SDK 中。现在多个应用程序尝试使用相同的键值访问商店,从而导致冲突的问题。
2. Persistable 对象包/类名在多个应用中是相同的。因此,我们在启动应用程序时收到“Class Multiply defined”错误。

现在对于 2,我们一直在考虑以下选项,但似乎都没有解决问题:
1. 不要扩展 Vector 等标准对象并使用标准对象。
问题:数据回收丢失导致冲突。
2. 为使用它的每个应用程序构建具有唯一名称的库。
问题:这意味着我们必须为每个想要使用它的客户发布不同的 SDK。
3.在为下一个应用加载包之前检查Persistable对象类是否已经存在。
问题:当第一个包未安装时会发生什么?类类型会被删除吗?
4. 让应用实现 Persistable 接口,并在回调中传递密钥。
仅仅因为我们无法使用持久存储就要求应用程序传递一些值听起来是不对的。

所以到目前为止,使用 Persistable 对象的 SDK 似乎完全被破坏了。还是我们错过了什么?
任何其他实现该任务的替代建议也非常受欢迎。

4

2 回答 2

0

整个设备上只能有一个具有给定类名的持久类。如果两个应用程序具有相同的可持久类,您将收到 Class Multiply Defined 验证错误,并且根本不会安装第二个应用程序。

唯一的方法是使用内置的可持久类在 SDK 中存储可持久数据。但是,即使包含 SDK 的所有应用程序都已被用户删除,这些可持久数据也不会被删除。您还必须注意数据的版本以向后兼容。

您可以使用 Hashtable、IntHashtable 或 Vector 等内置类来存储数据。然后你编写一个包装类来获取和设置这些信息。基本上,您会将可持久类映射到 Hashtable 或 Vector。

再次记住,您永远不应该将任何未内置的类放入此数据存储区。否则,数据存储区将在应用程序卸载时被删除。

希望有帮助。

于 2014-09-20T07:27:13.457 回答
0

如果存在可以在不同应用程序之间共享功能的库,则将其作为库 cod 文件,并在编译依赖项目时将此 cod 文件指定为库。

例如,如果库名称是,mylib_version1_00.cod那么您的其他项目在编译后可能包含以下文件:

对于项目1:

  • project1.cod
  • mylib_version1_00.cod

对于项目2:

  • project2.cod
  • mylib_version1_00.cod

……

对于项目N:

  • 项目N.cod
  • mylib_version1_00.cod

在安装每个项目时,您将安装mylib.cod文件,如果已经安装了mylib.cod文件,它将被覆盖,它将避免“类 xxx 多次定义”。

发生此错误是因为所有应用程序都在一个 JVM 实例下运行。因此,如果您要向设备上传一个名称为已存在的 cod 文件,它将被重写。

如果您将发布库的下一个版本,请将 cod 文件命名为

mylib_version2_00.cod

并在包名称中使用版本号,例如:

com.yourcompany.yourpoduct.yourlibary.version1

com.yourcompany.yourpoduct.yourlibary.version2

在这种情况下,您可以在同一设备上拥有 cod 文件:mylib_version1_00.cod并且mylib_version2_00.cod它不会产生“class xxx multiply defined”错误。

现在关于坚持。不要在您的库中硬编码持久性密钥。创建一个抽象类并声明一个抽象方法,例如:

public long getPersistenceKey();

它返回一个对象的唯一持久键。并在将信息保存在抽象类中的代码中使用此方法调用。

在您的自定义应用程序中使用的子类中,只需为每个产品使用不同的值覆盖此方法。而且不会再有冲突了。

希望这可以帮助。

于 2014-08-14T08:17:55.237 回答