db4o官方入门教程翻译--06.集合和数组
.Net方向的关于使用db4o的资料很少,硬着头皮看官方的英文版入门教程。由于英文不太好比较费劲,感觉一定有朋友会遇到相同的问题。所以想将入门教程做一个简单的翻译,水平有限,不太明白的地方可以对照英文版看一下,欢迎您的指正,从第六章随着看有时间就放上一些。欢迎大家交流。
我们将慢慢的向实时的数据处理迈进,首先为我们的车安装传感器并收集他们的输出数据。
using System;
using System.Text;namespace Db4odoc.Tutorial.F1.Chapter4
{ public class SensorReadout{double[] _values;DateTime _time;Car _car;public SensorReadout(double[] values, DateTime time, Car car){_values = values;_time = time;_car = car;}public Car Car{get{return _car;}}public DateTime Time{get{return _time;}}public int NumValues{get{return _values.Length;}}public double[] Values{get{return _values;}}public double GetValue(int idx){return _values[idx];}override public string ToString(){StringBuilder builder = new StringBuilder();builder.Append(_car);builder.Append(" : ");builder.Append(_time.TimeOfDay);builder.Append(" : ");for (int i=0; i<_values.Length; ++i){if (i > 0){builder.Append(", ");}builder.Append(_values[i]);}return builder.ToString();}}
}
在比赛中,汽车可以请求并读取当前的传感器信息,并将它们存储在一个列表中。
using System;
using System.Collections;namespace Db4odoc.Tutorial.F1.Chapter4
{public class Car{string _model;Pilot _pilot;IList _history;public Car(string model) : this(model, new ArrayList()){}public Car(string model, IList history){_model = model;_pilot = null;_history = history;}public Pilot Pilot{get{return _pilot;}set{_pilot = value;}}public string Model{get{return _model;}}public IList History{get{return _history;}}public void Snapshot(){_history.Add(new SensorReadout(Poll(), DateTime.Now, this));}protected double[] Poll(){int factor = _history.Count + 1;return new double[] { 0.1d*factor, 0.2d*factor, 0.3d*factor };}override public string ToString(){return string.Format("{0}[{1}]/{2}", _model, _pilot, _history.Count);}}
}
我们会限制自己不使用当前的静态数据,并在接下来的章节增加灵活性。
6.1存储
现在,这个应该比较熟悉了。
// storeFirstCarCar car1 = new Car("Ferrari");Pilot pilot1 = new Pilot("Michael Schumacher", 100);car1.Pilot = pilot1;db.Store(car1);
第二辆车在开始时存储两次快照(存储两个传感器读数)。
// storeSecondCarPilot pilot2 = new Pilot("Rubens Barrichello", 99);Car car2 = new Car("BMW");car2.Pilot = pilot2;car2.Snapshot();car2.Snapshot();db.Store(car2);
6.2检索
6.2.1 QBE
首先我们来证实一下确实保存了快照(传感器读数)。
// 读取所有的传感器读数IObjectSet result = db.QueryByExample(typeof(SensorReadout));ListResult(result);
作为一个原型数组,我们可以提供一个具有相同类型的数组,这个数组中只包含我们需要的数据。
// retrieveSensorReadoutQBESensorReadout proto = new SensorReadout(new double[] { 0.3, 0.1 }, DateTime.MinValue, null);IObjectSet result = db.QueryByExample(proto);ListResult(result);
注意,元素在原型数组中的位置无关紧要。
我们可以根据传感器记录历史来查询相关汽车信息。
// 检索汽车SensorReadout protoReadout = new SensorReadout(new double[] { 0.6, 0.2 }, DateTime.MinValue, null);IList protoHistory = new ArrayList();protoHistory.Add(protoReadout);Car protoCar = new Car(null, protoHistory);IObjectSet result = db.QueryByExample(protoCar);ListResult(result);
我们也可以查询集合本身,因为他们是顶级的类对象。
// retrieveCollectionsIObjectSet result = db.QueryByExample(new ArrayList());ListResult(result);
但是这种方式并不适用于数组(返回的结果个数是0)。
// 查询数组IObjectSet result = db.QueryByExample(new double[] { 0.6, 0.4 });ListResult(result);
6.2.2 Native Queries
如果我们想要使用原生查询来查找匹配的SensorReadouts值,我们可以简单地编写如下代码,但这可能会检查每一个实例(遍历所有实例性能上会有损失):
public class RetrieveSensorReadoutPredicate : Predicate{public bool Match(SensorReadout candidate){return Array.IndexOf(candidate.Values, 0.3) > -1&& Array.IndexOf(candidate.Values, 0.1) > -1;}}
// 原生查询查询传感器读数IObjectSet results = db.Query(new RetrieveSensorReadoutPredicate());ListResult(results);
下面是根据传感器读数来查找汽车的例子:
public class RetrieveCarPredicate : Predicate{public bool Match(Car car){foreach (SensorReadout sensor in car.History){if (Array.IndexOf(sensor.Values, 0.3) > -1&& Array.IndexOf(sensor.Values, 0.1) > -1){return true;}}return false;}}
// 原生查询IObjectSet results = db.Query(new RetrieveCarPredicate());ListResult(results);
6.2.3 SODA Query API
使用SODA Query API处理数组和集合的方式与前面的例子很相似。
首先,让我们只查询包含特定值的传感器读数实体。
// retrieveSensorReadoutQueryIQuery query = db.Query();query.Constrain(typeof(SensorReadout));IQuery valueQuery = query.Descend("_values");valueQuery.Constrain(0.3);valueQuery.Constrain(0.1);IObjectSet results = query.Execute();ListResult(results);
下面,我们来查询包含特定传感器读数信息的汽车实体:
// retrieveCarQueryIQuery query = db.Query();query.Constrain(typeof(Car));IQuery historyQuery = query.Descend("_history");historyQuery.Constrain(typeof(SensorReadout));IQuery valueQuery = historyQuery.Descend("_values");valueQuery.Constrain(0.3);valueQuery.Constrain(0.1);IObjectSet results = query.Execute();ListResult(results);
6.3 Updating and deleting
这个应该是比较熟悉的了,我们只需要注意更新深度就好了:
// updateCarIEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){IObjectSet result = db.QueryByExample(new Car("BMW", null));Car car = (Car)result.Next();car.Snapshot();db.Store(car);RetrieveAllSensorReadout(db);}
删除数组和集合对象也没有什么特殊之处。
从数组或集合中中删除一个元素并更新这个数组或集合也是一样没有特殊之处。
// updateCollectionIEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){IQuery query = db.Query();query.Constrain(typeof (Car));IObjectSet result = query.Descend("_history").Execute();IList history = (IList) result.Next();history.RemoveAt(0);db.Store(history);Car proto = new Car(null, null);result = db.QueryByExample(proto);foreach (Car car in result){foreach (object readout in car.History){Console.WriteLine(readout);}}}
这个示例还说明Db4o总是能够轻松的访问或修改我们不想看到的内部对象,需要牢记并小心处理。
下面我们从数据库中删除所有汽车为下一章做准备。
// deleteAllIEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){IObjectSet result = db.QueryByExample(new Car(null, null));foreach (object car in result){db.Delete(car);}IObjectSet readouts = db.QueryByExample(new SensorReadout(null, DateTime.MinValue, null));foreach (object readout in readouts){db.Delete(readout);}}
6.4. 结论
Ok,集合也是对象。那么为什么我们要具体详细说明集合的所有处理方法呢?这是必要的吗?db4o是怎么处理继承关系的?我们将在下一章讨论这些问题。
6.5. Full source
using System;
using System.Collections;
using System.IO;
using Db4objects.Db4o;
using Db4objects.Db4o.Config;
using Db4objects.Db4o.Query;
namespace Db4odoc.Tutorial.F1.Chapter4
{ public class CollectionsExample : Util{readonly static string YapFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),"formula1.yap"); public static void Main(string[] args){File.Delete(YapFileName);using(IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName)){StoreFirstCar(db);StoreSecondCar(db);RetrieveAllSensorReadout(db);RetrieveSensorReadoutQBE(db);RetrieveCarQBE(db);RetrieveCollections(db);RetrieveArrays(db);RetrieveSensorReadoutQuery(db);RetrieveCarQuery(db);};UpdateCar();UpdateCollection();DeleteAll();using (IObjectContainer db = Db4oEmbedded.OpenFile(YapFileName)){RetrieveAllSensorReadout(db);}}public static void StoreFirstCar(IObjectContainer db){Car car1 = new Car("Ferrari");Pilot pilot1 = new Pilot("Michael Schumacher", 100);car1.Pilot = pilot1;db.Store(car1);}public static void StoreSecondCar(IObjectContainer db){Pilot pilot2 = new Pilot("Rubens Barrichello", 99);Car car2 = new Car("BMW");car2.Pilot = pilot2;car2.Snapshot();car2.Snapshot();db.Store(car2); }public static void RetrieveAllSensorReadout(IObjectContainer db){IObjectSet result = db.QueryByExample(typeof(SensorReadout));ListResult(result);}public static void RetrieveSensorReadoutQBE(IObjectContainer db){SensorReadout proto = new SensorReadout(new double[] { 0.3, 0.1 }, DateTime.MinValue, null);IObjectSet result = db.QueryByExample(proto);ListResult(result);}public static void RetrieveCarQBE(IObjectContainer db){SensorReadout protoReadout = new SensorReadout(new double[] { 0.6, 0.2 }, DateTime.MinValue, null);IList protoHistory = new ArrayList();protoHistory.Add(protoReadout);Car protoCar = new Car(null, protoHistory);IObjectSet result = db.QueryByExample(protoCar);ListResult(result);}public static void RetrieveCollections(IObjectContainer db){IObjectSet result = db.QueryByExample(new ArrayList());ListResult(result);}public static void RetrieveArrays(IObjectContainer db){IObjectSet result = db.QueryByExample(new double[] { 0.6, 0.4 });ListResult(result);}public static void RetrieveSensorReadoutQuery(IObjectContainer db){IQuery query = db.Query();query.Constrain(typeof(SensorReadout));IQuery valueQuery = query.Descend("_values");valueQuery.Constrain(0.3);valueQuery.Constrain(0.1);IObjectSet results = query.Execute();ListResult(results);}public static void RetrieveCarQuery(IObjectContainer db){IQuery query = db.Query();query.Constrain(typeof(Car));IQuery historyQuery = query.Descend("_history");historyQuery.Constrain(typeof(SensorReadout));IQuery valueQuery = historyQuery.Descend("_values");valueQuery.Constrain(0.3);valueQuery.Constrain(0.1);IObjectSet results = query.Execute();ListResult(results);}public class RetrieveSensorReadoutPredicate : Predicate{public bool Match(SensorReadout candidate){return Array.IndexOf(candidate.Values, 0.3) > -1&& Array.IndexOf(candidate.Values, 0.1) > -1;}}public static void RetrieveSensorReadoutNative(IObjectContainer db) {IObjectSet results = db.Query(new RetrieveSensorReadoutPredicate());ListResult(results);}public class RetrieveCarPredicate : Predicate{public bool Match(Car car){foreach (SensorReadout sensor in car.History){if (Array.IndexOf(sensor.Values, 0.3) > -1&& Array.IndexOf(sensor.Values, 0.1) > -1){return true; }}return false;}}public static void RetrieveCarNative(IObjectContainer db){IObjectSet results = db.Query(new RetrieveCarPredicate());ListResult(results);}public static void UpdateCar(){IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){IObjectSet result = db.QueryByExample(new Car("BMW", null));Car car = (Car)result.Next();car.Snapshot();db.Store(car);RetrieveAllSensorReadout(db);}}public static void UpdateCollection(){IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();config.Common.ObjectClass(typeof(Car)).CascadeOnUpdate(true);using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){IQuery query = db.Query();query.Constrain(typeof (Car));IObjectSet result = query.Descend("_history").Execute();IList history = (IList) result.Next();history.RemoveAt(0);db.Store(history);Car proto = new Car(null, null);result = db.QueryByExample(proto);foreach (Car car in result){foreach (object readout in car.History){Console.WriteLine(readout);}}}}public static void DeleteAll(){IEmbeddedConfiguration config = Db4oEmbedded.NewConfiguration();config.Common.ObjectClass(typeof(Car)).CascadeOnDelete(true);using(IObjectContainer db = Db4oEmbedded.OpenFile(config, YapFileName)){IObjectSet result = db.QueryByExample(new Car(null, null));foreach (object car in result){db.Delete(car);}IObjectSet readouts = db.QueryByExample(new SensorReadout(null, DateTime.MinValue, null));foreach (object readout in readouts){db.Delete(readout);}}}}
}
相关代码:下载
转载于:https://www.cnblogs.com/yuanyuan/archive/2012/06/27/2564536.html
db4o官方入门教程翻译--06.集合和数组相关推荐
- 【Houdini官方入门教程翻译】地形生成(更新ing)
文章目录 0.概述 1.使用Heightfields来塑造地形 01 选择Terrain布局,创建一个高度场 02 使用径向菜单,给高度场添加噪声并模糊边缘 03 添加高度场扭曲 04 添加网络框使得 ...
- 【Houdini官方入门教程翻译】概述——UV和纹理贴图
文章目录 概述 UV视图介绍 UV Quickshade节点 UV Project节点 UV Flatten节点 UV Edit节点 UV Layout节点 UDIMS UV 属性(Attribute ...
- 【Houdini官方入门教程翻译】概述——文件管理
文章目录 概述 项目目录 场景文件 | .HIP 数字资产 | .HDA Houdini Apprentice 和 Houdini Indie 的文件 备份 File SOP节点 文件依赖路径 [$H ...
- 【Houdini官方入门教程翻译】概述——建模工具
文章目录 几何体类型 创建几何体 多边形(Polygon)建模 通用工具节点 细分曲面(Subdivision Surfaces)建模 加面(Surfacing)工具 布尔运算 变形(Deform)工 ...
- AFNnetworking快速教程,官方入门教程译
AFNnetworking快速教程,官方入门教程译 分类: IOS2013-12-15 20:29 12489人阅读 评论(5) 收藏 举报 afnetworkingjsonios入门教程快速教程 A ...
- 第三章 Python Kivy 学习 -- Kivy官方入门教程Pong Game
系列文章目录 第一章 Python Kivy 学习 – Kivy介绍及环境安装 第二章 Python Kivy 学习 – Kivy项目开发原理(待编辑) 第三章 Python Kivy 学习 – Ki ...
- Fragstats官方入门教程3 批处理多个栅格
原著:Kevin McGarigal 翻译:地理时政志(公众号.CSDN同名,知乎:Jarviski) 在教程3中,将会教读者如何使用Fragstats完成批处理多个栅格,以及其他要注意的问题 以下原 ...
- Unity游戏开发官方入门教程:飞机大战(六)——创建子弹
Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...
- Unity游戏开发官方入门教程:飞机大战(二)——创建飞船对象
Unity版本:Unity 2018.2.14f1 原视频链接:https://unity3d.com/cn/learn/tutorials/s/space-shooter-tutorial 教程目录 ...
最新文章
- 卡巴循环30天不限次数循环试用工具
- Hadoop系列三:Hadoop之Pig篇
- 分类VS标签,一文带你看懂数据中台为什么要建标签体系?
- 阿里云自定义监控tomcat进程数
- python守护进程进程池_Python3标准库:multiprocessing像线程一样管理进程
- php accesscontrolalloworigin,php – Access-Control-Allow-Origin没有显示在codeigniter的响应头中...
- BZOJ4698: Sdoi2008 Sandy的卡片
- Lynis – 用于Linux服务器的自动安全审计工具
- C语言:计算1!+2!+3!+...+100!
- background-color:#e5eecc; border:solid 1px #c3c3c3;
- 笔记本独立显卡geforce gtx 1050ti 388.71版本驱动
- 政府采购87号令实施满月,地信企业须警惕九个坑
- 从培训机构出来的程序员,后来都怎么样了? | 程序员有话说
- 折叠屏市场起风,华为、OPPO“你追我赶”
- endnote文件enl突然没了_科学网—实际操作中的Endnote库文件损坏修复方法 - 尹卓忻的博文...
- 频率、周期、角频率的概念
- Python调用WPS API
- Vue项目中使用海康安全生产平台播放监控视频
- 如何阅读文献?——方法论
- 浅谈项目管理之平衡原则