博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Phone(三)WP7版 " 记账本" 开发(使用SQLite数据库)
阅读量:6955 次
发布时间:2019-06-27

本文共 7399 字,大约阅读时间需要 24 分钟。

  使用这个SQLite数据库太纠结了..., ( O(∩_∩)O~欢迎拍砖...) ,所有代码砍掉了try...catch之类的东东,是为了尽可能简约明朗的说明问题.

第一部分:  遇到的问题 :

      1. 在前一篇()我大概介绍了SQLite的使用方法,但在自己使用SQLite开发这个记账本程序的时候却遇到了N多问题,比如最头疼的问题: 数据怎么从SQLite数据库中取出来? 是的,你会说 Community.CsharpSqlite.WP.dll不就提供了一个方法吗?  ExecuteQuery<T>()  不就可以吗? 是的,是可以,你得这么做(代码如下):  这个dll提供的方法实在是少的可怜,仅仅只有这一个方法,可以.Tolist(), .ToArray().ToDictionary();

public ....ExecuteQuery(...)    {
.......... IEnumerable
query = cmd.ExecuteQuery
(); return query.ToList(); ........... } public class Account { ///
/// 编号 /// public int id { get; set; } ///
/// 用户编号 /// public int userId { get; set; } ......... }

觉得不麻烦吗? 好吧,如果你的User类也要用这个方法呢? 你需要把这个ExecuteQuery()这个方法抽出来通用,那么这里的cmd.ExecuteQuery<Account>()中Account怎么处理呢,替换为  Object  ? 这是会报错的...这个地方我还不知道怎么处理???求路过的童鞋看看有什么好的解决方法,

      我想应该不只有这一个dll,然后我就去网上去淘啊,淘啊,淘...O(∩_∩)O哈哈~ 

      让我淘到了:Community.CsharpSqlite.SqlLiteClient.WP7.dll, Community.CsharpSqlite.WP7.dll  ,神器啊....然后就杯具了...(最后提供下载)

      这俩dll提供了读取数据的方法,但是不知道为什么,dll中的方法,在运行时方法名字变了..例如: read()-->reading(),太纠结了...还有其它一些问题就不细说了.

      可能我下载的dll是被人家修改过的,如果哪位有更好的,求分享!!!,或者有解决方法也行...

最后木有办法,只好继续使用  Community.CsharpSqlite.WP.dll 先提一个,也是不知道为什么,有些汉字输入会报错,例如,你输入'大米' 程序会报'大'引发异常...

第二部分:  记账本开发 

     1. 帮助类: SQLiteHelper  

       (1)  设置连接字符串:

             public static SQLiteConnection myDB = null;

             private static string fileName = "AccountData.DB";

            //fileName="Version=3,uri=file:AccountData.sqlite";-->这个是Community.CsharpSqlite.SqlLiteClient.WP7.dll定义数据库文件的方式

      (2)  创建数据库:

             打开数据库,如果数据库不存在就创建这个数据,-->这个是自动的,

             问题来了: 如果数据库不存在,直接创建数据库,顺便创建表:(表Account),如果数据库存在,就不能再创建表了啊,但是这个打开和创建数据库是自动的

的楼主直接在SQL语句中写" create table if not exists Account(....",  可以在这里判断一下表存在与否 TabbleIsExist()

SELECT COUNT(*) FROM sqlite_master where type='table' and name='Account'

                        表Account不存在我才创建;

              之前看到过创建数据库表自增字段的方式,发现好多都是错误的,正确的方式如下,并且表只能有一个主键.至少SQLite中是这样:

CREATE TABLE Account(

             [id] INTEGER PRIMARY KEY AUTOINCREMENT,  --主键,自增

             [userId] INTEGER NOT NULL ,

             [itemID]INTEGER ,

             [item] nvarchar NOT NULL ,  --数据类型大小写木有区别,但是大小写统一比较好

             [cost] INTEGER ,

             [costTime] datetime ,  --大小写木有区别

             [mark] int NOT NULL   --使用int也是可以的

) ;

       (3)  ExecuteNonQuery()方法: 这个没有什么说的,很简单,后面的代码中都有...

   (4)  GetListAccount()方法: 是我要说的重点,弄这个太纠结了....

                 我们知道,WP7不支持DataTable,也木有其它的什么好东东可以承载数据,怎么办,只好直接使用 Account类来接收数据,

                 返回一个List<Account>,这样数据就出来了..

                   IEnumerable<Account> query = cmd.ExecuteQuery<Account>();

                   return query.ToList();

               悲剧的很...以后凡是涉及到数据查询,读取数据的都只能在这个方法上面折腾了...也是因为如此,我才花费N多时间折腾其它方式,

               木有办法最后还是回到了这里...哎呦...

              以下是帮助类具体代码:

SQLiteHelper
public class SQLiteHelper    {                /*     *  数据库名: AccountData.DB         建表:        a用户表: User        id(编号)          int  pk  uq        name(用户名)      nvarchar        CreateTime(时间)  datetime        b消费表: Account        id(编号)          int pk  uq        userId(用户编号)  int        itemId(消费项编号)int uq        item(消费项)      nvarchar        cost(消费金额)    int        costTime(消费时间)dateTime        mark(标志位1 生活必须,2 奢侈享受) int     */        #region 构造函数        public SQLiteHelper()        {        }          #endregion              ///         /// 连接字符串  需要修改        ///         public static SQLiteConnection myDB = null;         private static string fileName = "AccountData.DB";//"Version=3,uri=file:AccountData.sqlite";                //这里先定数据库,之后再修改为参数化...        ///         /// 创建数据库        ///         public static void CreateDB()        {            if(myDB==null)            {                try                {                    //@1 使用open()方法打开数据库,如果数据库不存在就创建此数据库                    myDB = new SQLiteConnection(fileName);                    myDB.Open();                }                catch (SQLiteException ex)                {                    MessageBox.Show("错误信息: " + ex);                }                //@2 创建表(方法内部要判断表是否存在)                CreateTable();                return;            }            myDB.Open();        }        ///         /// 创建数据表         ///         private static void CreateTable()        {            string strSql = string.Empty;            if(myDB!=null)            {                try                {                    //先判断表是否存在  也可以直接使用SQL语句                    //create table if not exists tableword (id integer primary key AUTOINCREMENT, word text, desc blob)                    //if (!TabbleIsExist("User"))                    //{                    //    strSql = "CREATE TABLE User ([id] INTEGER PRIMARY KEY AUTOINCREMENT,[name] nvarchar ,[createTime] datetime);";                     //}                    if (!TabbleIsExist("Account"))                    {                        strSql +=                        "CREATE TABLE Account([id] INTEGER PRIMARY KEY AUTOINCREMENT,[userId] INTEGER NOT NULL ,[itemID]INTEGER ,[item] nvarchar NOT NULL ,[cost] INTEGER ,[costTime] datetime ,[mark] int NOT NULL) ;";                    }                    if(!string.IsNullOrEmpty(strSql))                    {                        int i = ExecuteNonQuery(strSql);                    }                }                catch (SQLiteException ex)                {                    MessageBox.Show("错误信息: "+ex.Message);                }            }        }             ///         /// 判断数据库中表是否存在        ///         /// 表名,区分大小写        /// 
private static bool TabbleIsExist(String tableName) { if(string.IsNullOrEmpty(tableName)) { return false; } if(myDB!=null) { string strSql = "SELECT COUNT(*) FROM sqlite_master where type='table' and name='" + tableName + "'"; SQLiteCommand cmd = myDB.CreateCommand(strSql); if (Convert.ToInt32(cmd.ExecuteScalar()) >0) { return true; } } return false; } /// /// 执行SQL语句 添加,修改,删除操作. /// /// ///
public static int ExecuteNonQuery(string strSql) { if (myDB != null) { try { SQLiteCommand cmd = myDB.CreateCommand(strSql); return cmd.ExecuteNonQuery(); } catch (SQLiteException ex) { MessageBox.Show(ex.Message); } } return 0; } /// /// 执行SQL语句 查询Account 专用 /// /// ///
public static List
GetListAccount(string strSql) { if(myDB!=null) { try { SQLiteCommand cmd = myDB.CreateCommand(strSql); IEnumerable
query = cmd.ExecuteQuery
(); return query.ToList(); } catch (SQLiteException ex) { MessageBox.Show("错误消息: " + ex); } } return null; } }

     帮助类搞定了,其它的就是小case了: 下面就只提供截图了,具体实现简单得很,就不献丑了...

     2. 主界面:                                        3. 生活必须:                                      4. 奢侈享受:

      

           

      5. 详情页: 

          .............................

            就这么多吧,其它的就不提供了. 

 第三部分: 相关dll 和一个SQLite工具下载:

      下载地址:

 

        

 

 本文参考的博客   地址:

转载于:https://www.cnblogs.com/ry123/archive/2012/06/20/2554427.html

你可能感兴趣的文章
新科技让开车更简单
查看>>
移动安全管理系统SAP
查看>>
iOS培训必备——C++函数模板
查看>>
22.dubbo脚本之start.sh
查看>>
一致性哈希算法
查看>>
把手机当网卡使用
查看>>
Linux FTP服务器-VSFTPD虚拟用户配置
查看>>
GNU Guix 0.8 发布,软件包管理器
查看>>
CSS跨浏览器(转)
查看>>
nginx反向代理部署与演示(二)
查看>>
一个php多态性的小例子
查看>>
AIP(Azure 信息保护)之三:保护Office文件
查看>>
Java观察者模式(Observer模式)
查看>>
html5 流程条
查看>>
C#数据类型
查看>>
超150年老字号企业中国仅5家,日本上万
查看>>
永中Office-灵活的斜线表头
查看>>
hibernate映射插件
查看>>
Git 系列之二:Windows 下 Git 客户端的选择,及 msysGit 各种中文问题的解决
查看>>
oracle ORA-30926
查看>>