我目前正在使用 Flex 4.5.1 开发 Android 应用程序,但在尝试将存储在 SharedObject 数组中的数据传递给我的 Web 服务以进行数据库查询时遇到问题。下面的代码显示了我如何将数据存储在 SharedObject 中:
var so:SharedObject = SharedObject.getLocal("app");
public var prefsArray:ArrayCollection = new ArrayCollection(so.data.prefs);
protected function prefs_btn_click(event:MouseEvent):void
{
prefsArray.source.push(getFrsByIDResult.lastResult.id);
so.data.prefs = [prefsArray];
var flushStatus:String = so.flush();
if (flushStatus != null) {
switch(flushStatus) {
case SharedObjectFlushStatus.PENDING:
so.addEventListener(NetStatusEvent.NET_STATUS,
onFlushStatus);
break;
case SharedObjectFlushStatus.FLUSHED:
trace("success");
break;
}
}
}
protected function onFlushStatus(event:NetStatusEvent):void
{
trace(event.info.code);
}
我已经测试了 SharedObject 以查看信息是否正确输入,并且一切似乎都很好。现在我使用下面的代码从 SharedObject 中检索数据并尝试将其发送到 PHP Web 服务以运行 DB 查询。
var so:SharedObject = SharedObject.getLocal("app");
var arrCol:ArrayCollection = new ArrayCollection(so.data.prefs);
var str:String = new String(arrCol.toString());
protected function list_creationCompleteHandler(event:FlexEvent):void
{
getPrefsByprefIdsResult.token = prefsService.getPrefsByPrefIds(so.data.prefs);
}
我已经在 Flex 中测试了 Web 服务,并将其配置为接收一个 Int 数组(int[]),并且当我使用两个虚拟值对其运行测试操作时它可以工作。但是,当我尝试使用上面的代码向 Web 服务传递共享对象数据时,我收到此错误:
TypeError: Error #1034: Type Coercion failed: cannot convert []@97e97e1 to mx.collections.ArrayCollection.
at views::**************/list_creationCompleteHandler()[C:\Users\Jack\Adobe Flash Builder 4.5\****************\src\views\*******************.mxml:25]
at views::*********************/__list_creationComplete()[C:\Users\Jack\Adobe Flash Builder 4.5\****************\src\views\***************.mxml:94]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:13128]
at mx.core::UIComponent/set initialized()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:1818]
at mx.managers::LayoutManager/validateClient()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1090]
at mx.core::UIComponent/validateNow()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:8067]
at spark.components::ViewNavigator/commitNavigatorAction()[E:\dev\4.5.1\frameworks\projects\mobilecomponents\src\spark\components\ViewNavigator.as:1878]
at spark.components::ViewNavigator/commitProperties()[E:\dev\4.5.1\frameworks\projects\mobilecomponents\src\spark\components\ViewNavigator.as:1236]
at mx.core::UIComponent/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\core\UIComponent.as:8209]
at mx.managers::LayoutManager/validateProperties()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:597]
at mx.managers::LayoutManager/doPhasedInstantiation()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:783]
at mx.managers::LayoutManager/doPhasedInstantiationCallback()[E:\dev\4.5.1\frameworks\projects\framework\src\mx\managers\LayoutManager.as:1180]
我已经用 * 替换了某些文件名和位置以保护我正在做的工作,但是有人可以帮我解决这个问题,因为我相信它必须很简单???
谢谢
好的,让我更详细地解释一下。就像我说的那样,这是为 Android 应用程序设计的,但想象一下,我想做的是使用本地共享对象持久存储书签。
您在上面看到的第一块代码旨在为我要创建的书签创建 LSO 属性,并想象在不同时间可以有多个书签集,例如在 Web 浏览器中。我能找到的唯一方法是将这些项目/详细信息存储在我检索的数组中,然后在保存回 LSO 并保存之前进行更新。
第二段代码与想象一个“书签页面”相关,其中包含我收藏的所有内容的列表。现在我想要发生的事情是,我将能够调用保存书签 ID 的 LSO 属性,然后以列表格式加载他们的详细信息。
我设法创建了 LSO 并将书签详细信息存储在其中,并允许更新它们并添加条目。此外,我确保我拥有的 PHP 代码拉回了与 id 数组相关的所有数据库对象,并且已经使用 flex 进行了测试。我似乎唯一不能做的就是将 id 传递给 PHP Web 服务文件。如果有帮助,Web 服务文件中的代码如下:
public function getPrefsByPrefIds($PrefIds) {
$stmt = mysqli_prepare($this->connection, "SELECT * FROM $this->tablename WHERE $this->tablename.id IN(" .implode(",", $PrefIds). ")");
$this->throwExceptionOnError();
mysqli_stmt_execute($stmt);
$this->throwExceptionOnError();
$rows = array();
mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->desc);
while (mysqli_stmt_fetch($stmt)) {
$rows[] = $row;
$row = new stdClass();
mysqli_stmt_bind_result($stmt, $row->id, $row->name, $row->desc);
}
mysqli_stmt_free_result($stmt);
mysqli_close($this->connection);
return $rows;
}
是的,我已经尝试过了,但是谢谢。我自己取得了一些进步,因为我一直在试验可以存储在 SharedObjects 中的不同类型的对象。我已经设法让解决方案部分使用此代码:
此代码旨在捕获 boomark 信息并将其存储在 arrayCollection 中,然后将其传输到 bytesArray 并保存
var so:SharedObject = SharedObject.getLocal("app");
public var prefArray:ArrayCollection = new ArrayCollection(so.data.prefs);
protected function prefs_btn_click(event:MouseEvent):void
{
prefArray.source.push(getCompaniesByIDResult.lastResult.id);
so.data.prefs = [prefArray];
var bytes:ByteArray = new ByteArray();
bytes.writeObject(prefArray);
so.data.ac = bytes;
var flushStatus:String = so.flush();
if (flushStatus != null) {
switch(flushStatus) {
case SharedObjectFlushStatus.PENDING:
so.addEventListener(NetStatusEvent.NET_STATUS,
onFlushStatus);
break;
case SharedObjectFlushStatus.FLUSHED:
trace("success");
break;
}
}
}
protected function onFlushStatus(event:NetStatusEvent):void
{
trace(event.info.code);
}
下一个代码旨在从 SahredObjects bytesArray 中检索该信息并将其放回数组集合中
var so:SharedObject = SharedObject.getLocal("app");
var ba:ByteArray = so.data.ac as ByteArray;
var ac:ArrayCollection;
protected function list_creationCompleteHandler(event:FlexEvent):void
{
ba.position = 0;
ac = ba.readObject() as ArrayCollection;
getPrefsByPrefIdsResult.token = prefsService.getPrefsByPrefIds(ac);
}
但是,正如我所说,这仅以一种很小的方式起作用,就好像我只为一个项目存储一个书签(id)然后转到书签列表,成功检索到该书签的详细信息,但是如果我保存多个书签( 2 个或更多 id)页面不会加载详细信息,我没有收到错误消息,但我相信它挂起,因为它正在寻找说 id 的“1,2”而不是“1”和“2”,但我不知道为什么会这样或如何解决。我很感激我得到的建议,但我发现很难没有人可以帮助我解决这个问题,我不得不对代码进行各种实验。有人可以帮我解决这个问题吗,我将不胜感激:-)谢谢