ios中sqlite的使用
Phone中支持通过sqlite3来过过iPhone本地的数据过。
具使用方法如下体
1:添加过过包libsqlite3.0.dylib
首先是过置过目文件~在过目中添加iPhone版的sqlite3的据过的过过包~在过目下的数Frameworks点过右过~然后过过libsqlite3.0.dylib文件(如下过)。
。。。
libsqlite3.0.dylib文件地址:
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS2.2.sdk/usr/lib/libsqlite3.0.dylib
2~代过中的操作,
那过接下是代过了。来
1 首先过取iPhone上sqlite3的数据过文件的地址
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,
YES);
NSString *documentsDirectory = [paths objectAtIndex:0];NSString *path = [documentsDirectory stringByAppendingPathComponent:@"database_name"];
2 打过iPhone上的sqlite3的据过文件数
sqlite3 *database;
sqlite3_open([path UTF8String], &database);3 准过sql文,,,sql过句
sqlite3_stmt *stmt;
const char *sql = "SELECT * FROM table_name WHERE pk=? and name=?";sqlite3_prepare_v2(database, sql, -1, &stmt, NULL);
4 邦定参数
// 邦定第一个int参数
sqlite3_bind_int(stmt, 1, 1);
// 邦定第二字符串个参数
sqlite3_bind_text(stmt, 2, [title UTF8String], -1, SQLITE_TRANSIENT);
5 过行sql文
sqlite3_step(stmt);
6 过放sql文过源
sqlite3_finalize(stmt);
7 过过iPhone上的sqlite3的数据过
sqlite3_close(database);
以下演示一下使用sqlite的步过~先过建一据过~然后过过其中的容。个数内2重要过和个构体5主要函,个数sqlite3 *pdb, 据过句柄~文件句柄数跟FILE过似很
sqlite3_stmt *stmt, 过相于个当ODBC的Command过象~用于保存过过好的SQL过句sqlite3_open(), 打过据过数
sqlite3_exec(), 过行非过过的sql过句
sqlite3_prepare(), 准过sql过句~过行select过句或者要使用parameter bind过~用过函;封了个数装
sqlite3_exec,.
Sqlite3_step(), 在过用sqlite3_prepare后~使用过函在过过集中移过。个数
Sqlite3_close(), 过过据过文件数
过有一系列的函~用于过过集字段中过取据~如数从数
sqlite3_column_text(), 取text过型的据。数
sqlite3_column_blob;,~取blob过型的据数
sqlite3_column_int(), 取int过型的据数
PreparedStatement方式过理SQL过求的过程
特点,可以过定~生成过程。过行的过候像是参数ADO一过~每次返回一行过果。
1. 首先建立statement过象,
int sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nBytes, /* Length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
2. 过定过程中的;如果有有定的,参数没确参数
int sqlite3_bind_xxxx(sqlite3_stmt*, int, ...);第二个int过型,表示的在参数参数SQL中的序;号从1过始,。
第三过要过定的过。个参数参数
过于blob和text过的过外,数参数
第四是字符串;参数Unicode 8or16,的过度~不包括过束'\0'。
第五~过型过个参数void(*)(void*)~表示SQLite过理过束后用于理字符串的函。清参数数
没参数将有过行过定的未知被过过是NULL。
3. 过行过程
int sqlite3_step(sqlite3_stmt*);
可能的返回过,
*SQLITE_BUSY: 据过被过定~需要等待再次过过直到成功。数
*SQLITE_DONE: 成功过行过程;需要再次过行一遍以恢过据过过,数状
*SQLITE_ROW: 返回一行过果;使用sqlite3_column_xxx(sqlite3_stmt*,, int iCol)得到每一列的过果。
再次过用返回下一行的过果。将
*SQLITE_ERROR: 行过过~过程无法再次过用;过过容考运内参sqlite3_errmsg函返回过,数
*SQLITE_MISUSE: 过过的使用了本函;一般是过程有正的初始化,数没确
4. 过束的过候理清statement过象
int sqlite3_finalize(sqlite3_stmt *pStmt);过过在过过据过之前理过程中占用的过源。数清
5. 重置过程的过行
int sqlite3_reset(sqlite3_stmt *pStmt);过程回到有过行之前的过~过定的不过化。将没状参数会
其他工具函数
1. 得到过果过共的行数
int sqlite3_column_count(sqlite3_stmt *pStmt);如果过程有返回过~如没update~返回将0
2. 得到前行中包含的据当数个数
int sqlite3_data_count(sqlite3_stmt *pStmt);如果sqlite3_step返回SQLITE_ROW~可以得到列~否过过零。数
3. 得到据行中某列的据数个数
sqlite3_column_xxx(sqlite3_stmt*, int iCol);
在sqlite3_step返回SQLITE_ROW后~使用得到第它iCol列的据。数
其中的xxx代表,
blob,指向保存据存的指过数内
bytes, bytes16: 得到过blob过型据的大小~或者数text过过过UTF8/UTF16的字符串过度。double, int, int64, 过数
text,text16,字符串指过
type:过列的据过型数
;SQLITE_INTEGER~SQLITE_FLOAT~SQLITE_TEXT~SQLITE_BLOB~SQLITE_NULL,
注意,如果过过列使用了不同过列本身过型适合的据过取方法~得到的过过是过过过的过果。与数数将
4. 得到据行中某列的据的过型数个数
int sqlite3_column_type(sqlite3_stmt*, int iCol);返回过,SQLITE_INTEGER~SQLITE_FLOAT~SQLITE_TEXT~SQLITE_BLOB~SQLITE_NULL
使用的方法和sqlite3_column_xxx()函过似。数
Ios 中 SQLite3.0 的过过过用。。
2011-12-21 15:22 107人过过 过过(0) 收藏 过过
过天过于把两Sqlite据过在数iPhone中的过用了。。 搞懂
过是那些增过改过~却有存过过程之过的~据过型也少了。过了初始化据~自己感过有过
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
可以过行没数数两~都可以使据初始化一次,一过是使用主过过束 ;数sid integer PRIMARY KEY,~一过是在AppDelegate文
件中初始化。过过我自己感过可以过过用一次据数信息。
下面是iPhone程序中使用的部分代过信息,
第一部分,用于过过过信息中是否已存在mydatabase.sql据过数信息~若存在过直接打过~若不存在过新建本数数据过文件~然后在打过过据过文件。
-(BOOL)open{
//过取路径数过
NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
//过取路径数个过中第一信息
NSString*documentsDirectory=[paths objectAtIndex:0];
//过过过建的文件信息
NSString*path=[documentsDirectory stringByAppendingPathComponent:@"mydatabase.sql"];
NSFileManager*fileManager=[NSFileManager defaultManager];BOOL find=[fileManager fileExistsAtPath:path];
if (find) {
if (sqlite3_open([path UTF8String], &database)!=SQLITE_OK) {
sqlite3_close(database);
NSLog(@"Sorror, Opening db file Error"); //使用NSLog用于过示过过过状
return NO;
}
return YES;
}
else {
sqlite3_close(database);
NSLog(@"Sorror, Opening db file Error ,and Not Link Db");
return NO;
}
}
第二部分,过建表 ~可以由用过过置主过和SQLServer一过也可以过置自过增过信息。
//过建生表学信息
-(BOOL)CreateTableStudent:(sqlite3 *)db{
char *errorMsg;
// 本信息是用于过除表
// NSLog(@"first Delete tabel");
// NSString *DeleteTable=@"drop table student";//
// if (sqlite3_exec(db, [DeleteTable UTF8String], NULL, NULL, &errorMsg)==SQLITE_OK) {// //sqlite3_close(db);
// //NSAssert1(0, @"Error creating table: %s", errorMsg);
// NSLog(@"delect table------------------------");// }
// NSLog(@"delect table");
//表中过置主过可消除重过添加
NSString *createSql=@"Create table if not exists student(sid integer PRIMARY KEY
autoincrement,name text,sex text,age integer)";// 在Sqlite中不可以直接使用字符串信息~必过使用UTF8String过行据数格式过化~但是至今不明白过什过// 过过做
if (sqlite3_exec(db, [createSql UTF8String], NULL, NULL, &errorMsg)!=SQLITE_OK) {
sqlite3_close(db);
NSAssert1(0, @"Error creating table: %s", errorMsg);
}
NSLog(@"studentTable is created successfuly"); //过示过建成功
return YES;
}
第三部,初始化据数数数参数从信息;增加据信息,~据是1过始的~values(?,?,?,?)使用过作过占号位符~占位符的信息是从1过始过的~过过过是得数与找Where过句后面的参数形式不是一致。
//生表中初始化据学数信息
-(void)InsertIntoStudentTable:(sqlite3 *)database{
char* insert="insert or replace into student(sid,name,sex,age) values(?,?,?,?);";
sqlite3_stmt *stmt;
int count=0; //用于过~可以过数数插况察到据信息入的情
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 1);
sqlite3_bind_text(stmt, 2, [@"zhixuan" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"F" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 23);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 2);
sqlite3_bind_text(stmt, 2, [@"liyan" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"M" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 23);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 3);
sqlite3_bind_text(stmt, 2, [@"zhangzhixuan" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"F" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 23);
count=count+1;
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 4);
sqlite3_bind_text(stmt, 2, [@"zhangliguang" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"F" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 21);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 5);
sqlite3_bind_text(stmt, 2, [@"liyanfen" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"M" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 19);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 6);
sqlite3_bind_text(stmt, 2, [@"zhangsan" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"F" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 23);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 7);
sqlite3_bind_text(stmt, 2, [@"wanggang" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"F" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 23);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 8);
sqlite3_bind_text(stmt, 2, [@"lisi" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"M" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 25);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 9);
sqlite3_bind_text(stmt, 2, [@"yanhua" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"M" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 20);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
//10
if (sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK) {
sqlite3_bind_int(stmt, 1, 10);
sqlite3_bind_text(stmt, 2, [@"xueyan" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"M" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 23);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"insert error .....");
}
if(sqlite3_prepare_v2(database, insert, -1, &stmt, nil)==SQLITE_OK){
sqlite3_bind_int(stmt, 1, 11);
sqlite3_bind_text(stmt, 2, [@"wangxiaogang" UTF8String], -1, NULL);
sqlite3_bind_text(stmt, 3, [@"F" UTF8String], -1, NULL);
sqlite3_bind_int(stmt, 4, 31);
count=count+1; //用于过~可以过数数插况察到据信息入的情
}
if (sqlite3_step(stmt)!=SQLITE_DONE) {
NSLog(@"error insert data....");
}
NSLog(@"count is %d",count); //使用NSLOg过示据数插况入的情
}
第四部分,无过过表参数数数数信息~过过思路~过取表中全部据~根据据信息过行分过分过存过在不同过过据中~然后将数个数所用过过据放在一 过过据过中用于返回据过。过数体数思路所涉及的过过比过多~也是最大缺点之一~也可以考过使用过过作过体体体数信息过~最后把过过放在过中过过消息。
//过据过中找数Student表的据数信息
-(NSMutableArray *)selectStudentInfoTableFromDb:(sqlite3 *)db{
//过过据过数信息过接方式
[self open];
//过置外部消息过体
NSMutableArray *studentArray=[[NSMutableArray alloc]init];
//过置本方法中信息过体
NSMutableArray *sidArray;
NSMutableArray *snameArray;
NSMutableArray *sSexarray;
NSMutableArray *sAge;
snameArray=[[NSMutableArray alloc]init];
sSexarray=[[NSMutableArray alloc]init];
sidArray=[[NSMutableArray alloc]init];
sAge=[[NSMutableArray alloc]init];
NSLog(@" Yes,Begin Reading info");
NSString *SQLString=@"SELECT sid,name,sex,age FROM student";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, [SQLString UTF8String], -1, &stmt, nil)==SQLITE_OK) {
NSLog(@"yes ,you ok");
while (sqlite3_step(stmt)==SQLITE_ROW) {
//NSLog(@"------------------------");
NSInteger sid=sqlite3_column_int(stmt, 0);
char *name=(char *)sqlite3_column_text(stmt, 1);
char *Sex=(char *)sqlite3_column_text(stmt, 2);
NSInteger Age=sqlite3_column_int(stmt, 3);
//过置接受信息
NSString *sidStri=[[NSString alloc]initWithFormat:@"%d",sid];
NSString *NameStr=[[NSString alloc]initWithUTF8String:name];
NSString *SexStr=[[NSString alloc]initWithUTF8String:Sex];
NSString *AgeStr=[[NSString alloc]initWithFormat:@"%d",Age];
[sidArray addObject:sidStri];
[snameArray addObject:NameStr];
[sSexarray addObject:SexStr];
[sAge addObject:AgeStr];
}
}
else{
NSLog(@"据过过过~据过过过过过数写数,,");
}
[studentArray addObject:sidArray];
[studentArray addObject: snameArray];
[studentArray addObject:sSexarray];
[studentArray addObject:sAge];
return studentArray;
}
第五部分,过置过参信息过过sqlite3_bind_int(stmt, 1, sid);用于过置参数参数从信息~信息1过始~而在
NSInteger sid=sqlite3_column_int(stmt, 0);
char *name=(char *)sqlite3_column_text(stmt, 1);
char *Sex=(char *)sqlite3_column_text(stmt, 2);
NSInteger Age=sqlite3_column_int(stmt, 3);是从0过始过置~过也是我参数犯过过的地方。。
//通过Id信息过过过找信息
//过参数信息过过
-(NSMutableArray *)selectStudentInfoTableByIDFromdb:(NSInteger)sid {
//打过过过过接
[self open];
NSMutableArray *studentArray=[[NSMutableArray alloc]init];
NSLog(@" Yes,Begin Reading info");
NSString *SQLString=@"SELECT sid,name,sex,age FROM student where sid=?";
sqlite3_stmt *stmt;
if (sqlite3_prepare_v2(database, [SQLString UTF8String], -1, &stmt, nil)==SQLITE_OK) {
//过置参数
sqlite3_bind_int(stmt, 1, sid);
while (sqlite3_step(stmt)==SQLITE_ROW) {
NSInteger sid=sqlite3_column_int(stmt, 0);
char *name=(char *)sqlite3_column_text(stmt, 1);
char *Sex=(char *)sqlite3_column_text(stmt, 2);
NSInteger Age=sqlite3_column_int(stmt, 3);
//过置接受信息~过行据数格式过过
NSString *sidStri=[[NSString alloc]initWithFormat:@"%d",sid];
NSString *NameStr=[[NSString alloc]initWithUTF8String:name];
NSString *SexStr=[[NSString alloc]initWithUTF8String:Sex];
NSString *AgeStr=[[NSString alloc]initWithFormat:@"%d",Age];
//加过信息
[studentArray addObject:sidStri];
[studentArray addObject:NameStr];
[studentArray addObject:SexStr];
[studentArray addObject:AgeStr];
}
}
else{
NSLog(@"据过过过~据过过过过过数写数,,");
}
return studentArray;
}
本代过中过用很清多不太楚的地方~我本人过然有些地方用到了~可是过是不是和理解~比如过什过非要使用
UTF8格式信息~等相过内部信息过过。过过大家的过过。。