代码之家  ›  专栏  ›  技术社区  ›  Steve Brooker

增强混合应用程序中本地存储的恢复能力

  •  0
  • Steve Brooker  · 技术社区  · 7 年前

    我了解如何在Objective C和Javascript之间双向通信,但我对Objective C中如何:

    1. 在应用程序文件系统中创建SQL数据库
    2. 选择SQL数据库在应用程序文件系统中的位置
    3. 如何将新的键值对写入数据库
    4. 覆盖数据库中现有的键值对
    5. 清除数据库并重新启动。

    任何关于如何实现这一点的有用资源或更好的代码示例的指针都将非常感激。

    我只想补充一点,我没有使用Cordova或任何其他类似的应用程序开发环境,所以请不要建议一个SQLite插件,这是一个更大的环境的一部分。我已经用定制的编码方法达到了我现在的水平,我想保持这种方式。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Steve Brooker    6 年前

    我已经探讨了将每个indexedDB保存与对IOS应用程序Documents文件夹中的一个文件的写入并行的想法,希望这样做比Caches文件夹更不容易被擦除。

    在每个带有键值对的indexedDB setItem之后,我向objective-C IOS应用程序代码传递一个请求,在用app Documents文件夹创建的子文件夹中创建一个文本文件,名称为“key”.txt,内容设置为value。

    在每个indexedDB removeItem之后,我向objective-C IOS应用程序代码传递一个请求,以删除相应的文本文件“key.txt”。

    在每个indexedDB clearl之后,我删除上面创建的整个子文件夹。

    现在,当应用程序启动并发现一个空的localfourge数据库时,我将一个请求传递给objective-C IOS应用程序代码,以测试是否存在包含关键项的子文件夹。

    如果是,则这是indexedDB数据库已被删除的情况。

    然后我一个接一个地请求每个密钥文件的内容,并将它们重新加载到以前空的localfouge数据库中,当这一切完成后,我可以继续,就像它没有被删除一样。

    我发现在请求每个值之前,必须在javascript中使用零持续时间超时,以防止在恢复大型数据库时出现调用堆栈超出的错误。

    由于数据库的大小,我实际上创建了一组不同类型密钥的子文件夹,以便我可以选择数据库项恢复的顺序,尤其是我的应用程序经常在发生重大位置变化后在后台恢复正常,在这种情况下,对应用程序进行恢复的时间有限制。当然,这种优化是可选的,只有大型数据库才需要。

    下面的注释适用于那些想尝试这种方法并假设在Xcode10.1中使用Objective C的人

    1. 使用NSHomeDirectory()和stringByAppendingPathComponent@“Documents”获取Documents文件夹。
    2. 使用stringByAppendingPathComponent为keys子文件夹创建子文件夹路径。
    3. 使用fileExistsAtPath检查keys子文件夹是否已经存在
    4. 如果没有,请使用createDirectoryAtPath。
    5. 使用fileHandleforWritingAtPath获取文件的文件句柄
    6. 在上述两种情况下,请指定UTF8编码。
    7. 还原过程使用contentsOfDirectoryAtPath读取子文件夹中的密钥集。
    8. 每个项的还原过程使用stringWithContentsOfFile读取数据文件,并通过调用stringByEvaluatingJavaScriptFromString返回引号中包含的内容