【iOS開發(fā)】python解析sqlite數(shù)據(jù)庫

1. 引言

在iOS開發(fā)調(diào)試過程中摩钙,打印日志是最常使用的手段,但是打印日志有時候無法提供詳細(xì)的信息用于問題的分析,?例如一般的消息數(shù)據(jù)由于數(shù)據(jù)量較大响禽,打印日志時只會選擇將一些關(guān)鍵信息打印出來,信息不夠完整。因此芋类,如果能將存入sqlite數(shù)據(jù)庫中的數(shù)據(jù)導(dǎo)出隆嗅,對于問題的分析定位解決?將會十分有幫助。

2. python解析sqlite基本數(shù)據(jù)類型[1]

2.1 數(shù)據(jù)庫基本操作

  • 數(shù)據(jù)庫連接
import sqlite3
conn = sqlite3.connect('example.db')  
  • 數(shù)據(jù)庫連接對象基本操作
cur = conn.cursor()    //創(chuàng)建cursor
conn.commit()          //事務(wù)提交
conn.rollback()        //事務(wù)回滾
conn.close()           //關(guān)閉一個數(shù)據(jù)庫鏈接
  • 數(shù)據(jù)庫cursor基本操作
cur.execute()    //執(zhí)行sql語句
cur.fetchone()   //從結(jié)果中取出一條記錄
cur.fetchall()   //從結(jié)果中取出所有記錄
cur.close()      //關(guān)閉cursor

2.2 獲取數(shù)據(jù)庫中的表

sqlite數(shù)據(jù)庫中都包含一個特殊的表sqlite_master侯繁,其表結(jié)構(gòu)為:

CREATE TABLE sqlite_master (
type TEXT,
name TEXT,
tbl_name TEXT,
rootpage INTEGER,
sql TEXT);

可以利用此表來查詢數(shù)據(jù)庫中所有的表:

tables = cur.execute("select name from sqlite_master where type = 'table' order by name").fetchall()

2.3 獲取表結(jié)構(gòu)

columns = cur.execute("PRAGMA table_info(%s)" % table).fetchall()

2.4 獲取表中的數(shù)據(jù)

data = cur.execute("select * from %s" % table).fetchall()

3. iOS序列化存儲

在iOS開發(fā)中胖喳,經(jīng)常將可能會擴(kuò)展或者根據(jù)不同類型存儲不同數(shù)據(jù)的數(shù)據(jù)庫字段定義為blob類型,采用NSKeyedArchiver對具有差異性的數(shù)據(jù)進(jìn)行序列化贮竟,轉(zhuǎn)為NSData數(shù)據(jù)進(jìn)行存儲丽焊。

例如消息的數(shù)據(jù)表結(jié)構(gòu)可定義為:

CREATE TABLE ?message (
msgId integer primary key,
msgType int,
extensionData blob);

其中extensionData就可以根據(jù)消息的類型(?例如文本、圖片咕别、多媒體等)技健,存儲不同的數(shù)據(jù);同時extensionData中的數(shù)據(jù)還可以在不改變表結(jié)構(gòu)的條件下惰拱,進(jìn)行其自身的數(shù)據(jù)擴(kuò)展雌贱。

?假設(shè)圖片消息類定義為:

@interface PicMsg : NSObject
@property (nonatomic, assign) NSUInteger msgType;
@property (nonatomic, strong) PicInfo *picInfo;
@end

其中PicInfo為圖片基本信息:

@interface PicInfo : NSObject<NSCoding>
@property (nonatomic, assign) ?NSUInteger picType;
@property (nonatomic, assign) ?NSUInteger fileSize;
@property (nonatomic, assign) ?NSUInteger picWidth;
@property (nonatomic, assign) ?NSUInteger picHeight;
@end
@implementation PicInfo
-(void)encodeWithCoder:(NSCoder *)coder
{
    [coder encodeObject:@(self.picType) forKey:@"picType"];
    [coder encodeObject:@(self.fileSize) forKey:@"fileSize"];
    [coder encodeObject:@(self.picWidth) forKey:@"picWidth"];
    [coder encodeObject:@(self.picHeight) forKey:@"picHeight"];
}
-(id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super init]) {
        self.msgType = [[decoder decodeObjectForKey:@"picType"] unsignedIntegerValue];
        self.fileSize = [[decoder decodeObjectForKey:@"fileSize"] unsignedIntegerValue];
        self.picWidth = [[decoder decodeObjectForKey:@"picWidth"] unsignedIntegerValue];
        self.picHeight = [[decoder decodeObjectForKey:@"picHeight"] unsignedIntegerValue];
    }
    return self;
}
@end

這樣在存入數(shù)據(jù)庫時就可以調(diào)用[NSKeyedArchiver archivedDataWithRootObject:self.picFileInfo];,將picInfo轉(zhuǎn)化為NSData存入extensionData字段里偿短。

4. python+pyobjc[2]解析序列化數(shù)據(jù)

4.1 pyobjc

PyObjC is a bridge between Python and Objective-C. It allows full featured Cocoa applications to be written in pure Python. It is also easy to use other frameworks containing Objective-C class libraries from Python and to mix in Objective-C, C and C++ source.

在使用pyobjc和iOS相關(guān)框架時欣孤,只需要import相關(guān)模塊即可,例如Foundation框架:

from Foundation import *

4.2 pyobjc解析序列化數(shù)據(jù)

  • 定義?對應(yīng)類

要對打包數(shù)據(jù)進(jìn)行解包昔逗,需要用python定義與OC相對應(yīng)的類降传。
例如第3節(jié)中提到的PicInfo,改用python定義為:

class PicInfo(NSObject):
    def init(self):
        self = super(PicInfo, self).init()
        if self is None:
            print "init None"
        return self
    def initWithCoder_(self, encoder):
        self = super(PicInfo, self).init()
        if self is None:
            print "initWithCoder_ None"
        self.picType = encoder.decodeObjectForKey_("picType")
        self.fileSize = encoder.decodeObjectForKey_("fileSize")
        self.picWidth = encoder.decodeObjectForKey_("picWidth")
        self.picHeight = encoder.decodeObjectForKey_("picHeight")
        return self
    def encodeWithCoder_(self, decoder):
        decoder.encodeObject_forKey_(self.picType, "picType")
        decoder.encodeObject_forKey_(self.fileSize, "fileSize")
        decoder.encodeObject_forKey_(self.picWidth, "picWidth")
        decoder.encodeObject_forKey_(self.picHeight, "picHeight")
  • 數(shù)據(jù)的序列化與反序列化
picInfo = PicInfo.alloc().init()
picInfo.picType = 1
picInfo.fileSize = 1024
picInfo.picWidth = 200
picInfo.picHeight = 100
// 序列化
archivedData = NSKeyedArchiver.archivedDataWithRootObject_(picInfo)
// 反序列化
unarchivedPicInfo = NSKeyedUnarchiver.unarchiveObjectWithData_(archivedData)

5. 結(jié)語

python+pyobjc不僅僅可以在iOS開發(fā)時進(jìn)行數(shù)據(jù)的序列化和反序列化纤子,利用pyobjc可以在Mac OS上使用純python開發(fā)Cocoa GUI應(yīng)用搬瑰,功能非常強大。

參考資料

[1]sqlite3 DB-API 2.0 interface for SQLite databases
[2]pyobjc module
[3]pyobjc package documentation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末控硼,一起剝皮案震驚了整個濱河市泽论,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卡乾,老刑警劉巖翼悴,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異幔妨,居然都是意外死亡鹦赎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門误堡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來古话,“玉大人,你說我怎么就攤上這事锁施∨悴龋” “怎么了杖们?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長肩狂。 經(jīng)常有香客問我摘完,道長,這世上最難降的妖魔是什么傻谁? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任孝治,我火速辦了婚禮,結(jié)果婚禮上审磁,老公的妹妹穿的比我還像新娘谈飒。我一直安慰自己,他們只是感情好力图,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布步绸。 她就那樣靜靜地躺著掺逼,像睡著了一般吃媒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吕喘,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天肯骇,我揣著相機與錄音榆纽,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛猖败,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播捆探,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼守伸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辕漂?” 一聲冷哼從身側(cè)響起呢灶,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钉嘹,沒想到半個月后鸯乃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡跋涣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年缨睡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陈辱。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡奖年,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出沛贪,到底是詐尸還是另有隱情陋守,我是刑警寧澤揍堰,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嗅义,受9級特大地震影響屏歹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜之碗,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一蝙眶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褪那,春花似錦幽纷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至偏窝,卻和暖如春收恢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背祭往。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工伦意, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人硼补。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓驮肉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親已骇。 傳聞我的和親對象是個殘疾皇子离钝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355

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