我将开始执行一些将使用SQLite
提供的AIR
功能的Adobe AIR项目。由于这是我第一次尝试这样做,我将非常感谢开发的一些提示,技巧和最佳实践。
由于这个应用程序将访问本地数据库,我想我可以在应用程序开始时打开与数据库的连接,并保持打开直到应用程序关闭。这是在这里使用的正确方法吗?
如果我使用的是Mate
或Cairngorm
等MVC框架,应如何设计我的应用程序?
我应该创建一些包装类来执行数据库操作,以便我可以在其他项目中重用它吗?期待一些有价值的信息...
答案 0 :(得分:5)
您必须做出的第一个也是最重要的决定是,您是要同步还是异步访问该数据库。他们都有利弊,所以这取决于你的情况。
<强>同步强>
适合小规模应用
<强>异步强>
LocalUserService
和RemoteUserService
都实现了一个强制它们具有的接口方法saveUser()
)适用于大型应用并同步本地和远程数据。
我倾向于几乎总是选择异步方法 - 因为它更灵活 - 并且在...包装类中抽象出复杂性。所以这回答了你的部分问题。
<强>建筑强>
我不喜欢框架,因此我无法回答您关于Mate
或-shudder- Cairngorm
的问题。但这是我认为相当不错的方法:
UserDAO
用于查询用户)。该类应仅包含查询。至于保持连接打开。我一直这样做,从来没有遇到任何问题。我不确切知道当应用程序崩溃并且连接没有正确关闭时会发生什么,但这不是我们正在讨论的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;
}
}
这显然是一个简单的示例,但您可以在构建器中创建更复杂的数据结构。有关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);
}
}
最后,让我们使用三重奏:
var userService = new UserService(new UserDAO(), new UserBuilder());
userService.getUserById(1, handleUser);
function handleUser(user:User):void {
trace(user);
}
对于示例,我使用new
构造了类并将dao和构建器作为构造函数参数传递,但您可以使用注入或单例或任何您喜欢的框架为您构建。