zoukankan      html  css  js  c++  java
  • [转载]微软WP7本地数据库之Sqlite编程技巧下

    上一篇文章中我们简要介绍了Sqlite
    Client for Windows
    Phone的主要功能及相关的辅助开发工具。特别注意的是,我们通过工具类DBHelper实现了SQLite数据库与WP7系统本地存储功能的关联。在本篇文章中,我们将着手构建一个简单的Windows
    Phone 7客户端应用程序,并将具体探讨Sqlite Client for Windows Phone在WP7开发中的基本应用思路和相关编程技巧。

      本系列文章中的案例程序调试环境:


      1. Windows 7;


      2. .NET 4.0;


      3. Visual Studio 2010;


      4. Windows Phone Developer Tools RTW;


      5. Sqlite Client for Windows Phone
    (http://sqlitewindowsphone.codeplex.com/);


      6. (推荐) sqlite-manager (http://code.google.com/p/sqlite-manager/);


      7. (推荐) MVVM Light Toolkit (http://mvvmlight.codeplex.com/).


      一、构建简易数据驱动型WP7客户信息编辑器


      启动Visual Studio 2010中创建一个简单的Windows Phone
    7应用程序,并命名为WP7SQLiteClient。然后,打开解决方案,并添加一个到程序集Community.CsharpSqlite.WP.dll的引用(在上文中刚刚构建的Sqlite
    Client for Windows Phone源码工程的bin目录下)。


      1.运行时的截图预览


      为了能够更好地了解后文的解释,让我们首先看一下示例程序的运行时快照,如图1和2所示。


    d
    ▲图1. 客户编辑器的初始画面


       注意到,在最初的客户编辑器截图中只提供了三个使用Sqlite
    Manager工具创建的记录。当您点击按钮“Add”后将有五个客户被添加到客户表Customer中。在此示例中,我没有立即刷新屏幕。但是,如果您按下硬件后退按钮(我们已经使用了仿真器),然后再次导航回到这个屏幕,你便会看到新追加的5条记录,如图10所示。


    d
    ▲图2.
    五个客户记录添加到表Customer中



      现在,按下图中的按钮“Del Last
    1”,则数据库database1.sqlite中Customer表格中的最后一个记录将被删除。图3给出了相关截图。


    d
    ▲图3.
    最后一条记录从表Customer中删除


      接下来,让我们看看后台代码中的具体编程技术。


      2.后台代码编程


      首先,为了实现数据库的全局访问的方便(例如从每一个子页面中访问数据库),我们最好在App类中定义一个公共属性db。


      清单2:在App类中定义一个公共属性db方便数据库访问





      public partial class App :
    Application

      {

      
    private DBHelper
    _db;

      
    public DBHelper db

      {

      
    get

      {

      Assembly assem
    =
    Assembly.GetExecutingAssembly();

      
    if (_db == null)

      _db
    =
    new
    DBHelper(assem.FullName.Substring(
    0,
    assem.FullName.IndexOf(
    ',')), "database1.sqlite");

      return
    _db;

      }

      }

      
    / /
    ...其他省略


      注意到,公共属性db关联到上文中的工具类DBHelper。另外,请注意我们是如何使用程序集相关操作并结合上文中SQLite数据库文件的Build
    Action属性来实现访问这个数据库文件的。


      上述短短的代码足矣。接下来,让我们在示例页面TestDataEditor.xaml相应的后台代码文件TestDataEditor.xaml.cs中实现一些基本的初始化操作。


      清单3:





      / /其他省略...

      using
    WP7SQLiteClient.Dal;

      using System.Collections.ObjectModel;
    //ObservableCollection

      using
    System.ComponentModel;

      using SQLiteClient;






      using Community.CsharpSqlite;


      using System.Collections;


      namespace WP7SQLiteClient


      {


      public partial class TestDataEditor : PhoneApplicationPage


      {


      ObservableCollection _customerEntries = null;


      public TestDataEditor()

     

        
    {

      InitializeComponent();

      
    //retrieve
    dat

      
    string strSelect = "SELECT
    ID,Name,Email,Desc FROM Customer ORDER BY ID ASC
    ";

      _customerEntries
    =
    (Application.Current
    as
    App).db.SelectObservableCollection(strSelect);

      foreach (Customer data
    in _customerEntries)

      {

      TextBlockID.Text
    += data.ID
    +
    Environment.NewLine;

      TextBlockName.Text
    +=data.Name
    +
    Environment.NewLine;

      TextBlockEmail.Text
    +=data.Email
    +
    Environment.NewLine;

      TextBlockDesc.Text
    +=data.Desc
    +
    Environment.NewLine;

      }

      }

      
    / /其他省略...


      在上面的代码中,我们首先定义了一个ObservableCollection
    类型的变量_customerEntries。然后,在类构造器中我们建立了一个标准的SQL的SELECT命令的字符串。接下来,通过调用定义于全局App类中DBHelper类相关实例中的方法SelectObservableCollection,实现把所有客户的数据提取到变量_customerEntries中。最后,通过迭代一个结构集合,成功地实现了在屏幕上显示所有客户数据之目的。


      接下来,再看看具体的相关编码吧。


      1. 添加记录


      现在,让我们看看是如何把五个样本客户数据添加到客户表中的。


      清单4:





      private void btnAdd_Click(object sender,
    RoutedEventArgs e)

      {

      DateTime start
    =
    DateTime.Now;

      
    int rec;





            Random rnd = new
    Random();

      
    string strInsert = " Insert into
    Customer (Name,Email,Desc) values (@Name,@Email,@Desc)
    ";

      
    for (int i = 0; i < 5; i++)

      {

          Customer tst = new
    Customer

      {

      Name
    = "Name " + i,

      Email
    = Name
    +
    "@" + "aaa.com",

      Desc
    = "Desc for
    "
    +
    i

      };

      rec
    = (Application.Current as App).db.Insert
    <
    Customer
    >(tst,strInsert);

      }

      System.Diagnostics.Debug.WriteLine(
    "\nInserted 5
    "
    +
    "
    rows\r\nGenerated in
    " + (DateTime.Now -
    start).TotalSeconds);

      }


      2. 删除记录


      删除操作更简单,如清单5所示。


      清单5:





      private void btnDel_Click(object sender,
    RoutedEventArgs e)

      {

      DateTime start
    =
    DateTime.Now;

      
    string strDel = " Delete from Customer where ID="+ "(SELECT COUNT(*) FROM Customer)"
    ;

      (Application.Current
    as
    App).db.Delete(strDel);

      }


      在上面的代码,客户表中的最后一个记录将被删除。显然,要编写复杂和全功能的SQL语句,你应该先熟悉SQLite数据库相关的语法。事实上,这并不是一件难事,因为有关于SQLite的教程在网站可以轻松搞到(例如这里http://www.sqlite.org/lang.html)。


      二、总结


      在本系列文章中,我向您介绍了一款强大且易于使用的支持Windows Phone 7开发的开源嵌入数据库系统-Sqlite Client for
    Windows Phone。正如您所看到的,在文中,我给出的仅仅是有关Sqlite Client for Windows
    Phone的入门性使用方法。但是,也看到了基于传统型SQL数据库操作知识,你可以轻松掌握Sqlite Client for Windows
    Phone的使用。尽管如此,有关这款软件的真正实用性的技巧性的东西,还有待读者您的进一步挖掘。

  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/fx2008/p/2444059.html
Copyright © 2011-2022 走看看