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

mid*_*nhk 2 air sqlite adobe actionscript-3

我将开始做几个将使用SQLite提供的功能的Adobe AIR项目AIR.由于这是我第一次尝试这样做,我将非常感谢开发的一些提示,技巧和最佳实践.

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

如果我使用像一个MVC框架应该如何设计我的应用程序MateCairngorm

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

RIA*_*tar 5

您必须做出的第一个也是最重要的决定是,您是要同步还是异步访问该数据库.他们都有自己的优点和缺点,所以这取决于你的情况.

同步

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

适合小规模应用

异步

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

适用于大型应用程序并同步本地和远程数据.

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

建筑

我不喜欢框架,所以我无法回答你关于Mateor -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]
        );
    }

}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已经将复杂性抽象到AsynchronousDAO基类中,因此我们只能在UserDAO中看到必要的信息.该handleResult函数是一个回调函数,只要查询准备好就会调用它,并将结果集作为参数传递.我们通常会将结果集传递给factory/builder类.

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

}
Run Code Online (Sandbox Code Playgroud)

这显然是一个简单的示例,但您可以在构建器中创建更复杂的数据结构.有关Factory和Builder模式之间差异的一些信息,我建议使用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);            
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

function handleUser(user:User):void {
    trace(user);
}
Run Code Online (Sandbox Code Playgroud)

对于示例,我构造了类new并将dao和构建器作为构造函数参数传递,但您可以使用注入或单例或任何您喜欢的框架来为您构建构造.