Windows Phone 7本地数据库的多样化访问

最近个人的时间显得比较紧迫. 有一些想法一直没有时间去验证.上周五在MSDN上公布的活动Silverlight Events:与John Papa面对面学习Silverlight 4中因为一时疏忽赶到MSDN会客厅是活动已经结束了. 不过我顺便看看活动中对JohnPapa提出问题: 其中有人明确提出Silverlight 下一版本会把本地数据库访问支持是否会在下一个Silverlight版本加入?[可惜我没有看到John Papa本人的回复]. 这突然让我联想到最近一直在看官方公布开源项目中Windows Phone 7对本地数据数据库操作方式. 恰好上周我做了一个SQlite相关测试. 有意无意间让我把Windows Phone 7 对本地数据库Local DataBase访问与开源数据库联系在一起.如下是我个人对WP7本地数据库访问方式的验证. 如有疑问请及时提出

Windows Phone 7在CTP 版本时微软官方就对开发者提出问题做了两次集体回应. 一次是在3月19日 另外一次是5月19日.回复内容详见Windows Phone 7 Series Developer General FAQ (Updated 5/19/2010), 内容中包含了WP7开发中多个细节和下一步需要改善的方向等做了明确回复. 当然其中也包含了大家很关心的数据访问. 具体回应内容如下:

在Windows Phone 7 Series的设备上有没有本地数据库可以利用?

没有,在最初的Windows Phone 7 Series上没有本地数据库API可以利用

我应该如何为我的应用程序存储信息?

你可以将信息存储在自己的存储空间里。如果你需要大型的数据库这里有一些选择:Windows Phone 7 Seires 已经支持WebServices,它可以让你容易的访问存储在Internet上的信息。使用一个可以被WebServices访问的数据库,你的应用程序就可以在连接Internet的情况下实时的获取数据.

以后会支持本地数据库吗?

当前我们没有宣告这样的计划来增加这一功能;但是我们会密切关注开发人员和用户的需求并识别哪些特性会给每个人带来好处

如上翻译过来,更多细节请查看原文.

目前WP7已经是Beta版本了. Windows Phone 7 支持访问数据几种方式为: XML、Isolated Storage[SL独立存储]、Cloud[云存储].    官方意思很明确 暂不支持本地数据库访问. 难道我们真的没有其他选择吗?未必如此.

<1>Effiproz For Windows Phone 7

在上一篇中由Effiproz DataBase来看.NET开源数据库发展我提到Effiproz开源数据库.NET多方面支持,其中就包含WP7.这为我们把Effiproz本地数据库提供访问WP7数据提供了可能.首先说明Effiproz运用在WP7条件:  Windows Phone Developer Tools Beta[最新版本]/VS2010[工具].

首先创建一个WP7程序 引入Effiproz数据库DLL[详见源码下载]到项目中:

创建一个界面用户输入用户名和密码并 保存到Effiproz数据库中:

数据插入成功后自动查询并实现出来:

也许有人会注意到两个FileDB和MemoryDB 按钮. 其实对应后台中Effproze数据两种存储数据模式:文件和内存模式. 上篇中我就曾讲到第一个纯.NET版本开源数据库出现问题矛盾就是这两种模式. 内存模式中数据提取直接 速度较快. 免去File模式读取硬盘IO和每次创建Connection的时间. 但是缺点也很致命. 速度虽然有了一定提升 但最终代价是我们数据无法再内存消失后存储. 也就是数据最终无法持久化存储文件中.  EffProze就是从HSQL继承而来. 所以保存这两种模式 供用户更多场景下选择. 先看一下FileDB模式代码实际创建:建:

  1. private void AddUserInfor_Click(object sender, RoutedEventArgs e)     
  2.     {     
  3.             //用户信息  
  4. WP7_LocalDBDemo.DataEntity.Customer newcustomer = new DataEntity.Customer  
  5.  {     
  6.    Username=this.username.Text,    
  7.   Password=this.passsword.Text   
  8.    };    
  9.   string dbname = @"wp7db.db3";   
  10. string getreply = string.Empty;//回调信息   
  11.   //如果数据库文件不存在 自动创建   
  12.  Sqlite3.sqlite3 newsqlite = new Sqlite3.sqlite3();   
  13.     int getres = Sqlite3.sqlite3_open(dbname,ref newsqlite);    
  14.  if (getres == Sqlite3.SQLITE_OK)    
  15.     {    
  16.      //创建表   
  17.        string sql = @"Create Table Customer   
  18.                       (    
  19.                    customername varchar(100),    
  20.                              customerpass varchar(100)  
  21.                      )  ";    
  22. Sqlite3.exec(newsqlite, sql, 0, 0, 0);   
  23. string insertsql = @"insert into Customer Values('"+newcustomer.Username+"','"+newcustomer.Password+"')";   
  24.      int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);   
  25.             if (getinsertres == Sqlite3.SQLITE_OK)    
  26.      {    
  27.             MessageBox.Show("数据插入成功!");    
  28.       }   
  29.           else    
  30.     {    
  31.         MessageBox.Show("数据插入失败!");   
  32.        }     
  33.          //自动查询数据    
  34.        string querysql = @"select * from Customer";   
  35. Sqlite3.dxCallback getcallback = new Sqlite3.dxCallback(TakeCallmethod);  
  36. int getlocalres=Sqlite3.sqlite3_exec(newsqlite,querysql,getcallback,null,ref getreply);    
  37.   if (getlocalres == Sqlite3.SQLITE_OPEN_READWRITE)  
  38.   {   
  39.    //需要一个执行Reader API?   
  40.    //this.listBox1.Items.Add(getresdd.ToString());    
  41.        }   
  42.         }    
  43.   } 

EffProze数据库基本上引入T-SQL大部分关键字支持,基本上合ADO.NET连接数据库方式雷同. 这也让.NET程序员不用再看EffProze新的API痛苦,而通过ADO.NET方式对比即可轻松编码.在代码中连接字符串中connection type=FILE/Memory 每次连接都需要指定采用数据库模式. 这是必须的. Memory模式大同小异不在赘述.

当有了EffProze数据库在WP7中作一些复杂数据操作. 是否考虑我们我们这样在代码方式太过粗糙原始. 我们需要一个查询工具.

当然EffPoze官方也为我们考虑到这点. 特意推出一款QueryTool. 当然有多个版本的,你想快速体验可以访问QueryTool in Silverlight 4 liveDemo 把QueryTool利用Silverlight 版本 4来实现. 另外一个版本需要到官方下载 QueryTool 1.2 Version[点击下载]:  提示目前工具支持.NET版本是3.5以上 本地运行:

如上提示我们需要打开数据库文件,Effproze数据库文件格式为: [.properties]  编写的SQL脚本对应格式为:[.Script]和SQl那一套完全不同.  下载文件中有实例数据库SamplyDB. 打开:

很简单布局,类似SQLSErver. 对T-SQl标准中关键字全面进行高亮支持. 这比SQlite工具要友好. 但我个人使用总体觉得很难受.  用户体验不太好. 其中涉及几个方面:

A:对T-Sql标准的有些关键字语法检查太过于严密. 大小写敏感. 写T-Sql出错几率大大增加.

B:工具功能过于简单. 左边菜单中除了展出和隐藏没有任何对DataBase和表 以及View /Proc的直接操作 只能用T-sql, 这样一来 我们队数据库操作全部靠T-sql 工作量剧增.

C:最令我不舒服的是 每次出现错误提示太过于简单. 特别大批量T-SQl 无法准确定位错误大概位置 那就更让人望而生畏了.

D:没有批量数据导入导出. 对于数据插入 没有这样的功能 工作量 真是太令人后怕了.

所以这个对使用这个工具原则是: 能避免使用就尽量避免使用. 基本上我昨天调试一个对数据库所有存储过程加密 调到最后看到下面始终不变错误提示我先崩溃掉了.真是很杯具啊. 各位也可以适当使用.

如上是EffProze数据库对WP7数据访问支持一个简单示例以及基本工具使用. 如有疑问请在留言中提出.我会及时回复 ,提供EffProze use In WP7本篇源码下载:

 /Files/chenkai/EffProzeInWp7Codechenkai.rar

<2>SQlite For Windows  Phone 7

在本地数据库访问其实我最先尝试SQlite,作为移动平台Android默认数据库大量运用,没有其他原因—只是因为我个人对Sqlite操作很熟. 虽然没有了WP7官方的支持. 但是开源社区力量无线的. 国外有人改写开源Sqlite 3版本使其支持WP7本地数据访问. 我们需要添加一个DLL: Community.CsharpSqlite.WP.dll [源码中]引用.

 创建一个简单页面测试 添加数据后自动查询数据并显示ListBox中:

插入数据成功 把插入数据通过自动查询方式显示在ListBox中 添加数据代码:

  1. private void AddUserInfor_Click(object sender, RoutedEventArgs e)    
  2.     {    
  3.        //用户信息   
  4. WP7_LocalDBDemo.DataEntity.Customer newcustomer = new DataEntity.Customer   
  5.            {     
  6.         Username=this.username.Text,    
  7. Password=this.passsword.Text    
  8.      };   
  9.      string dbname = @"wp7db.db3";    
  10.       string getreply = string.Empty;//回调信息   
  11.           //如果数据库文件不存在 自动创建   
  12.         Sqlite3.sqlite3 newsqlite = new Sqlite3.sqlite3();   
  13.    int getres = Sqlite3.sqlite3_open(dbname,ref newsqlite);    
  14.              if (getres == Sqlite3.SQLITE_OK)    
  15.       {   
  16.         //创建表   
  17.        string sql = @"Create Table Customer   
  18.         (   
  19.           customername varchar(100),  
  20.     customerpass varchar(100)   
  21.                            )  ";    
  22.          Sqlite3.exec(newsqlite, sql, 0, 0, 0);    
  23. string insertsql = @"insert into Customer Values('"+newcustomer.Username+"','"+newcustomer.Password+"')";  
  24.         int getinsertres = Sqlite3.exec(newsqlite, insertsql, 0, 0, 0);  
  25.                   if (getinsertres == Sqlite3.SQLITE_OK)  
  26.           {   
  27.    MessageBox.Show("数据插入成功!");   
  28.    }    
  29.         else   
  30.           {    
  31.       MessageBox.Show("数据插入失败!");   
  32.       }    
  33.     //自动查询数据     
  34.           string querysql = @"select * from Customer";  
  35. Sqlite3.dxCallback getcallback = new Sqlite3.dxCallback(TakeCallmethod);    
  36.                int getlocalres=Sqlite3.sqlite3_exec(newsqlite,querysql,getcallback,null,ref getreply);    
  37.           if (getlocalres == Sqlite3.SQLITE_OPEN_READWRITE)    
  38.           {    
  39.                    //需要一个执行Reader API?    
  40.                   //this.listBox1.Items.Add(getresdd.ToString());   
  41.            }    
  42.         }    
  43.     } 

SQlite 3修改后能够支持对WP7数据访问 .大概方式基本同EffProze有些雷同.  但是在实际编码中.Effproze封装API的基本同ADO.NET相似. 这样广大的.NET程序员无需再熟悉EffProze数据库自己API, 而修改SQlite 3支持WP7 不同的是. 这里SQlite 3完全创造自己的一套API. 和原来支持.NET 访问的ADO.NET For SQlite 3  DataProvders完全不同. 没有任何关联.

那就痛苦了.所以我们需要一个SQlite 3访问WP7 的详细API.  但是很遗憾.如果访问到这份API 需要科学.具体地址:Sqlite 3 For Windows Phoen Created API访问地址:  Sqlite 3 For Wp7 API 如有哪位同志科学成功 请备份这份API贡献出来吧.

SQlite 3支持了WP7的本地数据访问. 但是SQlite 3与EffProze最大特点是Sqlite 3没有数据库链接模式之分[内存/文件模式], 我在做完这个实例后 测试发现. 硬盘上不存在wp7db.db3这个文件. 因此我怀疑修改后SQlite 3版本对数据存储模式应该放到内存中的. 当然这是我个人猜测. 没有得到作者本人的证实.

如上写了一个建的Sqlite For Wp7 DEmo. 源码下载如下:

/Files/chenkai/WP7_LocalDBDemo.rar

<3>结语

本篇主要验证EffProze和修改Sqlite 数据库对Windows Phone 7 本地数据访问支持.  测试结果是可行的.这是第一篇 下一篇我会详细介绍其他方式来做WP7本地数据访问.  当然如上也是我个人测试. 难免会有纰漏的地方. 如果哟疑问请及时留言. 我会及时回复.

参考资料:

Sqlite 3 For Windows Phoen Created

Sqlite 3 For Wp7 API

LocalDAtaBase  For Windows  Phone 7

DotaSys Windows  Phone 7  Demo

原文标题:多样化实现Windows Phone 7本地数据库访问<1>

链接:http://www.cnblogs.com/chenkai/archive/2010/09/01/1815186.html

【编辑推荐】

  1. 用NoSQL来替代MySQL在Digg中的原因
  2. MongoDB CEO谈NoSQL的大数据量处理能力
  3. 专访盖国强:NoSQL很火 但还需市场检验
  4. 详解NoSQL数据库使用实例
  5. 云计算时代NoSQL当道 关系数据库日薄西山 

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/241192.html<

(0)
运维的头像运维
上一篇2025-04-24 05:34
下一篇 2025-04-24 05:36

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注