Sqlite3.0数据库在iPhone中的应用

Sqlite3.0数据库在iPhone中的应用,第1张

概述这两天终于把Sqlite数据库在iPhone中的应用搞懂了。。      还是那些增删改查,却没有存储过程之类的,数据类型也少了。为了初始化数据,自己感觉有两种方案可以执行,都可以使数据初始化一次:一种是使用主键约束(sid integer PRIMARY KEY),一种是在AppDelegate文件中初始化。这样我自己感觉可以仅调用一次数据信息。       下面是iPhone程序中使用的部分代

这两天终于把sqlite数据库在iPhone中的应用搞懂了。。

还是那些增删改查,却没有存储过程之类的,数据类型也少了。为了初始化数据,自己感觉有两种方案可以执行,都可以使数据初始化一次:一种是使用主键约束(sID integer PRIMARY KEY),一种是在AppDelegate文件中初始化。这样我自己感觉可以仅调用一次数据信息。

下面是iPhone程序中使用的部分代码信息:

第一部分:用于检测该信息中是否已存在mydatabase.sql数据库信息,若存在则直接打开,若不存在则新建本数据库文件,然后在打开该数据库文件。

-(BOol@H_419_24@)open{

@H_419_24@//获取路径数组@H_419_24@

NSArray@H_419_24@*paths=@H_419_24@NSSearchPathForDirectoriesInDomains(@H_419_24@NSdocumentDirectory,@H_419_24@NSUserDomainMask,@H_419_24@YES@H_419_24@);@H_419_24@

@H_419_24@//@H_419_24@获取路径数组中第一个信息

Nsstring@H_419_24@*documentsDirectory=[pathsobjectAtIndex@H_419_24@:0@H_419_24@];

@H_419_24@//@H_419_24@选择创建的文件信息

Nsstring@H_419_24@*path=[documentsDirectorystringByAppendingPathComponent@H_419_24@:@"mydatabase.sql"@H_419_24@];
NSfileManager*fileManager=[@H_419_24@NSfileManagerdefaultManager@H_419_24@];@H_419_24@

BOol@H_419_24@find=[fileManagerfileExistsAtPath@H_419_24@:path];

if@H_419_24@(find) {

if@H_419_24@(sqlite3_open@H_419_24@([pathUTF8String@H_419_24@],&database@H_419_24@)!=sqlITE_OK@H_419_24@) {

sqlite3_close@H_419_24@(database@H_419_24@);

@H_419_24@NSLog@H_419_24@(@H_419_24@@"Sorror,opening db file Error");//使用NSLog用于显示错误状态@H_419_24@

return@H_419_24@NO@H_419_24@;

}

return@H_419_24@YES@H_419_24@;

}

else@H_419_24@{

@H_419_24@sqlite3_close(@H_419_24@database@H_419_24@);@H_419_24@

@H_419_24@NSLog@H_419_24@(@H_419_24@@"Sorror,opening db file Error,and Not link Db");@H_419_24@

return@H_419_24@NO@H_419_24@;

}

第二部分:创建表 ,可以由用户设置主键和sqlServer一样也可以设置自动增长信息。

//@H_419_24@创建学生表信息

-(BOol@H_419_24@)CreatetableStudent:(sqlite3@H_419_24@*)db{

char@H_419_24@*errorMsg;

// 本信息是用于删除表

//NSLog(@"first Delete tabel");

//Nsstring *Deletetable=@"drop table student";

//

//if (sqlite3_exec(db,[Deletetable UTF8String],NulL,&errorMsg)==sqlITE_OK) {

////sqlite3_close(db);

////NSAssert1(0,@"Error creating table: %s",errorMsg);

// NSLog(@"delect table------------------------");

//}

//NSLog(@"delect table");

@H_419_24@//表@H_419_24@中设置主键可消除重复添加

@H_419_24@Nsstring@H_419_24@*createsql=@H_419_24@@"Create table if not exists student(sID integer PRIMARY KEY autoincrement,name text,sex text,age integer)";@H_419_24@

//在sqlite中不可以直接使用字符串信息,必须使用UTF8String进行数据格式转化,但是至今不明白为什么@H_419_24@

//这样做@H_419_24@

if@H_419_24@(sqlite3_exec@H_419_24@(db,[createsqlUTF8String@H_419_24@],NulL@H_419_24@,&errorMsg)!=sqlITE_OK@H_419_24@) {

sqlite3_close@H_419_24@(db);

@H_419_24@NSAssert1@H_419_24@(@H_419_24@0@H_419_24@,@H_419_24@@"Error creating table: %s",errorMsg);@H_419_24@

@H_419_24@NSLog@H_419_24@(@H_419_24@@"studenttable is created successfuly");//显示创建成功@H_419_24@

@H_419_24@return YES;@H_419_24@


第三部:初始化数据信息(增加数据信息),数据参数是从1开始的,values(?,?,?)使用问号作为占位符,占位符的信息是从1开始计数的,这与查找是得Where语句后面的参数形式不是一致。

//@H_419_24@学生表中初始化数据信息

-(voID@H_419_24@)InsertIntoStudenttable:(sqlite3@H_419_24@*)database{

@H_419_24@char@H_419_24@* insert=@H_419_24@"insert or replace into student(sID,name,sex,age) values(?,?);";@H_419_24@

@H_419_24@sqlite3_stmt*stmt;@H_419_24@

int@H_419_24@count=0@H_419_24@;//用于计数,可以观察到数据信息插入的情况

if@H_419_24@(sqlite3_prepare_v2@H_419_24@(database,insert,-1@H_419_24@,&stmt,nil@H_419_24@)==sqlITE_OK@H_419_24@) {

sqlite3_bind_int@H_419_24@(stmt,1@H_419_24@,1@H_419_24@);

sqlite3_bind_text@H_419_24@(stmt,2@H_419_24@,[@"zhixuan"@H_419_24@UTF8String@H_419_24@],NulL@H_419_24@);

3@H_419_24@,[@"F"@H_419_24@UTF8String@H_419_24@],4@H_419_24@,23@H_419_24@);

count=count+1@H_419_24@;//用于计数,可以观察到数据信息插入的情况

if@H_419_24@(sqlite3_step@H_419_24@(stmt)!=sqlITE_DONE@H_419_24@) {

@H_419_24@NSLog@H_419_24@(@H_419_24@@"insert error .....");@H_419_24@

2@H_419_24@);

@"liyan"@H_419_24@UTF8String@H_419_24@],[@"M"@H_419_24@UTF8String@H_419_24@],65)"> count=count+1@H_419_24@;//用于计数,可以观察到数据信息插入的情况

3@H_419_24@);

@"zhangzhixuan"@H_419_24@UTF8String@H_419_24@],65)"> count=count+1@H_419_24@;

4@H_419_24@);

@"zhangliguang"@H_419_24@UTF8String@H_419_24@],21@H_419_24@);

5@H_419_24@);

@"liyanfen"@H_419_24@UTF8String@H_419_24@],19@H_419_24@);

count=count+1@H_419_24@;//用于计数,可以观察到数据信息插入的情况

6@H_419_24@);

@"zhangsan"@H_419_24@UTF8String@H_419_24@],65)"> count=count+1@H_419_24@;//用于计数,可以观察到数据信息插入的情况

7@H_419_24@);

@"wanggang"@H_419_24@UTF8String@H_419_24@],8@H_419_24@);

@"lisi"@H_419_24@UTF8String@H_419_24@],25@H_419_24@);

9@H_419_24@);

@"yanhua"@H_419_24@UTF8String@H_419_24@],20@H_419_24@);

count=count+1@H_419_24@;//用于计数,可以观察到数据信息插入的情况

//10@H_419_24@

10@H_419_24@);

@"xueyan"@H_419_24@UTF8String@H_419_24@],nil@H_419_24@)==sqlITE_OK@H_419_24@){

11@H_419_24@);

@"wangxiaogang"@H_419_24@UTF8String@H_419_24@],31@H_419_24@);

count=count+1@H_419_24@;//用于计数,可以观察到数据信息插入的情况

@H_419_24@NSLog@H_419_24@(@H_419_24@@"error insert data....");@H_419_24@

@H_419_24@NSLog@H_419_24@(@H_419_24@@"count is %d",count);//使用NSLOg显示数据插入的情况@H_419_24@

第四部分:无参数查询表信息,设计思路,获取表中全部数据,根据数据信息进行分类分别存储在不同动态数据中,然后将所用动态数据放在一个动态数据组中用于返回数据载体。该思路所涉及的数组比较多,也是最大缺点之一,也可以考虑使用实体类作为信息载体,最后把实体类放在数组中设为消息。

//@H_419_24@查找数据库中Student@H_419_24@表的数据信息

-(NSMutableArray@H_419_24@*)selectStudentInfotableFromDb:(sqlite3@H_419_24@*)db{

//检测数据库信息链接方式

[self@H_419_24@open@H_419_24@];

//设置外部消息载体

@H_419_24@NSMutableArray*studentArray=[[@H_419_24@NSMutableArrayalloc@H_419_24@]@H_419_24@init@H_419_24@];@H_419_24@

//设置本方法中信息载体@H_419_24@

NSMutableArray *sIDArray;

NSMutableArray *snameArray;

NSMutableArray *sSexarray;

NSMutableArray *sAge;

snameArray=[[NSMutableArray@H_419_24@alloc@H_419_24@]init@H_419_24@];

sSexarray=[[NSMutableArray@H_419_24@alloc@H_419_24@]init@H_419_24@];

sIDArray=[[NSMutableArray@H_419_24@alloc@H_419_24@]init@H_419_24@];

sAge=[[NSMutableArray@H_419_24@alloc@H_419_24@]init@H_419_24@];

@H_419_24@NSLog@H_419_24@(@H_419_24@@" Yes,Begin Reading info");@H_419_24@

@H_419_24@Nsstring@H_419_24@*sqlString=@H_419_24@@"SELECT sID,age FROM student";@H_419_24@

if@H_419_24@(sqlite3_prepare_v2@H_419_24@(database@H_419_24@,[sqlStringUTF8String@H_419_24@],65)">

@H_419_24@NSLog@H_419_24@(@H_419_24@@"yes,you ok");@H_419_24@

while@H_419_24@(sqlite3_step@H_419_24@(stmt)==sqlITE_ROW@H_419_24@) {

@H_419_24@//NSLog(@"------------------------");

NSInteger@H_419_24@sID=sqlite3_column_int@H_419_24@(stmt,0@H_419_24@);

char@H_419_24@*name=(char@H_419_24@*)sqlite3_column_text@H_419_24@(stmt,65)"> char@H_419_24@*Sex=(char@H_419_24@*)sqlite3_column_text@H_419_24@(stmt,65)"> NSInteger@H_419_24@Age=sqlite3_column_int@H_419_24@(stmt,65)"> //@H_419_24@设置接受信息@H_419_24@

Nsstring@H_419_24@*sIDStri=[[Nsstring@H_419_24@alloc@H_419_24@]initWithFormat@H_419_24@:@"%d"@H_419_24@,sID];

Nsstring@H_419_24@*nameStr=[[Nsstring@H_419_24@alloc@H_419_24@]initWithUTF8String@H_419_24@:name];

Nsstring@H_419_24@*SexStr=[[Nsstring@H_419_24@alloc@H_419_24@]initWithUTF8String@H_419_24@:Sex];

Nsstring@H_419_24@*AgeStr=[[Nsstring@H_419_24@alloc@H_419_24@]initWithFormat@H_419_24@:@"%d"@H_419_24@,Age];

[sIDArrayaddobject@H_419_24@:sIDStri];

[snameArrayaddobject@H_419_24@:nameStr];

[sSexarrayaddobject@H_419_24@:SexStr];

[sAgeaddobject@H_419_24@:AgeStr];

@H_419_24@NSLog@H_419_24@(@H_419_24@@"数据读写错误,数据库访问错误!!@H_419_24@");@H_419_24@

[studentArrayaddobject@H_419_24@:sIDArray];

[studentArrayaddobject@H_419_24@: snameArray];

[studentArrayaddobject@H_419_24@:sSexarray];

[studentArrayaddobject@H_419_24@:sAge];

return@H_419_24@studentArray;

第五部分:设置带参信息查询sqlite3_bind_int@H_419_24@(stmt,sID);用于设置参数信息,参数信息从1开始,而在

是从0开始设置参数,这也是我犯错误的地方。。

//@H_419_24@通过ID@H_419_24@信息查找详细信息

//@H_419_24@带参数信息查询

-(NSMutableArray@H_419_24@*)selectStudentInfotableByIDFromdb:(NSInteger@H_419_24@)sID {

@H_419_24@//打开检测链接@H_419_24@

;@H_419_24@

//@H_419_24@设置参数@H_419_24@

//@H_419_24@设置接受信息,进行数据格式转换@H_419_24@

//@H_419_24@加载信息@H_419_24@

[studentArrayaddobject@H_419_24@:sIDStri];

[studentArrayaddobject@H_419_24@:nameStr];

[studentArrayaddobject@H_419_24@:SexStr];

[studentArrayaddobject@H_419_24@:AgeStr];

本代码中还用很多不太清楚的地方,我本人虽然有些地方用到了,可是还是不是和理解,比如为什么非要使用UTF8格式信息,等相关内部信息问题。谢谢大家的阅读。。

把代码和自己的理解晒出来希望和有共同爱好的相互学习。

转自:http://blog.sina.com.cn/s/blog_879201790100vqd7.html

总结

以上是内存溢出为你收集整理的Sqlite3.0数据库在iPhone中的应用全部内容,希望文章能够帮你解决Sqlite3.0数据库在iPhone中的应用所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1174780.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存