我们将要通过增加Sensor类到Car类,来慢慢转移到实时数据处理


一个Car在需要记录他的比赛情况的时候,可以产生他目前的Sensor Readout :


我们现在只要加静态的数据,下一个章节就要加入更灵活的数据了。


    5.1. 存储数据


    现在你应该很熟悉这个步骤了吧!
    db4o Tutorial 中文翻译(七)// storeFirstCar
    db4o Tutorial 中文翻译(七)
    Car car1 = new Car("Ferrari");
    db4o Tutorial 中文翻译(七)Pilot pilot1 
    = new Pilot("Michael Schumacher"100);
    db4o Tutorial 中文翻译(七)car1.Pilot 
    = pilot1;
    db4o Tutorial 中文翻译(七)db.Set(car1);

    第二个Car我们要加入2个snapshots:
    db4o Tutorial 中文翻译(七)// storeSecondCar
    db4o Tutorial 中文翻译(七)
    Pilot pilot2 = new Pilot("Rubens Barrichello"99);
    db4o Tutorial 中文翻译(七)Car car2 
    = new Car("BMW");
    db4o Tutorial 中文翻译(七)car2.Pilot 
    = pilot2;
    db4o Tutorial 中文翻译(七)car2.Snapshot();
    db4o Tutorial 中文翻译(七)car2.Snapshot();
    db4o Tutorial 中文翻译(七)db.Set(car2);

    5.2. 检索



      5.2.1. QBE


      首先,要确定snapshots是否被真的加入了.
      db4o Tutorial 中文翻译(七)// retrieveAllSensorReadout
      db4o Tutorial 中文翻译(七)
      IObjectSet result = db.Get(typeof(SensorReadout));
      db4o Tutorial 中文翻译(七)ListResult(result);
      注意:原型中给定元素的实际位置是错的。
      为了根据一个car的sensor readouts来检索car,我们要记录查看历史
      db4o Tutorial 中文翻译(七)// retrieveCarQBE
      ListResult(result);
      我们也可以检索集合本身,因为他们也是对象
      db4o Tutorial 中文翻译(七)// retrieveCollections
      db4o Tutorial 中文翻译(七)
      IObjectSet result = db.Get(new ArrayList());
      db4o Tutorial 中文翻译(七)ListResult(result);


      这对array不起作用:
      db4o Tutorial 中文翻译(七)// retrieveArrays
      ListResult(result);

      5.2.2. Native Queries


      如果你想用 Native Queries 来通过匹配来查找SensorReadouts, 和检索单个值(非集合、数组),是一样的:
      db4o Tutorial 中文翻译(七)public class RetrieveSensorReadoutPredicate : Predicate
      }

      db4o Tutorial 中文翻译(七)// retrieveSensorReadoutNative
      db4o Tutorial 中文翻译(七)
      IObjectSet results = db.Query(new RetrieveSensorReadoutPredicate());
      db4o Tutorial 中文翻译(七)ListResult(results);

      这里是根据匹配的readout 来查找car:
      db4o Tutorial 中文翻译(七)public class RetrieveCarPredicate : Predicate
      }

      db4o Tutorial 中文翻译(七)// retrieveCarNative
      db4o Tutorial 中文翻译(七)
      IObjectSet results = db.Query(new RetrieveCarPredicate());
      db4o Tutorial 中文翻译(七)ListResult(results);

      5.2.3. 检索 API


      对arrays and collections操作类似上面的例子. 首先,我们只用匹配值检索 SensorReadouts :
      // retrieveSensorReadoutQuery
      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);


      然后,我们根据匹配的 Readout 检索car:
      db4o Tutorial 中文翻译(七)// retrieveCarQuery
      db4o Tutorial 中文翻译(七)
      IQuery query = db.Query();
      db4o Tutorial 中文翻译(七)query.Constrain(
      typeof(Car));
      db4o Tutorial 中文翻译(七)IQuery historyQuery 
      = query.Descend("_history");
      db4o Tutorial 中文翻译(七)historyQuery.Constrain(
      typeof(SensorReadout));
      db4o Tutorial 中文翻译(七)IQuery valueQuery 
      = historyQuery.Descend("_values");
      db4o Tutorial 中文翻译(七)valueQuery.Constrain(
      0.3);
      db4o Tutorial 中文翻译(七)valueQuery.Constrain(
      0.1);
      db4o Tutorial 中文翻译(七)IObjectSet results 
      = query.Execute();
      db4o Tutorial 中文翻译(七)ListResult(results);

      5.3. 更新和删除


      应该很熟悉了吧,我们只需要设置car的更新深度:
      db4o Tutorial 中文翻译(七)// updateCarPart1
      db4o Tutorial 中文翻译(七)
      Db4oFactory.Configure().ObjectClass(typeof(Car)).CascadeOnUpdate(true);

      db4o Tutorial 中文翻译(七)// updateCarPart2
      db4o Tutorial 中文翻译(七)
      IObjectSet result = db.Get(new Car("BMW"null));
      db4o Tutorial 中文翻译(七)Car car 
      = (Car)result.Next();
      db4o Tutorial 中文翻译(七)car.Snapshot();
      db4o Tutorial 中文翻译(七)db.Set(car);
      db4o Tutorial 中文翻译(七)RetrieveAllSensorReadouts(db);

      当删除arrays and collections时候没有什么不同的。
      从一个集合中删除对象也是一样的。
      db4o Tutorial 中文翻译(七)// updateCollection
      db4o Tutorial 中文翻译(七)
      IQuery query = db.Query();
      db4o Tutorial 中文翻译(七)query.Constrain(
      typeof(Car));
      db4o Tutorial 中文翻译(七)IObjectSet result 
      = query.Descend("_history").Execute();
      db4o Tutorial 中文翻译(七)IList history 
      = (IList)result.Next();
      db4o Tutorial 中文翻译(七)history.RemoveAt(
      0);
      db4o Tutorial 中文翻译(七)db.Set(history);
      db4o Tutorial 中文翻译(七)Car proto 
      = new Car(nullnull);
      db4o Tutorial 中文翻译(七)result 
      = db.Get(proto);
      db4o Tutorial 中文翻译(七)
      foreach (Car car in result)
      }



      (通过这个例子,我们可以看到db4o可以很容易进入对象内部,这在以前是很少见的。请牢记以上并且小心应用。.)

      在进入下一章之前,删除所有的car:
      db4o Tutorial 中文翻译(七)// deleteAllPart1
      db4o Tutorial 中文翻译(七)
      Db4oFactory.Configure().ObjectClass(typeof(Car)).CascadeOnDelete(true);

      db4o Tutorial 中文翻译(七)// deleteAllPart2
      db4o Tutorial 中文翻译(七)
      IObjectSet result = db.Get(new Car(nullnull));
      db4o Tutorial 中文翻译(七)
      foreach (object car in result)
      }

      5.4. 总结


      Ok, collections也是对象。但是我们怎么定义它的类型呢?有没有必要定义呢? db4o如何处理继承?下一章节将讲到。


      5.5. 全部代码

       

      db4o Tutorial 中文翻译(七)锘縰sing System;
      db4o Tutorial 中文翻译(七)
      using System.Collections;
      db4o Tutorial 中文翻译(七)
      using System.IO;
      db4o Tutorial 中文翻译(七)
      using Db4objects.Db4o;
      db4o Tutorial 中文翻译(七)
      using Db4objects.Db4o.Query;
      db4o Tutorial 中文翻译(七)
      namespace Db4objects.Db4o.Tutorial.F1.Chapter3



相关文章: