如何将几个应用程序的数据存储在一个地方?
How can I store data of the few applications in one place?
我在同一个引擎上构建了多个应用程序。该引擎将数据存储在 SQLite 中。所有应用程序的数据库结构都是相同的。我需要为所有这些应用程序组织一个公共存储。
例如,有一个应用程序A和B。首先用户安装了应用程序A并添加了数据,然后安装了应用程序B,这是同步这两个应用程序的数据库所必需的。使用 Content Providers 的功能将不起作用,因为在这种情况下,如果没有应用程序 A,应用程序 B 将无法运行。而且我们也不知道用户首先安装了哪个应用程序。
有一个同步所有应用程序数据库的想法,每个应用程序将保留其自己的数据库,但我将拥有数据库的副本。意味着安装的应用程序数量与我将拥有的数据库副本数量一样多。
也许有某种巧妙的方法可以实现这个想法?
为什么不尝试在所有应用中使用 "sharedUserId"。有了它,您也可以访问其他应用程序的数据。
假设您已经知道所有其他应用程序,在第一次加载每个应用程序时,您会开始搜索创建数据库的公共文件夹。该文件夹可以在您的 SD 卡中。如果在那里找到 DB 文件,则可以打开并使用它。否则你创建一个。然后在所有应用程序中使用相同的数据库?
我不确定 opening/writing 对来自不同应用程序的同一个数据库有什么影响。也许您需要找出一种在写入期间锁定机制的方法(也许在写入数据库时创建一个 .lock 文件?)
您可以将数据库存储在外部存储器上并从您的所有应用程序访问它(使用 getExternalStorageDirectory
)。
使用 openOrCreateDatabase
method of the SQLiteDatabase
class 访问它并从中获取 read/write 数据。
由于从多个进程访问可能导致锁定,我建议您使用带有锁定应用程序 name/packagename 的文件自行管理,这样您就可以在应用程序之间同步数据访问。
我遇到了同样的设计问题(使用相同引擎的多个应用程序包含持久的 SQLite 数据库表、服务和大量逻辑)。
在我自己研究之后,我恐怕得出的结论是唯一的方法是:按照Googles的方式:
Google Play Services 是 google 专门为解决他们自己的场景的这个问题而设计的过程 - 应该始终对所有应用程序(包括他们自己的应用程序)可用的引擎。这意味着 它是一个独立的应用程序,向所有应用程序公开它的服务和内容提供者。
Google 强制 Google 通过 Google Play 商店应用在后台无缝安装 Play 服务。这是其他应用程序无法拥有的特权,因为它们控制着这两个应用程序以及 OS Android 本身(不公平!)
所以,如果您可以强制您的用户只为您的引擎下载专用应用程序(就像 Google 那样)- 太棒了!
如果没有 - 那么您将不得不在那之前解决必须安装的 Master/primary 应用程序,并且它是唯一将数据和服务公开给所有其他应用程序的应用程序。
我在同一个引擎上构建了多个应用程序。该引擎将数据存储在 SQLite 中。所有应用程序的数据库结构都是相同的。我需要为所有这些应用程序组织一个公共存储。
例如,有一个应用程序A和B。首先用户安装了应用程序A并添加了数据,然后安装了应用程序B,这是同步这两个应用程序的数据库所必需的。使用 Content Providers 的功能将不起作用,因为在这种情况下,如果没有应用程序 A,应用程序 B 将无法运行。而且我们也不知道用户首先安装了哪个应用程序。
有一个同步所有应用程序数据库的想法,每个应用程序将保留其自己的数据库,但我将拥有数据库的副本。意味着安装的应用程序数量与我将拥有的数据库副本数量一样多。
也许有某种巧妙的方法可以实现这个想法?
为什么不尝试在所有应用中使用 "sharedUserId"。有了它,您也可以访问其他应用程序的数据。
假设您已经知道所有其他应用程序,在第一次加载每个应用程序时,您会开始搜索创建数据库的公共文件夹。该文件夹可以在您的 SD 卡中。如果在那里找到 DB 文件,则可以打开并使用它。否则你创建一个。然后在所有应用程序中使用相同的数据库?
我不确定 opening/writing 对来自不同应用程序的同一个数据库有什么影响。也许您需要找出一种在写入期间锁定机制的方法(也许在写入数据库时创建一个 .lock 文件?)
您可以将数据库存储在外部存储器上并从您的所有应用程序访问它(使用 getExternalStorageDirectory
)。
使用 openOrCreateDatabase
method of the SQLiteDatabase
class 访问它并从中获取 read/write 数据。
由于从多个进程访问可能导致锁定,我建议您使用带有锁定应用程序 name/packagename 的文件自行管理,这样您就可以在应用程序之间同步数据访问。
我遇到了同样的设计问题(使用相同引擎的多个应用程序包含持久的 SQLite 数据库表、服务和大量逻辑)。
在我自己研究之后,我恐怕得出的结论是唯一的方法是:按照Googles的方式:
Google Play Services 是 google 专门为解决他们自己的场景的这个问题而设计的过程 - 应该始终对所有应用程序(包括他们自己的应用程序)可用的引擎。这意味着 它是一个独立的应用程序,向所有应用程序公开它的服务和内容提供者。
Google 强制 Google 通过 Google Play 商店应用在后台无缝安装 Play 服务。这是其他应用程序无法拥有的特权,因为它们控制着这两个应用程序以及 OS Android 本身(不公平!)
所以,如果您可以强制您的用户只为您的引擎下载专用应用程序(就像 Google 那样)- 太棒了!
如果没有 - 那么您将不得不在那之前解决必须安装的 Master/primary 应用程序,并且它是唯一将数据和服务公开给所有其他应用程序的应用程序。