概述这两天终于把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中的应用所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)