C#實現(xiàn)一個簡單的SQLite ORM框架記錄

有個項目需要保存多個配置項蛔翅,配置項可能隨著開發(fā)不斷增加门驾。偏向使用SQLite數(shù)據(jù)庫配合ORM(對象關(guān)系映射)來實現(xiàn)。

因為要求并不復(fù)雜娃善,就打算自己簡單實現(xiàn)一下论衍,練下手。

這里記錄遇到的一些點聚磺。

  1. C#中的泛型類坯台,可以看作時針對某種泛型生成了新的類。比如類聲明的靜態(tài)代碼塊(靜態(tài)構(gòu)造函數(shù)static ClassName(){}會在使用新的泛型時重新執(zhí)行瘫寝。不同泛型蜒蕾,類的靜態(tài)變量也不互通。
  2. 類的readonly字段只能在聲明期間或構(gòu)造函數(shù)賦值(包括靜態(tài)構(gòu)造函數(shù)焕阿,當(dāng)然這種情況需要變量也是靜態(tài)的)咪啡。

反射

  1. 反射可通過System.Type對象實現(xiàn),Type對象可由typeof(ClassName)obj.getType()獲得暮屡。
  2. 類內(nèi)容的獲瘸访:Type對象有一系列Get()方法,可以訪問類內(nèi)的屬性(即有get()褒纲、set()的變量)准夷、變量、方法等莺掠,返回值都是封裝好的對象或是對象集合衫嵌。
  3. 實例的創(chuàng)建,Activator.CreateInstance()
    T t=Activator.CreateInstance<T>();
    
  4. 泛型實例屬性讀寫(SetValue()/GetValue()):
    public void Increase(T t)
    {
        var propA = typeof(T).GetProperty("A");
        var value = propA.GetValue(t, null);
        if (propA.PropertyType == typeof(int))
        {
            var result = int.Parse(value.ToString()) + 1;
            propA.SetValue(t, result, null);
        }
    }
    

特性(注解)

  1. 通過繼承System.Attribute類即可彻秆。
    public class NonSQL : Attribute
    {
    
    }
    
    class Person
    {
        [NonSQL]
        public string FirstName {get;set;}
    }
    
  2. 想要獲取屬性的特性楔绞,可以通過PropertyInfo.GetCustomAttributes()即可獲取结闸,其他如字段等也有類似方法。

SQLite

  1. SQLite對alter的支持有限酒朵,字段一旦添加桦锄,就不能通過alter語句修改字段的屬性(類型、主鍵等)耻讽。
  2. 查找表是否存在,(0-表名):
    select count(*)  from sqlite_master where type='table' and name = '{0}';
    
  3. 建表帕棉,(0-表名针肥;1-以逗號隔開的字段定義):
    create table if not exists {0} ({1});
    
  4. 添加字段,(0-表名香伴;1-字段定義):
    alter table {0} add column {1};
    
  5. 插入慰枕,(0-表名;1-以逗號隔開的字段即纲;2-以逗號隔開的字段對應(yīng)值):
    insert or replace into {0} ({1}) values ({2});
    
  6. where子句使用:以and連接多個條件具帮,除了邏輯運算符外,還可以使用like做字符匹配低斋,百分號(%)代表零個蜂厅、一個或多個數(shù)字或字符,下劃線(_)代表一個單一的數(shù)字或字符膊畴,符號可被組合使用掘猿。
  7. 執(zhí)行查詢時會返回SQLiteDataReader對象,有很多方法唇跨,這里說兩個常用的稠通。
    1. 通過Read()讀取一列數(shù)據(jù),讀取成功返回true买猖。
    2. 通過["{PropName}"]可以直接讀取字段的值改橘。
  8. 兩種執(zhí)行語句的方法
    // 只是執(zhí)行一條SQL語句
    private void ExecuteNonQuery(string sql)
    {
        lock (connection)
        {
            EnsureDatabaseConnected();
            using (var tr = connection.BeginTransaction())
            {
                using (var command = connection.CreateCommand())
                {
                    command.CommandText = sql;
                    command.ExecuteNonQuery();
                }
                tr.Commit();
            }
        }
    }
    
    // 執(zhí)行一條SQL語句,并執(zhí)行提供的操作玉控,一般用于查詢
    private void ExecuteQuery(string sql, Action<SQLiteDataReader> action)
    {
        lock (connection)
        {
            EnsureDatabaseConnected();
            using (var command = connection.CreateCommand())
            {
                command.CommandText = sql;
                var reader = command.ExecuteReader();
                action(reader);
            }
        }
    }
    
    //后一種的使用示例
    public int GetTableCount(string tableName)
    {
        var tableCount = 0;
        var tableCountSql = string.Format("select count(*)  from sqlite_master where type='table' and name = '{0}';", tableName);
    
        ExecuteQuery(tableCountSql, reader =>
        {
            reader.Read();
            tableCount = reader.GetInt32(0);
        });
    
        return tableCount;
    }
    

其他

  1. 盡量使用泛型方法而不是泛型類飞主。
  2. String.IsNullOrWhiteSpace(),除了null和空字符串(String.IsNullOrEmpty()判斷范圍)高诺,還擴展了空白字符的判斷既棺。
  3. C#中有一個System.IO.Path類,可以很方便的拼接文件路徑懒叛、提取文件所在文件夾等丸冕。并且操作是跨平臺的。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末薛窥,一起剝皮案震驚了整個濱河市胖烛,隨后出現(xiàn)的幾起案子眼姐,更是在濱河造成了極大的恐慌,老刑警劉巖佩番,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件众旗,死亡現(xiàn)場離奇詭異,居然都是意外死亡趟畏,警方通過查閱死者的電腦和手機贡歧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赋秀,“玉大人利朵,你說我怎么就攤上這事×粤” “怎么了绍弟?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長著洼。 經(jīng)常有香客問我樟遣,道長,這世上最難降的妖魔是什么身笤? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任豹悬,我火速辦了婚禮,結(jié)果婚禮上液荸,老公的妹妹穿的比我還像新娘屿衅。我一直安慰自己,他們只是感情好莹弊,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布涤久。 她就那樣靜靜地躺著,像睡著了一般忍弛。 火紅的嫁衣襯著肌膚如雪响迂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天细疚,我揣著相機與錄音蔗彤,去河邊找鬼。 笑死疯兼,一個胖子當(dāng)著我的面吹牛然遏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吧彪,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼待侵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了姨裸?” 一聲冷哼從身側(cè)響起秧倾,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤怨酝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后那先,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體农猬,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年售淡,在試婚紗的時候發(fā)現(xiàn)自己被綠了斤葱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡揖闸,死狀恐怖揍堕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情楔壤,我是刑警寧澤鹤啡,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布惯驼,位于F島的核電站蹲嚣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟牲。R本人自食惡果不足惜隙畜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望说贝。 院中可真熱鬧议惰,春花似錦、人聲如沸乡恕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽傲宜。三九已至运杭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間函卒,已是汗流浹背辆憔。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留报嵌,地道東北人虱咧。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像锚国,于是被迫代替她去往敵國和親腕巡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法血筑,類相關(guān)的語法逸雹,內(nèi)部類的語法营搅,繼承相關(guān)的語法,異常的語法梆砸,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • 大概是五天前转质,我發(fā)現(xiàn)魚缸里有條魚不再進食,不知是生了什么病帖世,于是它越來越瘦休蟹,從剛開始的活潑也變得喜歡沉在水底...
    我們每個人都有理想閱讀 228評論 0 0
  • 總結(jié): 英語,對于閱讀日矫,主要的大原則是形成認知慣性赂弓,利用其快速閱讀過去理解生詞和生句 個人,真正地鍛煉自己解決問題...
    車凱威RichardFeynm閱讀 127評論 0 0
  • 本文適用于成都個人買社保哪轿,網(wǎng)上繳費盈魁。 網(wǎng)址 成都市社會保險網(wǎng)上經(jīng)辦系統(tǒng) 操作指南文檔地址: 打開成都市社會保險網(wǎng)上...
    寧靜的夜閱讀 1,760評論 0 0
  • 時間沒有重來,所以你要在最美的年華努力綻放最美的自己窃诉,別讓遺憾成永遠杨耙。
    紅蓮天舞閱讀 138評論 0 0