终于把这篇文章发出来了. 对于Windows Phone 7 Visit Local DataBase新采用DB4O和SiaqoDB方式来验证 本地数据访问. 其实这篇已经在上周 完成一个大概草稿. 中间再CodePlex看到一个Dvp写的一段关于Perst数据库使用心得 回过头一看又觉得自己写的有些关于SiaqoDB细节上有失严谨. 于是乎又不断查看多方资料来反复利用实际编程的方式来验证. 可惜的是这方面资料基本没有,对于某些想法只能动手尝试 ok let’s get start!……


关于Windows Phone 7 本地数据库访问的选择 JackLin 已经完整的总结了一篇文章浅谈Windows Phone 7本地数据库的选择. 而今天我的工作就是验证他在这文章中提出的DB4O和SiaqoDB两种访问方式. 至于文中提到的EffiProz Database/Windows Phone DataBase/Sqlite for Windows Phone 7 三种方式已经前两篇完整验证. 可以参考.



对于这个DB40, 我也是很偶尔中看到. 起初对于这个纯开源的面向对象的数据引擎 没有太过重视. 关于WP7本地数据访问我先测试SQlite和Effoproze . 但是使用完DB4O不得不说它本身特点相比其他开源数据库非常突出:



A:在官方[DB4O WebSite]的宣传语中就说到We are Free. DB4O的完全靠的开源社区的驱动力量来进行开发. 意味它是免费的.


B:原生数据库: 为什么说是原生.db4o 是 100% 原生的面向对象数据库,直接使用编程语言来操作数据库。程序员无需进行 OR 映射来存储对象,大大节省了程序员在存储数据的开发时间, 这让我想到Rails框架中ORM映射和.NET从java翻版过来的Nhibernate. 想想我们以前做OO编程时 把一个面向对象的类存储到关系型数据库中 总是难以避免走到这一步.


ORM层将数据库表映射到类, 将表中记录映射成一个实例对象. 将字段映射成对象的属性.类方法则对应做的是表级别的操作, 实例方法则用于执行对单条记录的操作. 这样直接对OO 操作的数据持久化操作 业界对Nhibernate性能上担忧 但DB4O 在性能上如何?


C:高性能: db4o 官方公布的基准测试数据,db4o 比采用 Hibernate/MySQL 方案在某些测试线路上速度高出 44 倍之多. 更多相关测试请参考官方[DB4O WebSite]文档.


D:易签入.使用 db4o 仅需引入 400 多 k 的 jar 文件或是 dll 文件,内存消耗极小 无需管理 而且跨平台.


大概介绍DB40特点 下面快速进度WP7开发去体验一番.



在进行DB40 For Windows pheon 7开发前需要下载DB4O开源组件:


下载地址.NEt 3.5版本:DB40 Download Link[DB4O 7.12 For .NEt 3.5]


下载完成后自动安装. 会在系统C盘符上生成一个目录. ok let’s Create new WP7 Application For Test:


<2.1>添加引用


测试项目TestDB4OLocalDemo 创建完成后 需要添加引用, 找到DB4O默认安装目录:


C:\Program Files\db4o\db4o-7.12\bin\net-3.5


下添加Db4objects.Db4o.DLLDb4objects.Db4o.Linq.DLL引用&#xff1a;



引用结果:



添加引用完成后后台页面引入:



  1. //添加引用     
  2. using Db4objects.Db4o;     
  3. using Db4objects.Db4o.IO;     
  4. using Db4objects.Db4o.Query;     
  5. using Db4objects.Db4o.Linq; 

为了达到演示目的 将先在WP7界面实现DB4O数据库基本的CRUD操作, 这时我们需要一个操作实体对象Customer类 定义如下:



  1. ///      
  2. /// 定义数据承载实体信息Customer     
  3. /// Author&#xff1a;chenkai Date:2010年9月24日10:25:38     
  4. ///      
  5. public class Customer     
  6. {     
  7. public int Id { get; set; }     
  8. public string CustomerName { get; set; }     
  9. public string CustomerPhone { get; set; }    
  10. public int Age { get; set; }    
  11. public DateTime CreateDate { get; set; }  

WP7界面我们先初始化数据,然后根据CustmerName属性查询数据, 删除操作则对应CustomerID来删除,演示界面:



来看一下后台文件关于DB4O数据库初始化时插入数据具体操作,当开始第一次运行时 提示一个异常信息:



提示的意思是我们目前的.NET版本不对. 注意目前DB4O数据在官方中下载文件对应.NEt两个版本.2.0和3.5 这是7.12版本,所以在建立WP7时把默认的.NET 4.0更改为3.5 , 如果当修改WP7.NEt版本为对应的版本后依然提出这个问题.这个问题困扰我好一阵终于在WeAsk-上找到类似问题 来看一下我打开一个DB4O数据库文件的操作代码:



  1. //打开并自动创建一个TESt.DB4O文件     
  2. string dbfilepath &#61; &#64;"E:\DB4o\test.db4o";     
  3. IObjectContainer getdb40 &#61; Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), dbfilepath); 

这个问题困扰我好一阵.后来在Weask上问了Grouper 当我们通过OpenFile自动创建一个固定路径上的DB4O文件,DB4O对于.NET版本的嵌入式开发需要特殊的配置.Db4oEmbedded.NewConfiguration()实现的是 IEmbeddedConfiguration接口.IEmbeddedConfiguration接口包含了在嵌入式模式下具体配置的方法.所以在NewConfiguation()需要配置Config中适用的范围即ConfigScope.



  1. ///      
  2. /// Configuation The DB4O     
  3. ///     
  4. public static IEmbeddedConfiguration ConfigureReplication()    
  5. {     
  6. IEmbeddedConfiguration db4oConfig &#61; Db4oEmbedded.NewConfiguration();     
  7. db4oConfig.File.GenerateUUIDs &#61; ConfigScope.Globally;     
  8.  
  9. db4oConfig.File.GenerateVersionNumbers &#61; ConfigScope.Globally;    
  10. return db4oConfig;//(IConfiguration)    

问题依然存在. 执行到Db4oEmbedded.NewConfiguration()时依然会提示一个同样的.NET版本异常. 这个问题困扰我一个上午.看一下按钮事件中完整代码:当初始化数据时通过后台添加3条记录并查询DB4O中数据记录数量是否为 3 判断插入数据是否成功 代码如下:



  1. private void ReadlyDate_Click(object sender, RoutedEventArgs e)   
  2. {     
  3. //创建数据库     
  4. try     
  5. {     
  6.             string dbfilepath &#61; &#64;"E:\DB4o\test.db4o";     
  7.             string getfilepath&#61;&#64;"testdb.db4o";     
  8.              //IObjectContainer getdb40 &#61; Db4oEmbedded.OpenFile(MainPage.ConfigureReplication(), getfilepath);    
  9.                //Db4oEmbedded.NewConfiguration    
  10.                IEmbeddedConfiguration configuration &#61; Db4oEmbedded.NewConfiguration();    
  11.                configuration.File.GenerateUUIDs&#61;ConfigScope.Globally;    
  12.                  configuration.File.GenerateVersionNumbers&#61;ConfigScope.Globally;    
  13.                  IObjectContainer getdb40 &#61; Db4oEmbedded.OpenFile(configuration, getfilepath);     
  14.                  List initialCustomerlist &#61; new List    
  15.              {    
  16.                   new Customer{ Id&#61;1002, CustomerName&#61;"chenkai", CustomerPhone&#61;"052-854652", Age&#61;28, CreateDate&#61;DateTime.Now},    
  17.                    new Customer{ Id&#61;1003, CustomerName&#61;"jackchen", CustomerPhone&#61;"014-778546",   
  18.                   new Customer{ Id&#61;1004, CustomerName&#61;"markDinel", CustomerPhone&#61;"062-634652", Age&#61;28, CreateDate&#61;DateTime.Now},    
  19.               };    
  20.  
  21.                //insert to DB4o   
  22.                if (initialCustomerlist.Count > 0)    
  23.              {    
  24.                  this.listBox1.Items.Clear();    
  25.                      foreach (Customer getcustomer in initialCustomerlist)   
  26.                      {    
  27.                         //插入数据    
  28.                         getdb40.Store(getcustomer);    
  29.                       this.listBox1.Items.Add(getcustomer.CustomerName &#43; "已存储&#xff01;");    
  30.                    }    
  31.                 }    
  32.  
  33.              //cofrim 是否插入成功  查询数据    
  34.                Customer typecutomer &#61; new Customer();    
  35.                 IObjectSet getobjset &#61; getdb40.QueryByExample(typecutomer);    
  36.  
  37.              if (getobjset.Count &#61;&#61; 3)    
  38.                {    
  39.               MessageBox.Show("数据插入成功&#xff01;");    
  40.                }    
  41.              else   
  42.                {    
  43.                   MessageBox.Show("数据插入失败&#xff01;");    
  44.                 }    
  45.      
  46.                //Close 操作    
  47.                getdb40.Close();   
  48.            }   
  49.             catch (Exception se)    
  50.         {    
  51.                MessageBox.Show("初始化DB4O数据时出现异常:" &#43; se.Message);   
  52.             }   
  53.        } 

目前遇到问题是WP7 引用DB4O后在Windows Phone 7 Application中提示一个.NET FrameWork版本异常?始终无法解决.


经过一番很费力的查找在官方开发者论坛同样有人遇到这样的问题. .NEt FrameWork Version Problem?? 但是他是在进行AND移动程序和Desklop桌面程序数据进行同步时.


在DB4O官方对开发者对应下载页面: [Developer Download Link] 对DB4O存在多个下载版本&#xff1a;



可下载适用DB4O多个版本[只看.NEt支持]:


DB40 For .NET 2.0/3.5 Version:7.12.156


DB40 For .NET 2.0/3.5 Version:7.4.155


DB40 For .NET 2.0/3.5/4.0 Version:8.0.156


大概查看一下Version 8.0之间 的Realse Note: 查看最新的Release Notes 8.0.156&#xff1a;


COR-1339 - Check db4o against latest Silverlight SDK


等于说在最新的支持.NEt 4.0的DB4O 8.0中对Silverlight支持. 我们再来查看相关个DB40关于Silverlight和Windows Phone支持详细文档:


[db4o - Silverlight based RIA datastore]


[db4o - Windows Phone database]


DB4O对Windows Phone支持中明确提到:



.NET 4.0 support and Silverlight version

db4o now supports .NET 4.0 and has been ported to Silverlight! In order to get it you just need to download the .NET installer.


DB4O现在已经支持.NEt 4.0版本 这样一来基本目前所有的.NEt版本DB4O都已经支持. 不过对Silverlight最新版本支持正在开发. 目前DB4O对Silverlight支持版本为Silverlight 3. DB4O可以免费使用在任何的Windows Phone 设备程序中. 那应该我们对应支持版本有问题 下载最新的DB4O8.0 版本[需要注册]:


[DB40 Last Version 8.0 Download link db4o for .NET 4.0, version 8.0.160.14822 ZIP]


在DB4O官方注册用户有一个很怪现象 只要你的机器装了.NEt 4.0 在提交用户信息后始终会提示一个运行时异常 :



导致无法 注册 后来我通过一个同事在java开发环境注册成功.


下载完成后 打开Bin目录可以看到其中已经集成对Silverlight 3支持:



重新建立一个WP7 Application 选择的.NET版本为.NET 4.0 引用DB4O版本为8.0 其他均不做修改 运行提示如下:



调用Db4oEmbedded.NewConfiguration()时 无法找到NewConfiguartion()方法 或提示尝试访问该方法调用失败.


天啊 DB4O真是如此的折磨人&#xff01;.我分别用了不同.NEt版本来测试同一个DB4O版本 结果还是无功而返. 我顺便产看官方给出演示Demo实例. 可惜没有关于Windows Phone 7的相关Demo. 从刚开始提示.NET版本问题到现在NewConfiguation()方法无法访问. 希望碰到相关问题或是对DB4O基于WP7本地数据访问已经成功案例 能够共享出来.


很遗憾 我利用假期又做了其他版本的尝试 结果还是一样. 关于DB4O在Windows Phone 7上的本地数据访问 测试失败.



DB4O在WP7我测试访问本地数据没有成功.官方明确提示是对Windows mobile 6.0/6.5都是支持的. 当然在DB4O相对其他开源第三方的数据 很有特点. 现在已经有很多企业把DB4O作为开发的底层数据交互对象来进行考虑. 关于这个WP7问题 我们一直无法解决. 当然不是说没有替代方法. 可以在WP7程序建立一个数据服务层用.NET类库实现对数据库DB4O访问 然后留用WCF服务的方式对外发布访问接口 在由WP7引用服务即可访问. 如果哪位有更好的方法方式来解决这个问题. 请在留言中提出…………


参考资料:


DB4O 7.0 中文参考指南[Java版本文档 有教程] 对照翻译版


WeAsk-DB4O use in Windows Phone


Silverlighti and DB4O UserFrom


DataBase in WindowsPhone