我写个小小的sqlite微信小程序 sqlite,一跑就死了,咋回事

新手,最近刚用内置数据库sqlite3做了个程序,昨天老师说sqlite3太小了要我用MySQL做服务器【python3吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:6,038贴子:
新手,最近刚用内置数据库sqlite3做了个程序,昨天老师说收藏
新手,最近刚用内置数据库sqlite3做了个程序,昨天老师说sqlite3太小了要我用MySQL做服务器,请问怎么链接到MySQL做服务器,谢谢各位大佬
达内python 3培训,0基础入学,python 3课程免费试听;python金牌讲师授课,企业项目实战!python 3培训就选达内,美国上市公司;毕业推荐就业,7万家合作企业.培训就选大机构!
有专门的库,不知道叫什么,百度一大堆
数据库的链接,大同小异,会了一种,其他的也不难。
登录百度帐号推荐应用我写个小小的sqlite程序,一跑就死了,咋回事_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
我写个小小的sqlite程序,一跑就死了,咋回事
我有更好的答案
te Button updateDataButton = private Button queryDataButton = protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); createDatabaseButton
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
SQLite3源程序分析.doc 52页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
SQLite3源程序分析,sqlite 源码分析,sqlite3 源码分析,sqlite 性能分析,sqlite入门与分析,sqlite源码分析 pdf,sqlite 分析,sqlite文件格式分析,sqlite,sqlite3
你可能关注的文档:
··········
··········
SQLite3源程序分析
作者:空转
本文分析的SQLite版本为3.6.18。现在已经变成3.6.20了,但本文中所涉及的内容变化不大。读者最好能下载一个源程序,然后将本文与源程序对照阅读。这样也有利于发现本文的错误,说实话吧,我写的时候是连分析带猜的,错误肯定很多。
参考文献:
1-The Definitive Guide to SQLite . Michael Owens:比较经典的SQLite著作。我边看边翻译了其中的部分内容,但翻得不好,大家还是看原文吧。
2-SQLite文件格式分析_v102 . 空转:我写的,写得特好。现在是v102版,跟前面的版本相比增加了不少背景知识,对文件格式的介绍算是很全面了。看本文之前,应该先浏览一下此参考文献。
SQLite3程序分析
主程序流程
所谓“主程序”是指SQLite所提供的命令行处理程序(CLP)。通过对它的分析可以对SQLite源程序建立整体概念,比一上来就直接分析单独API的处理过程要容易。CLP的主要程序都在shell.c中。
CLP的执行流程很简单:循环接受用户输入的SQL命令,处理SQL命令。命令的执行都是调用sqlite3_exec()函数完成,也就是采用的是“执行封装的Query”的形式[1]。
程序定义了一个功能比较强大的回叫函数来处理SQL命令执行的返回结果:
static int callback(void *pArg, int nArg, char **azArg, char **azCol);
程序定义了9种回显的形式,通过一个callback_data结构来对回显参数进行配置。
程序主函数
程序的main()函数在shell.c的尾部,简化后的main()函数的执行过程主要分为5步:
设置回显参数
取数据库文件名
打开数据库
循环处理SQL命令
关闭数据库
int main(int argc, char **argv){
struct callback_ //回显参数
int rc = 0;
Argv0 = argv[0];
main_init(&data);
//设置默认的回显形式
//取数据库文件名,如没有,默认为内存数据库
data.zDbFilename = argv[1];
data.out =
/* 如果数据库文件存在,则打开它。
** 如果不存在,先不打开(现在什么都不做),
** 可以防止用户因错误的输入而创建空文件。
if( access(data.zDbFilename, 0)==0 ){
open_db(&data);
&SQLite version %s\n&
&Enter \&.help\& for instructions\n&
&Enter SQL statements terminated with a \&;\&\n&,
sqlite3_libversion()
rc = process_input(&data, 0);
//关闭数据库
if( sqlite3_close(db)!=SQLITE_OK ){
fprintf(stderr,&error closing database: %s\n&, sqlite3_errmsg(db));
说明:上述函数与源程序相比做了很大的简化,去掉的部分不是不重要的,而是“可以不解释”的。实用程序的流程一般都是复杂的,SQLite也不例外。本文按照自己的主线进行介绍,只求能说明问题(自圆其说),主线之外的东西,不管重不重要,都尽量忽略。后面的函数也存在这样情况,就不再说明了。
回显参数的设置就不再介绍了,参考源程序的callback()函数和callback_data结构,有关回叫函数的使用见参考文献一。下面介绍数据库的打开过程。
打开数据库
数据库文件的打开过程在SQLite的权威文档中有介绍,过程如下图:
图1-1 数据库文件的打开过程
在CLP中打开数据库,比上图又多了两层,其调用层次如下:
1-main():
位于shell.c。
从命令行参数中得到数据库名,如果数据库文件存在,则打开它。
2-open_db():
位于shell.c。
功能:确认数据库是否已经打开。如果已打开,则什么都不做。如果没有,则打开它。如果打开失败,输出一个错误信息。
3-sqlite3_open():
正在加载中,请稍后...相关文章推荐
sqlite中数据类型:
/sqlite/sqlite-data-types.html
Boolean 数据类型
title: SQLITE 数据类型
categories: IOS
tags: sqlite数据类型
小小程序猿
我的博客:http://da...
猴子之前比较喜欢使用boolean型变量,感觉用起来还是比较方便的。直到膝盖中了一箭。简单说一说boolean型变量的弊端。
首先,环境不兼容。猴子是搞android开发的,昨天加班的...
在xcode的datamodeld 文件中定义了一个 数据表单。其中有个字段是Boolean的类型生成的对应的 class是 NSNumber 类型在程序中要通过这种方式进行赋值
questionn...
android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作。
一、android内的数据库的基础知识介绍
1.用了什么...
就像 《Android SQLiteStatement 编译、执行 分析》 中所说的,SQLite中所有SQL语句都需要先编译为stmt,然后执行。
上述文章介绍了SQLiteStatement在an...
网络上很多人咨询mysql是否提供布尔类型?MySQL数据库确实提供布尔类型,此数据类型的关键字可以写成:布尔类型BOOL或布尔类型BOOLEAN,但是MySQL数据库数据类型的布尔类型是...
ios 开发之 数据库
之前的常用关键字中介绍了content以及许多修饰它的关键字,除此之外,http协议中还有一些修饰content的关键字,也是由于http协议使用量较大,关键字较多,因此单独拿出来学习。参...
代理技术,是针对客户端(Client)和服务器(Server)之间的通信交互而言的一种介入技术。依据代理方式的不同,大致可以分为两种:1. 非透明代理;2. 透明代理。
他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)Delphi下SQLite编程初探
文/图 sislcb这篇文章介绍我在使用Delphi7+SQLite3过程中遇到的问题,然后以一个完整的实例说明SQLite在Delphi中的使用方法。 起因 我看到《承影随时学英语2.0》这个软件,觉得很不错,于是下载下来看了一下,发现使用了SQLite,利用的是ODBC连接方式,于是我也有了自己写一个类似程序的想法,毕竟这是别人的东西,自己写的话,用起来感觉就不一样了,说干就干。 SQLite介绍 SQLite是一个老牌的轻量级别的本地文件数据库,完全免费且开源,不需要安装,无须任何配置,当然,这样管理功能就不是很强大了,但是它的主要应用也是在本地数据库,应该说是最简单好用的嵌入式本地数据库了吧。象FireBird虽然也提供了嵌入式数据库,但是它自身附带的DLL太多,看起来没那么清爽,而SQLite只要一个DLL就可以实现全部功能。SQLite不需要数据库引擎,只有一个数据文件,占用资源非常少,很适合做Demo或小型应用。同时,SQLite也是关系型数据库,支持大部分SQL语句,这是它比BDB(Berkely DB)优秀的地方,当然性能跟它比还是有差距的。它支持事务机制和blob数据类型,支持大部分SQL92标准,最大支持数据库到2T。它还有、Tcl、、的绑定,这些语言可以直接使用SQLite数据库,因为它们自身包含了支持;还有ODBC接口,非常方便使用。 SQLite的一些基本操作跟SQL很类似,基本上有SQL基础的都能看明白。SQLite的图像查看工具有很多,比如SQLiteSpy、SQLiteBrowser等。我这里使用的是SQLiteSpy。 SQLite默认是utf8编码,使用pragma encoding可以看出数据库的编码。建立数据库后,可以直接输入“pragma encoding = UTF8/UTF16”来改变编码,但数据库有了数据以后,编码是不可以修改的。 SQLite的可以http://www.sqlite.org获得。关于SQLite的更进一步的语法和信息,请参.cn/Delphi的SQLite介绍 Delphi是一个很优秀的开发工具,虽然它自身没提供对SQLite的支持,但已经有人开发出了第三方控件,非常方便。不用直接使用SQLite提供的API,只要你拖下控件,设置下属性就行了。支持SQLite的控件有两个:ASQLite和ZEOSDBO,其中ASQLite是专门为SQLite编写的,ZEOSDBO是支持很多数据库的,包括、Firebird等,类似于dbexpress,但应该比它强大。 ASQLite是一个Delphi的开源封装库,发布包中有两个子压缩包,其中ASQLite(ASQLiteD4和ASQLiteD5)是开发时的调试组件,ASQLitePkg (D4/D5)是发布时的运行组件。ZEOSDBO是基于VCL标准的数据库接口实现,可以像BDE、ADO、DBX那样使用这一组控件,它不但可以访问免费的小型的数据库,而且MSSQL、、Oracle、也同样支持。支持的VCL开发工具有Delphi 5-10、BCB 5/6、Kylix 2/3、Lazarus等。访问任何数据库都是统一的控件,只要选择不同的Protocol就可以了,确实是非常方便和强大的。 程序的设计 有了上面的基础知识,我们就可以进行程序的设计了,首先必须明确程序的功能。软件的功能需求有:1)基本功能:背诵单词/句子;2)控制功能:播放/暂停/设置播放时间;3)设置窗体属性:置顶/透明;4)杂项:历史/退出。 有了需求后,就是怎么设计的问题了。首先是数据库的设计,打开SQLiteSpy,点击“New DataBase”,弹出对话框后,输入你想保存的数据库名字,点保存;接着在SQLiteSpy右上的空白处输入如下代码: CREATE TABLE English900 ( [explain] varchar(256), word&&varchar(256), xuhao integer&& ); CREATE TABLE EnglishWord ( xuhao integer, [explain] varchar(256), word&&varchar(256) ); explain是SQLite的关键字,所以需要加上括号!之后就可以看到建立好的表了,建立了表之后,我们就需要把数据导进来了。而要把已经存在的数据导入,需要把有数据的表也打开。SQLite只有一个Main数据库,所以需要用“Attach Database”命令把已经存有数据的数据库附加到现在的数据库。这时候的界面如图1所示。这样就打开了两个数据库,接着是导入命令:
insert into english900(fanyi,juzi,xuhao) select * from [englishdb].english900; insert into englishword(xuhao,[explain],word) select * from [englishdb]. 就可以把englishdb里面两个表的内容导入到现在的Main数据库表中。好了,数据库部分就完成了。 继续软件的设计,我的思路是这样的。先使用ASQLite或者ZEOSDBO把数据Select出来,接着放到内存表里面,准备使用ClientDataSet,然后把ASQLite或者ZEOSDBO关掉,这样就不会一直保存着连接了。而且把数据保存在内存里,不用每次拿一个单词或者句子出来,都要跑到数据库里面去取,速度应该相对来说快一点了。 接着是显示问题,我不想按照数据库的顺序取出来,而是随机取,这样随机的算法怎么设计呢?第一个笨办法是在ClientDataSet里面动态增加一个字段,用来判断该单词/句子是否已经被读取过了,读取过一次后,就对该字段置为True。但这个办法很不好,假如随机到的单词/句子都是读取过的,那不是要判断好久,太没效率了。还好这时候老张(一个同事)给了一个办法:分段随机。第一次从1-10开始随机取一个,然后从10-20,依此类推。我觉得这个方法挺不错,就采用了。这样把数据保存在内存表后,使用定时器固定一段时间就把单词/句子显示出来。确定了方案后,就开始编码了。 程序的编码 由于ASQLite是专门对SQLite进行定制的,所以我估计它在功能等方面应该会好点吧。于是我首先选择了ASQLite做为数据库连接组件。使用的控件有“DBConn:TASQLite3DB;”、“ASQLQuery:TASQLite3Q”、“cdsCache:TclientDataS”、“dspCache:TdataSetP”。 1)设置DBConn var Dir:S begin //得到程序目录 Dir := ExtractFilePath(Application.ExeName); //设置查找目录,否则会出现找不到db和dll错误 DBConn.DefaultDir := D //加入数据库不存在,则自己创建 DBConn.Database&&:= DBmyEnglishDB. DBConn.DriverDLL := DLLSQLite3. DBConn.Connected := T
以上动态修改DBConn的属性,假如直接给它的Database赋值,那就定死在那个文件夹了。这里要注意,由于有DefaultDir属性,所以设置了之后,在Database等属性中,就不用加上Dir了,默认就是在这个路径寻找的。 2)设置ASQLQuery Connection属性设置为 DBConn。 3)设置dspCache DataSet属性设置为ASQLQ。 4)设置cdsCache ProviderName设置为dspC。 这样,组件就设置完成了,接下来是按钮事件。背诵单词按钮事件处理如下。 if (Sender as TMenuItem).Checked then Exit else begin (Sender as TMenuItem).Checked := T pm_control_sentence.Checked := F with ASQLQuery do begin if Active then C SQL.C SQL.Text := select * O
cdsCache.Data := dspCache.D ASQLQuery.C 在把数据保存到ClientDataSet后,就把ASQLQuery关闭。背诵句子的事件和这个类似,就不贴出来了。 以上编译好后,在测试过程中出现问题了。问题出在这一句:“cdsCache.Data := dspCache.Data”。当我来回切换背诵单词和背诵句子按钮时,会出现一个错误,而且错误是定位在ASQLite的GetFieldData里面,莫非控件自身有bug?后来我又测试了一些方法,不使用clientdataset和datasetprovider,直接从ASQLiteQuery里面把数据取出来,还是发现有问题,在尝试几次获取数据之后,就会出现这个错误。看来控件出问题的可能性很大了,不过里面的源码我也不是很看得明白,所以没办法修复,只好转向了ZEOSDBO,希望能找到转机吧。 于是去sourceforge把ZEOSDBO控件下载下来,把ASQLQuery和DBConn删除掉,把ZEOSDBO的Zconnection和Zquery放上去,cdsCahe无须修改,把dspCache的Dataset设置为Zquery就可以了。然后是设置Zconnection和Zquery,具体如下。 1)Zconnection Dataabase属性设置为:DBmyEnglishDB.db,这个是数据库文件所在的地方。 Protocol属性设置为:sqlite-3,这样就支持SQLite3的数据库了。 2)Zquery 只需设置Connection的属性指向ZConnection控件就可以了。 背诵单词的代码如下。 if (Sender as TMenuItem).Checked then Exit else begin (Sender as TMenuItem).Checked := T pm_control_sentence.Checked := F with ZROQ do begin if Active then C SQL.C SQL.Text := select * O
cdsCache.Data := dspCache.D //本来想给它动态增加一个字段,然后根据这个字段判断是否已经显示过了,但感觉这样有个问题,假如随机产生的数一直都是显示过的,这样判断起来的话,就非常不爽,而且感觉这种方法太笨了,穷举…… //cdsCache.FieldDefs.Add(IsShow,ftInteger); ZROQ.C //保存到内存表后,把ZQuery关闭,这样就不会占用一个连接了。 tmShow.Enabled := T //设置定时器启动,每隔一段时间就可以把数据显示在界面上了。 执行select语句后,却发现读出来的数据是乱码,但不会出现和ASQLite类似的问题了。这至少说明了ASQLite应该是有问题的,看来接下来就是要解决编码问题了。在网上搜索了一些资料,没发现类似的解决方法。于是我开始怀疑是数据库编码问题,因为默认是ut

我要回帖

更多关于 sqlite 程序 的文章

 

随机推荐