我将开始做几个 Adobe AIR 项目,这些项目将使用 AIR
提供的 SQLite
功能。由于这是我第一次尝试这样做,我希望得到一些指导、技巧和最佳开发实践。
由于此应用程序将访问本地数据库,因此我想我可以在应用程序启动时打开与数据库的连接,并保持其打开状态直到应用程序关闭。这是在这里使用的正确方法吗?
如果我使用 Mate 或 Cairngorm 等 MVC 框架,应该如何设计我的应用程序?
我应该创建一些包装类来执行数据库操作,以便我可以在其他项目中重用它吗?期待一些有值(value)的信息...
最佳答案
您必须做出的第一个也是迄今为止最重要的决定是您是否要同步或异步访问该数据库。它们各有优缺点,所以这取决于您的情况。
同步
- 更简单的架构
- 更容易阅读
- 更适合小型企业
- 执行操作时卡住应用
适合小型应用
异步
- 更复杂的架构
- 难以阅读
- 长时间操作不会卡住 UI
- 如果您必须与服务器数据库同步,您可以为本地和远程数据库服务创建一个接口(interface)(例如,类
LocalUserService
和RemoteUserService
都实现一个接口(interface)这迫使他们有一个方法saveUser()
)
适合大型应用程序以及同步本地和远程数据。
我倾向于几乎总是选择异步方法 - 因为它更灵活 - 并将复杂性抽象到......包装类中。这回答了你问题的那一部分。
架构
我不喜欢框架,所以我无法回答您有关 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;
}
}
这显然是一个简单的示例,但您可以在构建器中创建更复杂的数据结构。有关工厂模式和构建器模式之间差异的一些信息,我推荐 Google。
现在让我们在服务类中将其绑定(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 和构建器作为构造函数参数传递,但您可以使用注入(inject)或单例或您喜欢的任何框架来为您进行构造。
关于actionscript-3 - 使用 SQLite 开发 AIR 应用程序的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7088605/