要完成本课,必须在计算机上安装 SQL Anywhere。如果在本课过程中收到任何错误或警告,请确保您已正确配置安装并且设置了恰当的环境变量。
既然 Names 应用程序可从 UltraLite 数据库添加和删除名称,现在需要向计算机上的统一数据库添加同步。
打开 Sybase Central。
从 [工具] 菜单单击 [SQL Anywhere 12] » [创建数据库]。
在 [欢迎] 屏幕和 [选择位置] 屏幕上单击 [下一步]。
选择保存数据库文件的位置,将其命名为 Names.db。单击 [完成]。
其它选项可保持缺省状态。
创建数据库后,关闭弹出窗口。
要实现同步,首先需要在统一数据库上创建表:
如果左侧选项为 [任务] 或 [搜索],通过从 [视图] 菜单单击 [文件夹],将其更改为 [文件夹]。
在 [文件夹] 窗格中,按住 Ctrl 键同时单击 Names 数据库下的 [表] 元素,并单击 [新建] » [表]。
将表命名为 Names,然后单击 [完成]。
这将创建表,并使游标准备好命名表的主键列。
将表的主键列命名为 id ,类型为 uniqueidentifier。
在 [值] 标题下单击 [...] 按钮,然后将缺省值设置为 [用户定义的值]:NEWID()。
确保 [字符串] 选项未选中,然后单击 [确定]。
在工具栏上单击 [新建列] 按钮,添加另一列。
将新列命名为 name ,类型为 VARCHAR,大小为 254。
对 name 列清除 [空值] 选项标记。
对 name 列单击 [唯一] 选项。
在工具栏上单击 [保存] 按钮。
断开与数据库的连接。
为了设置 MobiLink,系统必须为统一数据库提供 ODBC 数据源。在可以设置 ODBC 数据源之前,必须首先安装 SQL Anywhere ODBC 驱动程序:
打开一个终端。
运行以下命令获取 SQL Anywhere 配置文件:
source ./sa_config.sh |
获取配置文件允许您使用 dbdsn 实用程序。
运行以下命令创建 ODBC 数据源:
dbdsn -w "Names" -c "UID=dba;PWD=sql;DBF=/Users/user/Names.db" |
如果数据库的位置与此不同,请确保更新 DBF 选项。
要使 MobiLink 执行同步,需要配置同步脚本。为了简化配置,Sybase Central 提供了用于许多常用同步形式的脚本模板。
启动 Sybase Central。
在 [工具] 菜单下单击 [MobiLink 12] » [新建项目]。
将项目命名为 NamesProject,然后单击 [下一步]。
选中 [将统一数据库添加到项目]。提供 NamesCondb 的 [数据库显示名称]。提供 UID=dba;PWD=sql;DSN=Names
的连接字符串。还可以通过单击 [编辑] 按钮来构建此字符串。单击 [下一步]。
单击 [创建新模型],然后单击 [下一步]。
单击 [将远程模式名称添加到项目],输入名称,然后在选择 [UltraLite 模式] 后,单击 [完成]。
将询问您是否希望安装 MobiLink 系统设置。此远程模式实际未使用,但由于远程模式在 iPhone 上,所以此选项最简单。
将出现一条消息,显示 MobiLink 未安装,并询问是否立即安装。单击 [是]。
这将在数据库中创建 MobiLink 所需的表,以及一些已保存的过程。
键入 NamesModel 作为模型名称,然后单击 [下一步]。
单击全部三个复选框以确认 MobiLink 要求,然后单击 [下一步]。
为了使同步正确运行,MobiLink 假定了表主键的若干情况。由于 Names 应用程序已符合这些假定,因此不需要更改。
单击 [NamesCondb] 统一数据库并单击 [下一步]。
单击 [否,新建一个远程数据库模式] 并单击 [下一步]。
从表的列表中选中 Names 表,并单击 [下一步]。
列出的其它所有表由 MobiLink 在后台使用,因而同步时可安全忽略。
对于 [下载类型],单击 [基于时间戳的下载]。
此选项提供同步的良好缺省实现,仅同步上次同步以来发生的更改。因为不会传输不必要的数据,此选项可节省用于 iPhone 的带宽。
由于其它所有设置应保留为缺省状态,所以应单击 [完成]。
如果想要其它选项作为 MobiLink 的模板提供,可以单击执行向导中的所有步骤。
既然已创建同步模型,则在左侧的 [文件夹] 视图中应该可以看见同步模型。如果未显示 [文件夹] 视图,则单击 [视图] » [文件夹]。
部署同步模型:
在 [文件夹] 视图中按住 Ctrl 键的同时单击 [NamesModel],然后单击 [部署]。
清除 [删除数据库和同步客户端],保持选中 [统一数据库] 和 [MobiLink 服务器],然后单击 [下一步]。
单击 [将更改保存到以下 SQL 文件中] 和 [连接到统一数据库以便直接应用更改],并在列表中选择 NamesCondb。单击 [下一步]。
如果出现提示,则接受创建新目录。
输入 MobiLink 用户和口令。
MobiLink 用户与 SQL Anywhere 数据库用户不同。您应当使用与 dba 不同的用户名。本教程分别使用 "user" 和 "password"。这些值将在教程后面的内容中使用。
确保 [在统一数据库中注册此用户以进行 MobiLink 验证] 已选中,并单击 [完成]。
如果出现提示,则接受创建新目录。
一旦部署窗口显示部署完成,则单击 [关闭] 将其关闭。
既然已部署同步模型,统一数据库中将包含 MobiLink 运行所需的全部信息。部署还创建了用于启动 MobiLink 服务器的脚本:
打开一个终端。
将 "终端" 会话导航至部署保存启动脚本的位置。缺省情况下,其应该为:~/NamesProject/NamesModel/mlsrv。
确保脚本是可执行文件:
chmod u+x NamesModel_mlsrv.sh |
启动 MobiLink 服务器:
./NamesModel_mlsrv.sh "DSN=Names" |
现在拥有了带有运行中 MobiLink 服务器的统一数据库。
要使应用程序能对其同步,首先需要启用同步。在 [DataAccess] 类的 [openConnection] 方法中,在包含数据库创建 (ULDatabaseManager::Init) 的 [ if-block] 后面添加以下行:
ULDatabaseManager::EnableTcpipSynchronization(); |
既然数据库期望进行同步,可将以下方法添加到 DataAccess 类。另将方法签名添加到头文件。
- (void)synchronize { NSString * result = nil; ul_sync_info info; // Initialize the sync info struct connection->InitSyncInfo(&info); // Set the sync parameters info.user_name = (char*)"user"; // Set to your username info.password = (char*)"password"; // Set to your password info.version = (char*)"NamesModel"; info.stream = "tcpip"; info.stream_parms = (char*)"host=localhost"; // Display the network activity indicator in the status bar [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES]; // Sync and get the result if (connection->Synchronize(&info)) { result = @"Sync was successful."; } else { // Get the error message and log it. char errorMsg[80]; connection->GetLastError()->GetString(errorMsg, 80); NSLog(@"Sync failed: %s", errorMsg); result = [NSString stringWithFormat:@"Sync failed: %s", errorMsg]; } // Stop showing the activity indicator [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO]; [[[[UIAlertView alloc] initWithTitle:@"Synchronization" message:result delegate:nil cancelButtonTitle:nil otherButtonTitles:@"OK", nil] autorelease] show]; } |
这是客户端可执行的最简单同步。在企业应用程序中,可能想要设置回调方法来获取同步的进度,并且在单独的线程上执行同步,以避免阻塞应用程序。
此外,在当前的实现中,同步在主事件线程上出现。建议不要以这种方式阻塞主线程。在下一课中,您将使用单独的线程来执行同步,并添加回调方法以观察同步和显示进度。
要使用户能选择何时同步,请在导航栏中添加一个按钮。按下该按钮将在 [RootViewController] 中调用以下方法:
- (void)sync { [[DataAccess sharedInstance] synchronize]; [self.tableView reloadData]; } |
要创建按钮,将以下内容添加到 RootViewController 的 viewDidLoad 方法:
// Little button with the refresh sign on the left in the nav bar self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(sync)]; |
您现在可以构建并运行应用程序。不管何时按下 [Refresh] 按钮,iPhone 上的数据库都将与统一的 SQL Anywhere 数据库同步。
同步前,需要向统一数据库插入数据并在 iPhone 中进行查看,或是在 iPhone 中插入数据以在统一数据库中进行查看。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |