设为首页 收藏本站
查看: 782|回复: 0

DB4O在Windows phone 7和Silverlight中运用补充

[复制链接]

尚未签到

发表于 2015-5-8 14:22:12 | 显示全部楼层 |阅读模式
  在上篇中多样化实现Windows Phone 7本地数据访问——DB4O 初步通过DB4O作为Windows Phone 7本地数据访问尝试验证. 但终因访问时出现多处异常而未能成功. 针对这个问题 也有圆友提出相关解决办法. 最近一直在SAP,一直没有时间验证. 本篇就圆友提出问题 提出验证 另外针对DB4O在Silverlight和Windows Phone 7上运用加以扩展.
  
  Validate DB4O For Windows Phone 7
  
  上次关于Windows Phone 7访问DB4O采用的版本是.NEt 3.5版本:DB40 Download Link[DB4O 7.12 For .NEt 3.5] 而DB4O 对Silverlight的支持正在开发中, 在DB4O官方发布的Realse Note 中 其中db4o for .NET 4.0, version 8.0.160.14822 ZIP.版本已经开始对Silverlight 3加以支持[当然也可以适用在Silverlight 4项目中],针对上篇出现问题. 本次采用最新版本的DB4O 8.0版本来验证.
  DB4O Version 8.0 DownLink: db4o for .NET 4.0, version 8.0.160.14822 ZIP [8.0版本下载连接]
  解压文件后 发现在解压路径下可以看到db4o-net40\db4o-8.0\bin中多了Silverlight-3.0文件夹:
DSC0000.jpg
  
  
  
  
  
  
  新建一个WP7测试程序DB4oForW7p_Demo,对DB4O下Silverlight-3.0文件夹下加以DLL引用 引用结果: DSC0001.jpg
  
  
  
  
  
  
  
  
  
  
  对于引用DB4O Silverlighti-3.0文件夹DLL进行一下说明:
  Cecil.Flowanalysis.dll —针对字节码分析库原生查询优化.
  Db4objects.Db4o.dll —  db4o数据库引擎[核心]
  Db4objects.Db4o.Linq.dll — LINQ查询的支持
  Db4objects.Db4o.Optional.dll —db4o的可选组件
  构建一个简单页面: 直接测试WP7是否对DB4O加以支持:
   DSC0002.jpg
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  引用完成后上次 对DB4O访问问题主要出现在无法创建DB4O数据库文件或是采取访问出现异常.类似我们这样直接创建一个DB4O文件:
  
      1:  //Create DB4O File DAtabase
   2:   string filepath = @"test.db4o";
   3:   IObjectContainer getdb40 = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), filepath);
  
  这时会提示:尝试访问操作访问文件出现未处理异常.

  System.MethodAccessException was unhandled
  Message=Attempt to access the method failed: System.IO.Path.GetFullPath(System.String)
  StackTrace:
       at Sharpen.IO.File.GetCanonicalPath()
       at Db4objects.Db4o.IO.FileStorage.FileBin..ctor(BinConfiguration config)
       at Db4objects.Db4o.IO.FileStorage.Open(BinConfiguration config)
       at Db4objects.Db4o.IO.StorageDecorator.Open(BinConfiguration config)


  这个问题原因主要因为Silverlight 沙箱设计引起安全的,DB4O官方给出解释是需要在对Silverlight情况进行独立配置. 把数据库文件test.db4O进行隔离存储来实现. 具体配置如下:



   1:  using Db4objects.Db4o;
   2:  using Db4objects.Db4o.Query;
   3:  using Db4objects.Db4o.Linq;
   4:  using Db4objects.Db4o.Config;
   5:  using Db4objects.Db4o.IO;




   1:  //Create new DB4o File Support.
   2:  string filepath = @"test.db4o";
   3:  IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
   4:   
   5:  configuration.File.Storage = new IsolatedStorageStorage();
   6:  IObjectContainer getdb40 = Db4oEmbedded.OpenFile(configuration, filepath);
  这时我们需要对IEmbeddedConfiguration进行特定配置,  即采用独立存储方式写入DB4O数据库文件. 在Silverlight和WP7程序中这是必须的.另外对于上次JackLin提出无法再Xap固定数据库文件问题. 我尝试另外一种办法来解决这个问题:
  我们可以把创建数据库文件test.DB4O以全局成员变量定义在App.Xaml.cs文件,对于该程序所有页面Test.DB4O数据库文件都是可见的. 但这么做在WP7测试发现一个问题. 这样配置成功之后, 从一个页面跳转到另一个页面时 从新打开TEst.DB4O数据库文件进行数据访问时会提示一个异常:

  Db4objects.Db4o.Ext.Db4oRecoverableException was unhandled
    Message=Db4oRecoverableException
    StackTrace:
         at Db4objects.Db4o.Internal.ObjectContainerBase.GetByID(Transaction ta, Int64 id)
         at Db4objects.Db4o.Internal.Fileheader.FileHeaderVariablePart.ReadIdentity(LocalTransaction trans)
         at Db4objects.Db4o.Internal.Fileheader.NewFileHeaderBase.ReadIdentity(LocalObjectContainer container)
  


  这时一个ReCoverableException.目前官方对于这个异常我没有找到相关说法. ok. 创建TESt.DB4o文件成功后创建一个实体类来直接保存数据对象 如果我们这样定义:



   1:      ///
   2:      /// use Data Model ProductCode EntityMode
   3:      /// Sign by chenkai  Date:2010年10月19日11:21:02
   4:      ///
   5:      public class ProductCode
   6:      {
   7:          public string CodeId { get; set; }
   8:          public string CodeName{get;set;}
   9:          public string CodeState{get;set;}
  10:          public string CodeDate{get;set;}
  11:      }
  当我们建立一个ProductCode对象并保存时 会提示一个异常:



   1:  string filepath = @"test.db4o";
   2:  //Create new DB4o File Support.
   3:  IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
   4:  configuration.File.Storage = new IsolatedStorageStorage();
   5:  IObjectContainer getdb40 = Db4oEmbedded.OpenFile(configuration, filepath);
   6:   
   7:   MessageBox.Show("open file!");
   8:   
   9:  //Create new ProductCode Entity Model
  10:  EntityModel.ProductCode newcode = new EntityModel.ProductCode { CodeId="0458", CodeName="SAP_BarCode",
    CodeState="check_In",CodeDate=DateTime.Now.ToString()  };
  11:  getdb40.Store(newcode);
  12:   
  13:  //Dispose the reasource
  14:  getdb40.Close();
  15:  getdb40.Dispose();
  16:   
  17:  MessageBox.Show("save sucess!");
  当执行到Stroe()存储方法时会提示: “无法访问读取目标对象的属性”.截图InnerException:
DSC0003.jpg
  
  
  
  
  
  
  
  
  
  也就是在存储数据时ProductCode实体的属性字段. 这个问题是因为Silverlight为了保证程序的部署和访问安全程序运行在沙箱中.导致私有字段无法存储 对属性字段访问不直接加以支持. 同时从类到成员对象必须是Public类型. 官方DB4O对Silverlight这种设计表态也是没有办法. 只是声明不断尽力改善, 但可以把属性类定义成另外一种方式:



   1:   public class ProductCode
   2:      {
   3:          public string CodeId;
   4:          public string CodeName;
   5:          public string CodeState;
   6:          public string CodeDate;
   7:      }
  
  或是手写定义属性:



   1:      public string CodeName

   2:          {

   3:              get { return codename; }
   4:              set { codename = value;
   5:              NotifyPropertyChanged("CodeName");
   6:              }
   7:          }
  
  在引用中引入了Db4objects.Db4o.Linq.dll — LINQ查询的支持. DB4O官方也声明支持WP7. Linq查询.但是后来我在编写WP7批量处理数据采用Linq方式 例如:



   1:  //执行Linq查询  
   2:  var q = from myproductcode getcode in app.db
   3:               where getcode.ObjectID == oid and Codename="chenkaiCode"
   4:               select getcode;
  偶尔程序会自动报出一个异常:

  System.MissingMethodException was unhandled
    Message=Method not found: quality rlib, Version=3.7.0.0, Culture=neutral, PublicKeyToken=969DB8053D3322AC.System.Type.
    StackTrace:
         at JournalIt.JournalEntryListPage.PhoneApplicationPage_Loaded(Object sender, RoutedEventArgs e)
         at System.Windows.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args)
         at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName)

  Linq在WP7体现极为不稳定. 在项目中已经放弃使用DB4O对Linq数据处理支持.另外一个很情况是 引用了DB4O 后执行WP7 程序调试时, 程序执行无法找到指定断点进行跟踪调试.而是程序中直接作为一个UnHandle Exception 交给了Application_UnhandledException方法直接处理 断开异常调试 很怪异啊 App.Xaml.CS 文件Application_UnhandledException 方法:



   1:      // Code to execute on Unhandled Exceptions
   2:          private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
   3:          {
   4:              if (System.Diagnostics.Debugger.IsAttached)
   5:              {
   6:                  // An unhandled exception has occurred; break into the debugger
   7:                  System.Diagnostics.Debugger.Break();
   8:                  
   9:                  //you get out the Mainpage  ???? why ?
  10:                  //sign by chenkai  
  11:                  MessageBox.Show("you get ou t! by UnhandleException");
  12:              }
  13:          }
  很怪异啊.
  

DB4O For WP7 小结
  
  DB4O如果作为WP7嵌入式开发本地数据库 遇到各个方面问题远远超过我的预期.  
试用DB4O后  总结一下DB4O作为WP7嵌入式本地数据库几个特点:

  第一点是不得不说的是DB4O在Wp7需要额外的配置.一方面源于WP7基于Silverlight. SL平台为了应用程序运行和部署基于沙箱的设计 导致每次方位DB4O都需要额外的配置成独立存储模式.
  不稳定性.我只是测试DB4O7.2 For 3.5 和最新版本的8.0. 在程序配置后 出现无法调试. 对实体类私有字段属性的访问限制. 以及Linq查询对数据处理带来几乎是怪异的异常. 都让我觉得在Wp7中把DB4O作为数据存储是一件很累的事. 起码这种异常让我觉得编码时异常反感. 同时觉得对程序来说不可靠.
   不支持DB4O的Client/Server模式. 本来DB4O这个服务器/客户端设计是其他开源数据库极为少见的. 本来打算10月1前就验证一下DB4O这种工作原理.可惜的是WP7基于SL的特点.导致Silverlight不容许直接的socket连接,至少使用db4o目前的执行情况,是不可能支持CS模式[新版本已经开始支持], 实际上Silverlight支持客户端套接字只是有些限制. 没办 只能把DB4O测试放到Winform测试 SL平台是没有指望了.
  非泛型类型缺乏. 在DB4O表现很严重. 作为一个开源项目DB4O是从Java移植成.NET版本的.特别对于SL平台 简单查看一下API 在IO操作和非泛型集合上变化比较大. 大部分集合是非泛型的,IO的操作采用数据存储时基于SL的独立存储. 看来实质还没变. [新版本正在改善.]
  当然这只是声明我尝试DB4O作为本地数据库实现WP7访问遇到种种情况. 当然DB4O也有很出众的特色.特别值得一提的是对实体对象直接存储. 本来我在用之前一直很怀疑. 想想自己以前用Nhibernate来处理OO与关系型数据之间数据映射. DB4O面向 对象 我一直怀疑它是嵌入式数据库在性能上一定不是太好.从官方发布的测试资料来看 基本满足需求.

DB4O for WP7建议
  针对个人使用DB4O在WP7上一些探索中.碰到一些问题. 当然是个人之见  其实写这篇文章是一个很纠结过程. 因为描述大多是出现问题.  DB4O面前新版已经SL3. 新版本不断开发更新中.  但是如果真的把DB4O作为WP7 我认为 真的是很折磨人一件事. DB4o因为SL平台特殊性. 其本身固然存在一些问题.
  另外一个原因 是 DB4o虽然是开源免费. 但是这照成一个开源项目特点. 对于问题更新和解决周期时间过长.  最为关键的是DB4O官方也声明 既然为开源项目 它的更新和研发来自于开源社区不断推动. 至于是否保持对SL平台的支持 还有待以后的观望. DB4o对SL支持前景是不明确的.
  如果说个人研究我觉得对于开源的DB4O来说还是很有意义的. 但是如果说真的投入商业性开发 或是企业级. 真的目前DB4O特点时不具备 我建议的不适用. 减少问题的出现.
  本篇算是对DB4o在WP7结贴篇幅.

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65034-1-1.html 上篇帖子: 我的第一个Windows Phone 7应用程序 下篇帖子: Windows 7操作系统中使用IIS,WinScp搭建ftp服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表