终于把这篇文章发出来了. 对于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.DLL和Db4objects.Db4o.Linq.DLL引用:
引用结果:
添加引用完成后后台页面引入:
- //添加引用
- using Db4objects.Db4o;
- using Db4objects.Db4o.IO;
- using Db4objects.Db4o.Query;
- using Db4objects.Db4o.Linq;
为了达到演示目的 将先在WP7界面实现DB4O数据库基本的CRUD操作, 这时我们需要一个操作实体对象Customer类 定义如下:
- /// <summary>
- /// 定义数据承载实体信息Customer
- /// Author:chenkai Date:2010年9月24日10:25:38
- /// </summary>
- public class Customer
- {
- public int Id { get; set; }
- public string CustomerName { get; set; }
- public string CustomerPhone { get; set; }
- public int Age { get; set; }
- 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数据库文件的操作代码:
- //打开并自动创建一个TESt.DB4O文件
- string dbfilepath = @"E:\DB4o\test.db4o";
- IObjectContainer getdb40 = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), dbfilepath);
这个问题困扰我好一阵.后来在Weask上问了Grouper 当我们通过OpenFile自动创建一个固定路径上的DB4O文件,DB4O对于.NET版本的嵌入式开发需要特殊的配置.Db4oEmbedded.NewConfiguration()实现的是 IEmbeddedConfiguration接口.而IEmbeddedConfiguration接口包含了在嵌入式模式下具体配置的方法.所以在NewConfiguation()需要配置Config中适用的范围即ConfigScope.
- /// <summary>
- /// Configuation The DB4O
- /// </summary>
- public static IEmbeddedConfiguration ConfigureReplication()
- {
- IEmbeddedConfiguration db4oConfig = Db4oEmbedded.NewConfiguration();
- db4oConfig.File.GenerateUUIDs = ConfigScope.Globally;
- db4oConfig.File.GenerateVersionNumbers = ConfigScope.Globally;
- return db4oConfig;//(IConfiguration)
- }
问题依然存在. 执行到Db4oEmbedded.NewConfiguration()时依然会提示一个同样的.NET版本异常. 这个问题困扰我一个上午.看一下按钮事件中完整代码:当初始化数据时通过后台添加3条记录并查询DB4O中数据记录数量是否为 3 判断插入数据是否成功 代码如下:
- private void ReadlyDate_Click(object sender, RoutedEventArgs e)
- {
- //创建数据库
- try
- {
- string dbfilepath = @"E:\DB4o\test.db4o";
- string getfilepath=@"testdb.db4o";
- //IObjectContainer getdb40 = Db4oEmbedded.OpenFile(MainPage.ConfigureReplication(), getfilepath);
- //Db4oEmbedded.NewConfiguration
- IEmbeddedConfiguration configuration = Db4oEmbedded.NewConfiguration();
- configuration.File.GenerateUUIDs=ConfigScope.Globally;
- configuration.File.GenerateVersionNumbers=ConfigScope.Globally;
- IObjectContainer getdb40 = Db4oEmbedded.OpenFile(configuration, getfilepath);
- List<Customer> initialCustomerlist = new List<Customer>
- {
- new Customer{ Id=1002, CustomerName="chenkai", CustomerPhone="052-854652", Age=28, CreateDate=DateTime.Now},
- new Customer{ Id=1003, CustomerName="jackchen", CustomerPhone="014-778546",
- new Customer{ Id=1004, CustomerName="markDinel", CustomerPhone="062-634652", Age=28, CreateDate=DateTime.Now},
- };
- //insert to DB4o
- if (initialCustomerlist.Count > 0)
- {
- this.listBox1.Items.Clear();
- foreach (Customer getcustomer in initialCustomerlist)
- {
- //插入数据
- getdb40.Store(getcustomer);
- this.listBox1.Items.Add(getcustomer.CustomerName + "已存储!");
- }
- }
- //cofrim 是否插入成功 查询数据
- Customer typecutomer = new Customer();
- IObjectSet getobjset = getdb40.QueryByExample(typecutomer);
- if (getobjset.Count == 3)
- {
- MessageBox.Show("数据插入成功!");
- }
- else
- {
- MessageBox.Show("数据插入失败!");
- }
- //Close 操作
- getdb40.Close();
- }
- catch (Exception se)
- {
- MessageBox.Show("初始化DB4O数据时出现异常:" + se.Message);
- }
- }
目前遇到问题是WP7 引用DB4O后在Windows Phone 7 Application中提示一个.NET FrameWork版本异常?始终无法解决.
经过一番很费力的查找在官方开发者论坛同样有人遇到这样的问题. .NEt FrameWork Version Problem?? 但是他是在进行AND移动程序和Desklop桌面程序数据进行同步时.
在DB4O官方对开发者对应下载页面: [Developer Download Link] 对DB4O存在多个下载版本:
可下载适用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:
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真是如此的折磨人!.我分别用了不同.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
本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/764484