多样化实现Windows Phone 7本地数据访问3——DB4O
终于把这篇文章发出来了. 对于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:chenkaiDate:2010年9月24日10:25:38
- /// </summary>
- publicclass Customer
- {
- publicintId { get;set; }
- publicstring CustomerName { get;set; }
- publicstring CustomerPhone { get;set; }
- publicintAge { get;set; }
- publicDateTime 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>
- publicstaticIEmbeddedConfiguration ConfigureReplication()
- {
- IEmbeddedConfiguration db4oConfig = Db4oEmbedded.NewConfiguration();
- db4oConfig.File.GenerateUUIDs = ConfigScope.Globally;
- db4oConfig.File.GenerateVersionNumbers = ConfigScope.Globally;
- returndb4oConfig;//(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},
- };
- //inserttoDB4o
- if (initialCustomerlist.Count> 0)
- {
- this.listBox1.Items.Clear();
- foreach (Customer getcustomerininitialCustomerlist)
- {
- //插入数据
- 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
DataBase in WindowsPhone
本文转自chenkaiunion 51CTO博客,原文链接:http://blog.51cto.com/chenkai/764484
多样化实现Windows Phone 7本地数据访问3——DB4O相关推荐
- 多样化实现Windows phone 7本地数据访问5——深入Rapid Repository
上一篇多样化实现Windows Phone 7本地数据访问<4>--Rapid Repository 中初步的介绍Repid Repository作为Windows phone 7数据库 ...
- [转载]Windows Phone 系列- 本地数据存储
http://www.cnblogs.com/sunjunlin/category/356304.html Windows Phone 应用程序可以使用独立存储将数据储存到手机本地.应用程序可以通过三 ...
- Windows系统启动MongoDB本地可以访问,远程连接不上问题
我在windows系统上安装了mongodb之后,本地测试了一下,可以连接上,但是远程访问时候发现连接被拒绝.网上百度说是配置文件默认只能访问本地,需要改mongod.cfg配置文件.然而改了之后重启 ...
- 数据访问模式二:数据集和数据适配器(传统的数据访问模式)
上一篇文章介绍了使用DataSource控件访问数据库的过程,本节介绍利用数据适配集/数据适配器的访问数据库.这两种设计模式的差别,使得GridView的设计即要支持DataSource控件的数据绑定 ...
- windows mobile开发循序渐进(4)移动应用程序的数据存储之本地数据存储第二篇
之所以分解来写,是因为在写的过程中会有些穿插的工作,希望能够尽量写的更细节一些. 上篇说的是本地存储的XML和DataSet之间的交互,现在我们来看看windows mobile 是如何与数据库进行交 ...
- 如何在本地数据中心安装Service Fabric for Windows集群
概述 首先本文只是对官方文档(中文,英文)的一个提炼,详细的安装说明还请仔细阅读官方文档. 虽然Service Fabric的官方名称往往被加上Azure,但是实际上(估计很多人不知道)Service ...
- Windows 8 应用开发 - 本地数据存储
原文:Windows 8 应用开发 - 本地数据存储 在应用中通常会遇到用户主动或被动存储信息的情况,当应用关闭后这些数据仍然会存储在本地设备上,用户下次重新激活应用时会自动加载这些数据.下面将通过一 ...
- 与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密...
原文:与众不同 windows phone (28) - Feature(特性)之手机方向, 本地化, 应用程序的试用体验, 系统主题资源, 本地数据的加密解密 [索引页] [源码下载] 与众不同 w ...
- Silverlight入门:第三部分 - 数据访问
现在我们已经有了一个基础布局,同时也在上面放了一些控件,接下来让我 们开始获取数据.因为我们想要搜索Twitter上的内容,所以我们需要充分使用 他们提供的Web服务API.在继续之前,我要先说明在本 ...
最新文章
- “编程不规范,同事两行泪!”
- python处理excel表格实例-使用Python操作excel文件的实例代码
- 使用ASP.NET 2.0提供的WebResource管理资源
- C++中const用法总结
- mysql insert 几分钟_我们可以在MySQL中应用INSERT语句时向VARCHAR日期时间记录添加分钟吗?...
- 字符串equal_Java String:字符串常量池
- 一步步实现SDDC-双节点VSAN部署
- dplayer js控制 自动全屏_vue 中使用video.js 实现m3u8视频播放格式
- 日调度5万亿次 腾讯云微服务架构体系TSF深度解读
- android listview 分页
- redis数据类型之sorted set
- linux内核启动的优化
- 腾讯云服务器安装AMH控制面板
- 51单片机(1)-开发工具介绍及软件安装
- android appium 原理,天天使用Appium,但是你真的理解Appium的工作原理吗
- iOS逆向之微信和支付宝修改步数 简洁无脑版
- 大前研一/聰明人必做的十件事
- android 微信浮窗实现_Android 悬浮窗功能的实现
- 常用颜色的RGB值及中英文名称
- js中undefined