sqlite数据库保存聊天记录
版权所有,转载请注明出处: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数据库保存聊天记录相关推荐
- Unity简单商城系统,用SQLite数据库保存/加载数据
Unity简单商城系统案例 流程 最后效果展示 1. 创建项目并导入SQLite需要的dll文件 2. 创建数据库表(玩家表和商店表) 3. Singleton 单例脚本 4. 封装SQLite数据库 ...
- Android sqlite 数据库保存Date 类型
2019独角兽企业重金招聘Python工程师标准>>> 在sqlite 中所有字段是在数据库中不管是integer 还是text 类型, 都保存为text 类型, 所以在插入的时候2 ...
- 用Qt设计一款单词本软件,采用SQLite数据库
运行结果 运行逻辑 开发背景 源代码 运行结果 运行逻辑 程序启动后,显示单词本界面作为主窗口,同时从SQLite数据库中读取数据显示成列表. 用户可以点击几个按钮打开几个子窗口,进行增删查改等操作. ...
- [Android]DDMS查看app保存的Sqlite数据库db文件和db升级
[Android]DDMS查看app保存的Sqlite数据库db文件和db升级 @Author GQ 2017年06月06日 项目的app中大多需要用到本地sqlite存储,所以需要看到自己是否保存成 ...
- JAVAFX 使用mybatis-plus整合sqlite 操作数据库,保存成功,但数据库没有数据
一.问题描述 sqlite 操作数据库,保存成功,但数据库没有数据,在代码中有查询出了数据,关闭项目,等段时间,启动项目,代码查询数据,数据又不见了.. 最近一直在搞JAVAFX,开发了个工具,用sp ...
- 微信 SQLite 数据库修复实践
1.前言 众所周知,微信在后台服务器不保存聊天记录,微信在移动客户端所有的聊天记录都存储在一个 SQLite 数据库中,一旦这个数据库损坏,将会丢失用户多年的聊天记录.而我们监控到现网的损坏率是0.0 ...
- android数据库isnull,Android中SQLite数据库知识点总结
SQLite 数据库简介 SQLite 是一个轻量级数据库,它是D. Richard Hipp建立的公有领域项目,在2000年发布了第一个版本.它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需 ...
- 在 Android 应用程序中使用 SQLite 数据库以及怎么用
part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...
- android模拟器的数据存放,Android模拟器在哪里存储SQLite数据库?
Android模拟器在哪里存储SQLite数据库? 我正在开发一个将数据存储在SQLite数据库中的Android应用程序. 我的问题是,当您使用模拟器时,此数据库文件存储在文件系统中的哪个位置? 我 ...
- android之利用SQLite数据库实现登陆和注册
首先,说一下SQLite的概念: SQLite 是一个开源的嵌入式关系数据库,它可以减少应用程序管理数据的开销 , SQLite 可移植性好 . 很容易使用 . 很小 . 高效而且可靠 .目前在And ...
最新文章
- 五一减肥狂掉肉饮食法
- Linux服务器运行sh文件提示权限不够解决方法?飞腾服务器Permission denied问题授权方法
- 诺基亚基于区块链推环境感知服务,助力智慧城市发展
- codeforce#365D Free Market
- qt 手动设置控件的位置
- Pytorch基础(十)——优化器(SGD,Adagrad,RMSprop,Adam,LBFGS等)
- python回声程序 一行代码_python实现的比较完成的带声音的摩斯码翻译程序的代码...
- 太原理工计算机组成原理报告,太原理工计算机组成原理考试题.pdf
- 克莱姆法则(Cramer's Rule)
- python代码在哪里写_python的代码写在哪里,怎么样运行python代码
- vue滑块滑动校验,兼容移动端/pc端
- ubuntu更新时Not enough free disk space
- iphone7刷入linux,iPhone7怎么进入DFU模式 iPhone7刷机步骤【详解】
- k-均值聚类算法总结
- 第059篇:高分二号遥感影像预处理流程(ENVI5.3.1平台+ENVI App Store中最新的中国国产卫星支持工具)
- 毕业设计-基于深度学习的图像隐写分析
- 通过接口获取数据登录
- numpy取数组中的行和列
- WIN 10 初体验:期待越多失望越大
- 图书借阅管理系统微信小程序的开发 报告+开题报告+PPT+SSM项目源码及数据库文件+演示视频