gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:41:05 25 4
gpt4 key购买 nike

我将开始做几个将使用 SQLite 的 Adob​​e AIR 项目。 AIR 提供的功能.由于这是我第一次尝试这样做,因此我将不胜感激一些指示、提示和最佳开发实践。

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

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

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

最佳答案

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

同步

  • 更简单的架构
  • 更易阅读
  • 更适合小型操作
  • 在执行操作时卡住应用程序

  • 适合小型应用程序

    异步
  • 更复杂的架构
  • 更难阅读
  • 长时间操作不会卡住 UI
  • 如果您必须与服务器 DB 同步,您可以为本地和远程 DB 服务创建一个接口(interface)(例如,类 LocalUserServiceRemoteUserService 都实现了一个强制它们使用方法 saveUser() 的接口(interface))

  • 适用于更大规模的应用程序以及同步本地和远程数据。

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

    架构

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

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

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

    编辑: 有关 DAO/工厂模式的更多详细信息(根据 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 中看到必要的信息。 handleResult 函数是一个回调函数,只要查询准备好就会调用它,并将结果集作为参数传递。我们通常会将该结果集传递给工厂/构建器类。

    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;
    }

    }

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

    现在让我们在服务类中将其绑定(bind)在一起:
    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 和 builder 作为构造函数参数传递,但您可以使用注入(inject)或单例或任何您喜欢的框架来为您构建。

    关于actionscript-3 - 使用 SQLite 开发 AIR 应用程序的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088605/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com