使用 SQLite 开发 AIR 应用程序的最佳实践

2023-11-30

我将开始做几个 Adob​​e AIR 项目,这些项目将使用SQLite提供的功能AIR。由于这是我第一次尝试这样做,我希望得到一些指导、技巧和开发最佳实践。

由于此应用程序将访问本地数据库,因此我想我可以在应用程序启动时打开与数据库的连接,并保持它打开直到应用程序关闭。这是在这里使用的正确方法吗?

如果我使用像这样的 MVC 框架,应该如何设计我的应用程序Mate or Cairngorm?

我是否应该创建一些包装类来执行数据库操作,以便我可以在其他项目中重用它?期待一些有价值的信息...


您必须做出的第一个也是迄今为止最重要的决定是您是否要同步或异步访问该数据库。它们各有优缺点,所以这取决于您的情况。

同步

  • 更简单的架构
  • 更容易阅读
  • 更适合小型运营
  • 执行操作时冻结应用程序

适合小型应用程序

异步

  • 更复杂的架构
  • 更难读
  • 长时间操作不会冻结 UI
  • 如果您必须与服务器数据库同步,您可以为本地和远程数据库服务创建一个接口(例如类LocalUserService and RemoteUserService两者都实现了一个接口,迫使它们有一个方法saveUser())

适合大型应用程序以及同步本地和远程数据。

我倾向于几乎总是选择异步方法 - 因为它更灵活 - 并将复杂性抽象到......包装类中。这回答了你问题的那一部分。

建筑学

我不喜欢框架,所以我无法回答你的问题Mate或-颤抖-Cairngorm。但我认为这是一个相当好的方法:

  • 对于模型中的每个实体,创建一个数据访问对象 (DAO),该对象将仅返回原始查询结果(例如UserDAO用于查询用户)。该类应该只包含查询。
  • 匹配每个 DAO 创建一个 Builder/Factory,它可以获取这些查询结果并生成模型对象(例如 UserBuilder)
  • 这通常对我来说就足够了,但是您也可以将它们两者放在一个服务层中(例如 UserService)。此服务层还可能有助于将现有远程服务层与本地服务相匹配。

至于保持连接打开。我一直都是这样做的,而且从来没有遇到过任何问题。我不太清楚当应用程序崩溃并且连接未正确关闭时会发生什么,但这不是我们谈论的 Oracle 或 SQL Server。我不认为 SQLite 会保留打开的指针或其他东西,因为它只是一个简单的文件,但我可能是错的。

Edit:有关 DAO / Factory 模式的更多详细信息(根据 OP 的要求)。

具有一个函数的 UserDAO 示例:

public class PupilDAO extends AsynchronousDAO {

    public function getUserById(id:int, handleResult:Function):Responder {
        return getResults(
            "SELECT * FROM user WHERE user_id = ?", 
            handleResult, [id]
        );
    }

}

正如你所看到的,我已将复杂性抽象为AsynchronousDAO基类,因此我们只能在 UserDAO 中看到必要的信息。这handleResultfunction 是一个回调,每当查询准备好时就会调用它,并将结果集作为参数传递。我们通常会将该结果集传递到工厂/构建器类中。

UserBuilder 的示例:

public class UserBuilder {

    public function buildUser(record:*):User {
        var user:User = new User();
        user.id = record.user_id;
        user.firstname = record.firstname;
        user.lastname = record.lastname;
        return user;
    }

}

这显然是一个简单的示例,但您可以在构建器中创建更复杂的数据结构。有关工厂模式和构建器模式之间差异的一些信息,我推荐 Google。

现在让我们将它绑定到服务类中:

public class UserService {
    private var dao:UsetDAO;
    private var builder:UserBuilder;

    public UserService(dao:UserDAO, builder:UserBuilder) {
        this.dao = dao;
        this.builder = builder;
    }

    public function getUserById(id:int, handleResult):void {
        var handleResultSet:Function = function(resultSet:SQLResult):void {
            var user:User = builder.buildUser(resultSet.data[0]);
            if (handleResult!= null) handleResult(user);
        }

        dao.getUserById(id, handleResultSet);            
    }

}

最后,让我们使用这三重奏:

var userService = new UserService(new UserDAO(), new UserBuilder());
userService.getUserById(1, handleUser);

function handleUser(user:User):void {
    trace(user);
}

对于这个例子,我用以下方法构建了类new并将 dao 和构建器作为构造函数参数传递,但您可以使用注入或单例或您喜欢的任何框架来为您进行构造。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SQLite 开发 AIR 应用程序的最佳实践 的相关文章

  • 仅当 id 不存在时插入

    好的 我们有一个 Phonegap 应用程序 其表格设置如下 tblTest actualid INTEGER PRIMARY KEY id INTEGER name TEXT 实际 ID 是设备的唯一 ID 该 ID 维护在服务器端数据库
  • Random.Next() 的 Actionscript 3 实现

    我想知道 AS 3 中是否有很好的 Random Next 实现 基本上想要生成一系列给定种子的随机数 有时 最小和最大限制 类似于 C System Random 类 Random random new Random return ran
  • 将日期转换为 UTC 的正确方法

    如果这个问题没有多大意义 我很抱歉 但我是 Actionscript 的新手 并且想知道您是否可以帮助我解决这个问题 我正在构建一个给定时区的应用程序 告诉您该位置的时间 当我使用时区为 GMT UTC 的位置时 它效果很好 但如果主机上的
  • 在类之间调度事件

    我有一个自定义事件类 public class FFTDrawEvent extends Event public static const DRAW EVENT String drawEvent private var param Arr
  • 从 Linux bash 解析 FB-Purity 的 Firefox idb(索引数据库 API)object_data blob

    我想从 Linux bash 脚本中读取由名为 FB Purity 的特定 Firefox 插件存储的结构化数据 我找到了一个名为 mozilla firefox b8eab5j0 default storage default moz e
  • 如何准备sql语句并绑定参数?

    不幸的是 文档 http www sqlite org完全缺乏示例 这真的很奇怪 就好像它假设所有读者都是优秀的程序员一样 然而 我对C 并且无法真正从文档中弄清楚如何真正准备和执行语句 我喜欢它的实施方式PDO for PHP 通常 我只
  • 如何更改Python使用的SQLite版本?

    我在 Debian 9 12 上安装了 Python 3 8 和 SQLite 3 16 2 并且需要升级到较新版本的 SQLite 我已经下载并编译了 SQLite 网站上提供的合并 并将其放入 usr bin 所以当我这样做时 sqli
  • 可以使用两个独立的 SQLite 数据库吗?

    我有一个 sqlite 数据库 其中存储用户定义的信息和用户只读的信息 我觉得将来可能需要修改只读信息 并且我不想进行整个数据迁移 有没有一种方法可以使用单独的 sqlite 数据库来存储只读信息 该数据库可以轻松替换 如果是这样 您能否就
  • 如何在SQLite中的两个表之间复制数据?

    我有两个具有不同列的表 如下所示 table1 id title name number address table2 id phone name address 如何将数据 名称 地址 从表 1 复制到表 2 我的问题有两种情况 第一 t
  • 如何找到查询结果的大小

    我在 Rails 中有以下查询 records Record select y id source where source gt source y id gt y id group y id source having count 1 如
  • 游标在“查询、删除表、创建表、查询相同表名”后返回相同的列

    例如我有一个名为myTable在我的数据库文件中 Android ps它不支持列重命名 删除等 这张表有idx name columns 我想删除并重新创建该表 但使用新列 我是这样做的 db transaction var cursor
  • 具有多个 sqlite 文件的核心数据

    如何将 Core Data 与多个 SQLite 文件一起使用 每个文件都包含相同的结构 但数据是从不同的位置检索的 我希望能够在运行时根据应用程序设置在这些 sqlite 文件之间切换 当然 只需指向持久存储协调器 NSPersisten
  • 修改sqlite3中的列类型

    我对 SQLite 3 还很陌生 现在我必须向现有的表中添加一列 我开始这样做 ALTER TABLE thetable ADD COLUMN category 当然 我忘记指定该列的类型 我想做的第一件事就是删除该列 然后重新添加它 然而
  • python 没有名为serial的模块

    我的 python 程序有问题 我编写了程序来将数据 温度 从 arduino 获取到我的树莓派 sqlite 数据库 但它在第 4 行 导入串行 处给了我一个错误 提示 ImportError 没有名为串行的模块 我使用 python3
  • app.doScript 和 $.evalFile 之间有什么区别?

    到目前为止我发现的唯一区别 如果运行的脚本app doScript返回错误 错误的文件和行号被错误的文件和行号覆盖app doScript call 还有其他我应该了解的差异吗 以下是演示上述差异的示例代码 首次运行 InDesign c
  • 在 ActionScript 3 中在形状上绘制文本

    有没有办法仅使用 ActionScript 在 DisplayObject 或 Shape 中绘制文本 我在网上找到的唯一方法是创建 TextField 但我无法将 TF 添加到 DisplayObject 或 Shape Edit 解决了
  • 如何解决 greenDAO 在执行 InsertOrReplace 时“不存在这样的表错误”?

    我正在使用 greenDAO 并且已成功生成所有必需的类和实体 并且我可以看到我的表已创建 但是在要替换的行上放置断点后 我收到一条错误消息 告诉我 不存在这样的表错误 try appTimeUsageDao insertOrReplace
  • 如何确保与 sqlite 和 NFS 的文件安全同步

    我最近将应用程序的工作区文件格式转换为 sqlite 为了确保 NFS 上的稳健操作 我使用了通用更新策略 对本地硬盘上临时位置中存储的副本进行了所有修改 仅在保存时 我才会通过使用临时文件复制原始文件来修改原始文件 可能在 NFS 上 我
  • 将数组从 Flash (AS3) 发送到 JavaScript

    是否可以使用ExternalInterface 调用将数组从Flash AS3 发送到JavaScript 我目前正在 Flash 内的 foreach 循环中多次调用一个函数 但速度太快 JavaScript 无法跟上 我的想法是创建一个
  • 使用ExternalInterface和IE从JavaScript获取Flash中的当前URL

    我正在尝试获取 Flash 播放器当前所在的 URL 不是 swf 文件的 URL 而是浏览器指向的 URL 到目前为止我已经使用过 var st String ExternalInterface call window location

随机推荐

  • Java 中的两个类之间如何使用接口进行通信?

    嗨 我一直在这里阅读一些类似的主题 但没有一个回答我的问题 有人说你甚至不能这样做 这不是一件好事 因为在这种情况下我无法完成我的课程 这是一些简单的代码 将每个块视为一个单独的类 public interface Interface vo
  • 在 R 中循环文件

    我正在使用 R 来计算文件中列的平均值 如下所示 R file1 read table x01 mean file1 V4 然而 我没有构建涉及 R 的循环的经验 仅使用 bash 我如何将其转换为一个循环 对文件夹中的每个文件执行此操作
  • file_get_contents() 是否使用缓存?

    如果我写 mypage file get contents www mywebsite com mypage htm 我第一次运行该脚本时 file get contents 肯定会向 www mywebsite com 发出 mypage
  • 学习 C++ 语言 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我是一名 net c 程序员 但我也想学习 NET C 我是 c 的初学者 有没有从初学者到专家的网站 书籍或视频教程 不存在 Net c 这样的东西 也许你的意思是C CLI 这是
  • 混合模式 C++/CLI 性能注意事项 - 最佳实践

    我有一个 C CLI 库 它调用许多本机 C 方法 我读过许多线程 指出不应混合托管和非托管代码 我找不到任何说明如何避免这些开关以及为什么它会导致性能问题的信息 有人可以分享最佳实践吗 使用 C CLI 的唯一原因是它支持混合托管代码和本
  • 如何每次迭代增加一个字母 N 次并存储在数组中?

    letter array for i A i ZZ i letter i print r letter 从上面的脚本我做了一个循环A B C D ZZ 现在 我想把它变成A C E G I ZZ 2步骤而不是1 我需要指导才能做到这一点 这
  • 在 Firebase 中加入两个节点

    我正在开发一个应用程序 它应该显示来自两个节点 Firebase 的数据 Firebase DB 的结构如下 College 4F2EAB65 id 4F2EAB65 name SomeCollege A3C2ED31 id A3C2ED3
  • pandas:将DataFrame最后一行除以第一行

    这个问题类似于Python Pandas 按第一行划分 DataFrame 我有一个数据框 如下所示 1125400 5430095 1095751 2013 04 02 98 91 NaN 5626 79 2013 04 03 99 29
  • 从 Java 执行 EXE 并从 EXE 获取输入和输出

    我有一个EXE file addOne exe它不断地从控制台上的用户输入一个整数 不是命令行参数 并输出整数 1到控制台上 示例输出如下所示 1 2 6 7 29 30 我正在尝试编写一个java程序 它可以 Run the EXE 不断
  • Swift 2 错误处理问题

    我正在使用 REST 获取 JSON 数据 然后解析它 为此 我使用 NSJSONObjectWithData 据我所知 该方法过去在其参数内有一个错误处理程序 但它不再存在 在我的代码中 let err NSError let optio
  • 自定义 Spring Security 应用程序中的无限循环

    我们尝试用现有的 Spring Security Basic Login 替换开源应用程序中的 REST API 以实现使用令牌的自定义登录 我读过这篇关于该主题的博文 http javattitude com 2014 06 07 spr
  • 将 HTML 实体转换为正确的字符 R

    有谁知道 r 中可以转换的通用函数 228 为其 unicode 字符 我见过一些函数 并将其转换为普通字符 任何帮助 将不胜感激 谢谢 编辑 下面是一条数据记录 我可能有超过100万条记录 除了将数据读入大量向量并针对每个元素更改记录之外
  • 由元组索引的 Python `dict`:获取饼图的一部分

    假设我有 my dict airport London Heathrow airport Tokyo Narita hipsters London Soho 什么是一种有效的 无需扫描所有键 而又优雅的方式来让所有机场脱离这本字典 即预期输
  • 避免 Android 中 EditText 的解析错误

    对于 stackoverflow 社区 我创建了这个方法来将一些 EditText 字段转换为双精度 我添加 if 语句专门是为了避免解析错误 因为我知道我的几个 EditText 字段将留空 然而 它们仍然在运行时不断出现 有人知道避免解
  • Scala 不可变变量和打印

    目前正在学习一个使用 Scala 的课程 我以前从未使用过它 因此语法和本身都是新的 我正在研究一个简单的除法函数 但遇到了一些错误 首先 我使用 var sub m 对吗 在我的代码中 我只是想做 m m n 但你无法更改变量 而且我不确
  • 使用 SAXParser 从 XML 检索 HTML 编码文本

    这是我第一次使用 SAXParser 我在 Android 中使用它 但我认为这对这个特定问题没有影响 并且我正在尝试从 RSS 提要中读取数据 到目前为止 它在很大程度上对我来说工作得很好 但是当它到达包含 HTML 编码文本的标签时 例
  • 如何在django中存储用户数组?

    我有一个 django 模型 它基本上是一个名为Contexts 它包含一些字段 例如name description和一个用户 下面是定义的模型 class Contexts models Model context name model
  • 如何比较三个预训练模型的余弦相似度?

    我有两个语料库 一个包含所有女性领导人的演讲 另一个包含男性领导人的演讲 我想测试这样一个假设 一个语料库中两个单词之间的余弦相似度与另一个语料库中相同两个单词之间的余弦相似度显着不同 这样的 t 检验 或等效的 合乎逻辑并且可能吗 此外
  • 在 Azure Function 中运行 .exe 可执行文件

    我有可执行文件 abcd exe 它包含 与许多 dll 合并 是否可以为 abcd exe 创建 Azure Function 并在 Azure Cloud Functions 中运行它 abcd exe 应用程序 System Diag
  • 使用 SQLite 开发 AIR 应用程序的最佳实践

    我将开始做几个 Adob e AIR 项目 这些项目将使用SQLite提供的功能AIR 由于这是我第一次尝试这样做 我希望得到一些指导 技巧和开发最佳实践 由于此应用程序将访问本地数据库 因此我想我可以在应用程序启动时打开与数据库的连接 并