sqlite学习
一鼓作氣,今天繼續(xù)學習了sqlite數(shù)據(jù)庫在Xcode上的一些操作,主要是通過用oc代碼進行salite表格的創(chuàng)建,刪除,修改;以及對現(xiàn)有的表格數(shù)據(jù)進行增,刪,改,查。雖然有點累,但是收獲不小,感覺很充實,繼續(xù)加油!
? ? ??
//把數(shù)據(jù)庫sqlite3導入到工程(在Bulider Phrase 中的Linker中點擊?號,查找sqlite3文件,選擇再添加即可)
? ? //打開數(shù)據(jù)庫
? ? //提供C的字符串,c串時我們要打開數(shù)據(jù)庫的完整路徑和文件名
? ? NSString *path=NSHomeDirectory();//獲得家的路徑
? ? path=[path stringByAppendingPathComponent:@"mydb.sqlite"];
? ? NSLog(@"%@",path);
? ? sqlite3 *db;
? ? //打開數(shù)據(jù)庫,如果沒有這個數(shù)據(jù)庫,就創(chuàng)建這個數(shù)據(jù)庫的文件并且打開這個數(shù)據(jù)庫,如果有這個數(shù)據(jù)庫就直接打開該數(shù)據(jù)庫
? ? sqlite3_open([path UTF8String], &db);
? ? int result=sqlite3_open([path UTF8String], &db);
? ? //判斷打開數(shù)據(jù)庫是否成功
? ? if (result!=SQLITE_OK) {
? ? ? ? NSLog(@"打開失敗!");
? ? }
? ? //關閉數(shù)據(jù)庫
? ? sqlite3_close(db);
?? ?
? ? //提供C的字符串,c串時我們要打開數(shù)據(jù)庫的完整路徑和文件名
? ? NSString *path1=NSHomeDirectory();//獲得家的路徑
? ? path1=[path1 stringByAppendingPathComponent:@"mydb.sqlite"];
? ? sqlite3 *mydb;//創(chuàng)建一個數(shù)據(jù)庫名叫mydb
? ? //打開數(shù)據(jù)庫,如果沒有這個數(shù)據(jù)庫,就創(chuàng)建這個數(shù)據(jù)庫的文件并且打開這個數(shù)據(jù)庫,如果有這個數(shù)據(jù)庫就直接打開該數(shù)據(jù)庫
?? ? sqlite3_open([path UTF8String], &mydb);
? ? //對數(shù)據(jù)庫進行操作
? ? //定制一個sql表
? ? char *sql="create table if not exists t_student(name text,age integer)";
? ? char *err;//出錯信息
? ? //運行sql,并返回運行結果
? ? result=sqlite3_exec(mydb, sql, NULL, NULL, &err);
? ? //判斷運行是否成功
? ? if (result!=SQLITE_OK) {
? ? ? ? NSLog(@"運行sql錯誤,error原因:%s",err);
? ? }
?? /*
? ? //增
? ? NSString *name=self.nameText.text;
? ? NSString *age=self.ageText.text;
? ? //sql="insert into t_student(name,age) values('張三',22) ";
? ? NSString *sql1=[NSString stringWithFormat:@"insert into t_student(name,age) values('%@',%@)",name,age];
? ? //將OC的字符串轉化為C字符串
? ? //[sql1 UTF8String];
? ? //運行sql,并返回運行結果
? ? result=sqlite3_exec(mydb,[sql1 UTF8String],NULL,NULL,&err);
? ? if (result!=SQLITE_OK)
? ? {
? ? ? ? NSLog(@"運行sql錯誤,error原因:%s",err);
? ? }
?? ? */
? ? /*
? ? //增,(可以插入特殊字符,用綁定的方式)
? ? NSString *name=self.nameText.text;
? ? NSString *age=self.ageText.text;
? ? char *sql2="insert into t_student(name,age) values(?,?) ";
? ? sqlite3_stmt *stmt;//stmt本身為指向行的指針,故該定義為一個指向指針的指針,即表示一個二維數(shù)組
? ? //運行sql,并返回運行結果
? ? result=sqlite3_prepare_v2(mydb,sql2,-1,&stmt,NULL);
? ? if (result==SQLITE_OK)
? ? {
?? ? ? // 綁定參數(shù)
? ? ? ? result=sqlite3_bind_text(stmt, 1, [name UTF8String],-1, NULL);
? ? ? ? //判斷綁定姓名是否成功
? ? ? ? if (result!=SQLITE_OK) {
? ? ? ? ? ? NSLog(@"綁定姓名失敗!!!");
? ? ? ? }
? ? ? ? // 綁定參數(shù)
? ? ? ? result=sqlite3_bind_int(stmt, 2, [age intValue]);
? ? ? ? //判斷綁定姓名是否成功
? ? ? ? if (result!=SQLITE_OK) {
? ? ? ? ? ? NSLog(@"綁定年齡失敗!!!");
? ? ? ? }
? ? }
? ? if (sqlite3_step(stmt)!=SQLITE_DONE)
? ? {
? ? ? ? NSLog(@"插入數(shù)據(jù)失敗!!!");
? ? }
? ? sqlite3_finalize(stmt);
? ? */
?? ?
?? /*
? ? //刪
? ? sql="delete from t_student where age=26";
? ? //運行sql,并返回運行結果
? ? result=sqlite3_exec(mydb, sql, NULL, NULL, &err);
? ? //判斷運行是否成功
? ? if (result!=SQLITE_OK) {
? ? ? ? NSLog(@"運行sql錯誤,error原因:%s",err);
? ? }
? ? */
? ? /*
? ? //刪除,用綁定的方式
? ? NSString *name=self.nameText.text;
? //NSString *age=self.ageText.text;
? ? sqlite3_stmt *stmt;
? ? char * sql3="delete from t_student where name=?";
? ? //運行sql,并返回運行結果
? ? result=sqlite3_prepare_v2(mydb, sql3, -1, &stmt, NULL);
? ? //判斷運行是否成功
? ? if (result==SQLITE_OK)
? ? {
? ? ? ? // 綁定參數(shù)
? ? ? ? result=sqlite3_bind_text(stmt, 1, [name UTF8String],-1, NULL);
? ? ? ? //判斷綁定姓名是否成功
? ? ? ? if (result!=SQLITE_OK) {
? ? ? ? ? ? NSLog(@"綁定姓名失敗!!!");
? ? ? ? }
? ? ? ? else
? ? ? ? {
? ? ? ? // 綁定參數(shù)
? ? ? ? result=sqlite3_step(stmt);
? ? ? ? //判斷綁定姓名是否成功
? ? ? ? ? ? if(result!=SQLITE_DONE)
?? ? ? ? ? ? {
?? ? ? ? ? ? ? NSLog(@"刪除失敗!!!");
? ? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? else
? ? {
? ? ? ? NSLog(@"綁定失敗!!!");
? ? }
? ? sqlite3_finalize(stmt);
?? ? */
? ? /*
? ? //改
? ? sql="update t_student set name='趙六' where age=22 ";
? ? //運行sql,并返回運行結果
? ? result=sqlite3_exec(mydb, sql, NULL, NULL, &err);
? ? //判斷運行是否成功
? ? if (result!=SQLITE_OK)
? ? {
? ? ? ? NSLog(@"運行sql錯誤,error原因:%s",err);
? ? }
?? ? */
? ? //修改,用綁定的方式
? ? char *sql4="update t_student set name=? where age=?";
? ? NSString *name=self.nameText.text;
? ? NSString *age=self.ageText.text;
? ? BOOL bFlag=NO;
? ? sqlite3_stmt *stmt;
? ? result=sqlite3_prepare_v2(mydb, sql4 , -1, &stmt ,NULL);
? ? if (result==SQLITE_OK) {
? ? ? ? result=sqlite3_bind_text(stmt, 1, [name UTF8String], -1, NULL);
? ? ? ? if (result!=SQLITE_OK) {
? ? ? ? ? ? NSLog(@"綁定姓名失敗!!!");
? ? ? ? ? ? bFlag=YES;
? ? ? ? }
? ? ? ? result=sqlite3_bind_int(stmt, 2, [age intValue]);
? ? ? ? if (result!=SQLITE_OK) {
? ? ? ? ? ? NSLog(@"綁定年齡失敗!!!");
? ? ? ? ? ? bFlag=YES;
? ? ? ? }
? ? ? ? if (bFlag==NO) {
? ? ? ? ? ? result=sqlite3_step(stmt);
? ? ? ? ? ? if (result!=SQLITE_DONE) {
? ? ? ? ? ? ? ? NSLog(@"修改失敗!!!");
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? else
? ? {
? ? ? ? NSLog(@"預處理失敗(準備運行失敗 )!!!");
? ? }
? ? //查
?? ?
? ? sql="select * from t_student";
? ? result=sqlite3_prepare_v2(mydb, sql , -1, &stmt ,NULL);
? ? if (result==SQLITE_OK)
? ? {
? ? ? ? //遍歷返回的結構
? ? ? ? while(sqlite3_step(stmt)==SQLITE_ROW)//的到返回結構的一行
? ? ? ? {
? ? ? ? ? ? char*name=(char*)sqlite3_column_text(stmt, 0);//的到返回結構的一列,其中0代表第一列,依次類推
? ? ? ? ? ? int age=sqlite3_column_int(stmt, 1);//的到返回結果的第二列
? ? ? ? ? ? NSString *strname=[NSString stringWithUTF8String:name];
? ? ? ? ? ? NSLog(@"name=%@,age=%d",strname,age);
? ? ? ? }
? ? }
? ? else
? ? {
? ? ? ? NSLog(@"預處理失敗");
? ? }
? ? sqlite3_finalize(stmt);//釋放層數(shù)占用的資源
? ? sqlite3_close(mydb);
轉載于:https://www.cnblogs.com/kl137754356/p/5995831.html
總結
- 上一篇: Codeforces Round #37
- 下一篇: 发动机号码怎么看的