Windows Phone(三)WP7版 " 记账本" 开发(使用SQLite数据库)

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

第一部分:  遇到的问题 :

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

   public ....ExecuteQuery(...)
{
..........
IEnumerable<Account> query = cmd.ExecuteQuery<Account>(); return query.ToList(); ...........
}

public
class Account { /// <summary> /// 编号 /// </summary> public int id { get; set; } /// <summary> /// 用户编号 /// </summary> 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

      

        /// <summary>

        /// 连接字符串  需要修改

        /// </summary>

        public static SQLiteConnection myDB = null; 



        private static string fileName = "AccountData.DB";//"Version=3,uri=file:AccountData.sqlite";

        

        //这里先定数据库,之后再修改为参数化...

        /// <summary>

        /// 创建数据库

        /// </summary>

        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();

        }



        /// <summary>

        /// 创建数据表 

        /// </summary>

        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);

                }

            }



        }

     

        /// <summary>

        /// 判断数据库中表是否存在

        /// </summary>

        /// <param name="tableName">表名,区分大小写</param>

        /// <returns></returns>

        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;

        }



        /// <summary>

        /// 执行SQL语句 添加,修改,删除操作. 

        /// </summary>

        /// <param name="strSql"></param>

        /// <returns></returns>

        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;

        }



        /// <summary>

        /// 执行SQL语句  查询Account 专用

        /// </summary>

        /// <param name="strSql"></param>

        /// <returns></returns>

        public static List<Account> GetListAccount(string strSql)

        {

            if(myDB!=null)

            {

                try

                {

                    SQLiteCommand cmd = myDB.CreateCommand(strSql);

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

                    return query.ToList();

                }

                catch (SQLiteException ex)

                {

                    MessageBox.Show("错误消息: " + ex);    

                }

            }

            return null;

        }     

    }

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

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

      

Windows Phone(三)WP7版 " 记账本" 开发(使用SQLite数据库)     Windows Phone(三)WP7版 " 记账本" 开发(使用SQLite数据库)      Windows Phone(三)WP7版 " 记账本" 开发(使用SQLite数据库)

      5. 详情页: 

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

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

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

      下载地址: http://115.com/file/anlgefdc

 

        

 

 本文参考DBFocus的博客   地址: http://www.cnblogs.com/dbfocus/archive/2011/02/27/1966203.html

你可能感兴趣的:(windows phone)