gpt4 book ai didi

actionscript-3 - flash builder mobile,正确使用 PersistenceManager?

转载 作者:行者123 更新时间:2023-12-04 23:52:13 24 4
gpt4 key购买 nike

我是移动应用开发的新手,但我正在尝试构建移动角色扮演游戏角色表应用。我没有使用 SQLite,而是尝试使用 PersistenceManager 在应用程序中断或关闭时保留字符数据,但我不确定我是否正确使用它。这是我目前所拥有的。

主.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" firstView="views.CharactersView"
applicationDPI="160" persistNavigatorState="true">

</s:ViewNavigatorApplication>

CharactersView.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="creationCompleteHandler(event)">

<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;

protected function creationCompleteHandler(event:FlexEvent):void
{
var o:Object = new Object();
o.name = "Aragorn";
o.type = "Ranger";
o.strength = 97;
o.speed = 7;
Database.insertCharacter(o);
trace(Database.characters.length);
}

]]>
</fx:Script>

<s:List id="list" width="100%" height="100%"/>

数据库.as:

import spark.managers.PersistenceManager;

public class Database
{
private static var data:Array = [];
private static var pm:PersistenceManager = new PersistenceManager();

public static function get characters():Array
{
if (!pm.load() || pm.getProperty("characters") == null)
{
Database.data = [];
}
else
{
Database.data = pm.getProperty("characters") as Array;
}
return data;
}

public static function insertCharacter(o:Object):void
{
Database.data.push(o);
pm.setProperty("characters", Database.data);
pm.save();
}

}

在 CharactersView.mxml 的 creationComplete 处理程序中,我正在创建一个带有一些任意信息的一次性角色,只是为了测试插入角色是否有效。每次我完全按原样运行它时,跟踪语句(我的数组的长度)都会返回 1。每次运行它时它不应该增加 1 吗?这告诉我有些不对劲,但是持久性管理器是否没有正确保存数据?我是否需要检查 pm.save() 是否返回 true,如果是,我是否应该分派(dispatch)一个事件然后才运行 trace 语句以获得正确的长度?这似乎只是为了保存一些数据而过于复杂,所以我不完全确定发生了什么或如何修复它。

无论如何,我要问的是我当前的设置是否正确,如果不正确,有没有人有一个简单的例子,或者可以根据我的代码创建一个简单的例子来说明如何正确使用 persistencemanager?

一旦我掌握了这项技术,我也可以创建其他几个应用程序,所以我真的希望能把它搞定。提前致谢!

编辑:看来我正确使用了有关 PM 的所有内容,我收到的答案确实帮助我让我的应用程序正常工作。然而,当继续前进时,我的应用程序开始表现得很滑稽。例如,我的列表似乎对交互的 react 非常缓慢,大多数其他组件也是如此。下面是新代码。

主.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:ViewNavigatorApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" firstView="views.CharactersView"
applicationDPI="160" persistNavigatorState="true">

</s:ViewNavigatorApplication>

CharactersView.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark" creationComplete="creationCompleteHandler(event)">

<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.events.FlexEvent;

protected function creationCompleteHandler(event:FlexEvent):void
{
update();
}

private function update():void
{
title = "D&D Characters (" + Database.characters.length + ")";
list.dataProvider = new ArrayCollection(Database.characters);
}

protected function button1_clickHandler(event:MouseEvent):void
{
var vo:CharacterVO = new CharacterVO();
vo.name = "Aragorn";
vo.className = "Ranger";
vo.race = "Human";
vo.level = 6;
vo.gender = "Male";
vo.alignment = "Unaligned";
vo.hp = 25;
vo.xp = 100;
Database.insertCharacter(vo);
update();
}

]]>
</fx:Script>

<s:actionContent>
<s:Button label="+" click="button1_clickHandler(event)"/>
</s:actionContent>

<s:List id="list" width="100%" height="100%"/>

</s:View>

数据库.as:

import spark.managers.PersistenceManager;

public class Database
{
private static var data:Array = [];
private static var pm:PersistenceManager = new PersistenceManager();

public static function get characters():Array
{
return data;
}

public static function insertCharacter(o:CharacterVO):void
{
Database.data.push(o);
pm.setProperty("characters", Database.data);
pm.save();

if (!pm.load() || pm.getProperty("characters") == null)
{
Database.data = [];
}
else
{
Database.data = pm.getProperty("characters") as Array;
}
}

}

CharacterVO.as:

import flash.utils.IDataInput;
import flash.utils.IDataOutput;
import flash.utils.IExternalizable;

public class CharacterVO implements IExternalizable
{
public var name:String;
public var className:String;
public var race:String;
public var gender:String;
public var alignment:String;
public var level:Number;
public var hp:Number;
public var xp:Number;


public function writeExternal(output:IDataOutput):void {
output.writeUTF(name);
output.writeUTF(className);
output.writeUTF(race);
output.writeUTF(gender);
output.writeUTF(alignment);
output.writeFloat(level);
output.writeFloat(hp);
output.writeFloat(xp);
}

public function readExternal(input:IDataInput):void {
name = input.readUTF();
className = input.readUTF();
race = input.readUTF();
gender = input.readUTF();
alignment = input.readUTF();
level = input.readFloat();
hp = input.readFloat();
xp = input.readFloat();
}
}

如您所见,大部分代码与我最初发布的代码相同。我添加了 CharacterVO 类,我在 CharactersView.mxml 中移动了一些东西,我将 PersistenceManager 加载代码移动到 insertCharacter 函数(这样,我只在添加新项目时加载 PM,而不是每次我调用数据库.字符)。

同样,我的应用似乎对交互的 react 真的很慢,有时它根本没有反应。有些事情是不对的,我以前从未遇到过移动应用程序的这个问题。可能是将数组存储在 PM 中然后尝试将其设置为列表的 dataProvider 导致了问题吗?

最佳答案

我不太熟悉使用它,但是从文档看来你可能不能使用通用对象,因为我不相信它实现了 IExternalizable,根据文档,这不会导致错误由于某种原因,它实际上无法读取/写入这些对象。

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/spark/managers/PersistenceManager.html

When storing values using the manager, it is important that all values can be properly be written to a shared object. Complex objects that store classes or non-standard flash primitives must implement flash.net.IExternalizable interface to work properly. Saving incompatible objects does not cause an RTE, but creates undefined behavior when the data is read back.

当我自己使用它时,有一次在一个项目上帮助另一个 SO 海报我不记得真的有任何问题,除非我们改变了我们正在存储/检索的模型对象的属性然后我们不得不手动吹走本地共享它正在创建的对象,否则它无法反序列化它(有道理但只是需要注意的事情)。我实际上不记得实现了 IExternalizable,但有可能是其他人实现的。

试试这个:

[CharacterVO.as]

public class CharacterVO implements IExternalizable
{
public var name:String;
public var type:String;
public var strength:Number;
public var speed:Number;


public function writeExternal(output:IDataOutput) {
output.writeUTF(name);
output.writeUTF(type);
output.writeFloat(strength);
output.writeFloat(speed);
}

public function readExternal(input:IDataInput) {
name = input.readUTF();
type = input.readUTF();
strength = input.readFloat();
speed = input.readFloat();
}
}

然后创建该 VO 的实例,而不是创建通用对象。我相信 Array 会通过按顺序序列化它的所有元素来自动序列化。

关于actionscript-3 - flash builder mobile,正确使用 PersistenceManager?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11744369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com