Windows Phone(三)WP7版 " 記賬本" 開發(使用SQLite數據庫) 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. 奢侈享受:

   5. 詳情頁:

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

  就這麼多吧,其它的就不提供了.

第三部分: 相關dll 和一個SQLite工具下載:

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

 

 

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

 

原貼:http://www.cnblogs.com/ry123/archive/2012/06/20/2554427.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章