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的使用。尽管如此,有关这款软件的真正实用性的技巧性的东西,还有待读者您的进一步挖掘。

  • 相关阅读:
    右上角的 那个 个数,
    i am sorry,
    搞定了,一个是重复,一个是 判断navigationcontroller里面 最后的那个类,
    ios no code signature found,
    这次逻辑通了,
    分析下现在 遇到的这个棘手的问题,
    时间 折腾我的,
    老大说 调到 4寸的 就不用适配 5了,
    应用程序生命周期,
    解决【npm ERR! Unexpected end of JSON input while parsing near '...sh_time":141072930277'】方案
  • 原文地址:https://www.cnblogs.com/fx2008/p/2444059.html
Copyright © 2011-2022 走看看