提高混合应用本地存储的弹性

问题描述 投票:0回答:1

我已经开发了已在IOS,Android和Chrome运行得相当好5年以上的混合移动应用程序。我的应用程序使用一个索引资料数据库,维护应用程序的状态,并保存它重新启动之间,但也有一些情况下,IOS可以清除IndexedDB的特别是如果该客户端设备上的内存运行低。

我想就如何使用iOS设备上的本地SQL数据库,以提高我的应用程序的恢复能力的基础上,有望期望保持索引资料的平行副本IOS不会随意决定以清除内部的一些帮助SQL数据库属于应用程序。

我知道如何在目标C和Javascript之间的双向沟通​​,但我没有在目标C foggiest知道如何:

  1. 在应用中创建文件系统的SQL数据库
  2. 选择在哪里SQL数据库放在应用程序文件系统
  3. 如何写一个新的键值对数据库
  4. 在覆盖数据库中的现有键值对
  5. 读回数据库中的所有键值对(我预计可能有多达这些在实践中1000),并通过这些有效的回JavaScript代码。
  6. 清除数据库并重新开始。

任何指针有用的资源就如何实现这一目标或更好的编码例子将是非常赞赏。

我只是想,我没有使用科尔多瓦或任何其他类似的应用程序开发环境,所以请不要认为一个SQLite插件,是一个更大的环境的一部分来添加。我已经得到了我与一个定制的编码方法,即,我想保持这种方式。

ios sqlite hybrid-mobile-app indexeddb
1个回答
0
投票

我已经探讨了并联每个索引资料保存到与希望的iOS应用的文档文件夹的文件的写,这是不太可能比缓存文件夹被抹去的想法。

在每次IndexedDB的setItem一键 - 值对我传递给Objective-C的iOS应用程序代码的请求创建与应用程序的文档文件夹中创建子文件的文本文件,名为“key'.txt和内容设定值。

在每次索引资料的removeItem,我传递给Objective-C的iOS应用程序代码的请求删除相应文本文件“key'.txt。

在每次IndexedDB的clearAll,我删除上面创建的整个子文件夹。

现在,当应用程序启动并发现一个空localForage数据库,我传递给Objective-C的iOS应用程序代码的请求,以测试是否子文件夹关键项是有或没有。

如果不是,那么这是一个新的安装应用程序,并继续正常的这种情况。

如果是,那么这就是已被删除的索引资料数据库的情况。

在这种情况下,我要求客观-C IOS应用代码,使其回到设定键,通过检查上面创建的文件夹的内容和剥离中的.txt位和的IOS模拟器忽略DS_Store文件的情况下。

一个接一个,然后我要求每个密钥文件的内容,并回它们加载到前面空localForage数据库,并在这项工作已经完成,我可以继续,如果它没有被删除。

我发现,这是必要的,要求每个值,以防止恢复大型数据库时调用堆栈超出误差之前先使用零超时时间在JavaScript。

这种做法似乎工作,我可以使用Safari开发资源选项卡行动,以清除数据库,然后手动重新启动应用程序测试此的任何时间。使用相同的标签,你可以看被重新填充IndexedDB的数据库。

由于我的数据库的大小,其实我创建了一组不同类型的键的子文件夹,这样我就可以选择在其中被还原的数据库项目的顺序,尤其是我的应用程序常常起死回生的背景下面一个显著的位置变化,在这种情况下,没有对应用程序给予多久做这样的复苏强加的最大时间限制。这种结构设计当然是可选的,并且只需要大型数据库。

下面的说明是谁想要尝试这种方法,并在XCode中使用10.1 Objective C的假设

  1. 使用NSHomeDirectory()和stringByAppendingPathComponent @“文档”得到的文档文件夹。
  2. 使用stringByAppendingPathComponent创建的键子文件夹的子文件夹路径。
  3. 使用fileExistsAtPath检查键子文件夹是否已经存在
  4. 如果它不使用createDirectoryAtPath。
  5. 当保存或IndexedDB的改变项目使用stringByAppendingPathComponent来创建例如密钥文件名路径Base.txt为“基地”的关键。
  6. 使用fileHandleforWritingAtPath得到文件句柄的文件
  7. 如果文件句柄不存在,则需要使用将writeToFile创建“关键”的文件来创建它
  8. 如果文件句柄确实存在,那么truncateFileAtOffseyt:0(重要)将其清除,然后用写数据来创建“关键”文件的新版本。
  9. 在上述两种的指定UTF8编码。
  10. 当从IndexedDB的移除项做同样拿到钥匙文件的路径,然后使用removeItemAtPath。
  11. 该装置可通过去除使用removeItemAtPath整个子文件夹被清除。
  12. 还原过程使用contentsOfDirectoryAtPath读取键组在子文件夹中。
  13. 每个项目的恢复过程使用stringWithContentsOfFile读取数据文件并返回用来stringByEvaluatingJavaScriptFromString呼叫引号括起来的内容

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.