版权所有,转载请注明出处:http://guangboo.org/2013/01/29/save-chat-history-with-sqlite

最近正在开发一个即时聊天系统----Pian Communicator,该项目是基于XMPP协议,使用Python+wxPython+xmpp.py开发,由于都是深夜奋战,项目进展也比较慢,目前正在开发聊天功能。聊天功能中还需要保护聊天记录的保存,就像QQ一样,我们可以浏览历史聊天记录。有些即时聊天系统的聊天记录也有采用xml文件记录的,但是xml文件毕竟没有数据库那么容易检索数据,因此我这里打算采用sqlite数据库来存储,并且Python本身就自带了对sqlite的支持。

首先先定义了记录和查询接口,比较目前确定是使用sqlite来记录,但以后也有可能使用xml或其它方式来记录的可能,因此这里定义一个抽象,以便以后进行扩展。接口主要的方法为read和write方法,分别用于读,写记录,记录的内容暂时只有talk(发言者), nickname(发言者的别名), typ(记录类别,包括msg, file等),msg(内容),tm(时间)。另外为了避免忘记调用close方法,特地定义了__del__方法,并且该方法会在类被垃圾回收时调用。代码如下:

class History(object):def __init__(self, jid, to, path):self.__jid = jidself.__to = toself.__path = pathself.__opened = Falseif not os.path.exists(path):os.mkdir(path)def get_jid(self): return self.__jiddef get_to(self): return self.__todef get_path(self): return self.__pathdef open(self): raise NotImplementedError()def read(self): raise NotImplementedError()def write(self, talk, nickname, typ, msg, tm): raise NotImplementedError()def close(self): raise NotImplementedError()def __del__(self):if self.__opened:self.close()

采用sqlite数据库存储记录的具体类,如下实现:

class SqliteStorageHistory(History):def __init__(self, jid, to, path):super(SqliteStorageHistory, self).__init__(jid, to, path)_dir = os.path.join(path, self.get_jid())if not os.path.exists(_dir):os.mkdir(_dir)self.dbname = os.path.join(path, self.get_jid(), 'history.db')self.__connection = Noneself.__cursor = Nonedef open(self):has = Trueif not os.path.exists(self.dbname):has = Falseself.__connection = sqlite3.connect(self.dbname)self.__cursor = self.__connection.cursor()if not has:self.__cursor.execute('''create table histories (_to text, talk text, nick text, typ text, msg text,
datetime datetime)''')self.__connection.commit()self.__opened = Truedef read(self):if self.__cursor == None or self.__connection == None:raise HistoryError('Please Open connection.')for row in self.__cursor.execute("select * from histories where _to=?", (self.get_to(),)):yield rowdef write(self, talk, nickname, typ, msg, tm):if self.__cursor == None or self.__connection == None:raise HistoryError('Please Open connection.')self.__cursor.execute('insert into histories (_to, talk, nick, typ, msg, datetime) values (?, ?, ?, ?, ?,
?)', \(self.get_to(), talk, nickname, typ, msg, str(tm),))self.__connection.commit()def close(self):if not self.__opened:returnif not self.__cursor:try:self.__cursor.close()del self.__cursorexcept: passif not self.__connection:try:self.__connection.close()del self.__connectionexcept: passself.__opened = False

测试代码为:

if __name__ == '__main__':sql = SqliteStorageHistory('zhang@gmail.com','wang2xiao@gmail.com', 'c:\\his2')sql.open()sql.write('wang2xiao@gmail.com', 'Wang, 2Xiao', 'msg', 'Hi, What are you doing?',
datetime.datetime.now())sql.write('zhang@gmail.com', 'Zhang, Guangbo', 'msg', 'Hi, Nothing.', datetime.datetime.now())for row in sql.read():print rowsql.close()

输出结果:

(u'wang2xiao@gmail.com', u'wang2xiao@gmail.com', u'Wang, 2Xiao', u'msg', u'Hi, What are you
doing?', u'2013-01-29 16:21:04.324000')
(u'wang2xiao@gmail.com', u'zhang@gmail.com', u'Zhang, Guangbo', u'msg', u'Hi, Nothing.', u'2013
-01-29 16:21:04.417000')

sqlite数据库保存聊天记录相关推荐

  1. Unity简单商城系统,用SQLite数据库保存/加载数据

    Unity简单商城系统案例 流程 最后效果展示 1. 创建项目并导入SQLite需要的dll文件 2. 创建数据库表(玩家表和商店表) 3. Singleton 单例脚本 4. 封装SQLite数据库 ...

  2. Android sqlite 数据库保存Date 类型

    2019独角兽企业重金招聘Python工程师标准>>> 在sqlite 中所有字段是在数据库中不管是integer 还是text 类型, 都保存为text 类型, 所以在插入的时候2 ...

  3. 用Qt设计一款单词本软件,采用SQLite数据库

    运行结果 运行逻辑 开发背景 源代码 运行结果 运行逻辑 程序启动后,显示单词本界面作为主窗口,同时从SQLite数据库中读取数据显示成列表. 用户可以点击几个按钮打开几个子窗口,进行增删查改等操作. ...

  4. [Android]DDMS查看app保存的Sqlite数据库db文件和db升级

    [Android]DDMS查看app保存的Sqlite数据库db文件和db升级 @Author GQ 2017年06月06日 项目的app中大多需要用到本地sqlite存储,所以需要看到自己是否保存成 ...

  5. JAVAFX 使用mybatis-plus整合sqlite 操作数据库,保存成功,但数据库没有数据

    一.问题描述 sqlite 操作数据库,保存成功,但数据库没有数据,在代码中有查询出了数据,关闭项目,等段时间,启动项目,代码查询数据,数据又不见了.. 最近一直在搞JAVAFX,开发了个工具,用sp ...

  6. 微信 SQLite 数据库修复实践

    1.前言 众所周知,微信在后台服务器不保存聊天记录,微信在移动客户端所有的聊天记录都存储在一个 SQLite 数据库中,一旦这个数据库损坏,将会丢失用户多年的聊天记录.而我们监控到现网的损坏率是0.0 ...

  7. android数据库isnull,Android中SQLite数据库知识点总结

    SQLite 数据库简介 SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本.它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需 ...

  8. 在 Android 应用程序中使用 SQLite 数据库以及怎么用

    part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...

  9. android模拟器的数据存放,Android模拟器在哪里存储SQLite数据库?

    Android模拟器在哪里存储SQLite数据库? 我正在开发一个将数据存储在SQLite数据库中的Android应用程序. 我的问题是,当您使用模拟器时,此数据库文件存储在文件系统中的哪个位置? 我 ...

  10. android之利用SQLite数据库实现登陆和注册

    首先,说一下SQLite的概念: SQLite 是一个开源的嵌入式关系数据库,它可以减少应用程序管理数据的开销 , SQLite 可移植性好 . 很容易使用 . 很小 . 高效而且可靠 .目前在And ...

最新文章

  1. 五一减肥狂掉肉饮食法
  2. Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
  3. 诺基亚基于区块链推环境感知服务,助力智慧城市发展
  4. codeforce#365D Free Market
  5. qt 手动设置控件的位置
  6. Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)
  7. python回声程序 一行代码_python实现的比较完成的带声音的摩斯码翻译程序的代码...
  8. 太原理工计算机组成原理报告,太原理工计算机组成原理考试题.pdf
  9. 克莱姆法则(Cramer's Rule)
  10. python代码在哪里写_python的代码写在哪里,怎么样运行python代码
  11. vue滑块滑动校验,兼容移动端/pc端
  12. ubuntu更新时Not enough free disk space
  13. iphone7刷入linux,iPhone7怎么进入DFU模式 iPhone7刷机步骤【详解】
  14. k-均值聚类算法总结
  15. 第059篇:高分二号遥感影像预处理流程(ENVI5.3.1平台+ENVI App Store中最新的中国国产卫星支持工具)
  16. 毕业设计-基于深度学习的图像隐写分析
  17. 通过接口获取数据登录
  18. numpy取数组中的行和列
  19. WIN 10 初体验:期待越多失望越大
  20. 图书借阅管理系统微信小程序的开发 报告+开题报告+PPT+SSM项目源码及数据库文件+演示视频

热门文章

  1. [Unity3D]推荐几个不错的网站
  2. 有哪些优秀的科学网站和科研软件推荐给研究生?
  3. 校园一卡通系统可行性方案
  4. 视频教程-R语言入门基础-大数据
  5. android模拟器定位失败,Android-无法在模拟器上获取GPS位置
  6. ssm电影院订票系统 前端layui
  7. JAVA小项目--银行管理系统(GUI+数据库mysql)
  8. Linux面试必备20个常用命令
  9. Nmap进行主机探测出现网段IP全部存活情况分析
  10. opencv实现图片的任意角度旋转