数据库

来源:互联网 发布:视频屏蔽广告软件 编辑:程序博客网 时间:2024/05/17 01:10
//
//  ViewController.m
// 数据持久化和数据库
//
//  Created by熊永静on 16/1/4.
//  Copyright © 2016. All rights reserved.
//
/*
 
数据库sqlite
 sqlite3
 
数据持久化的一种
 plist NSUserDefaults
归档 sqlite
 sqlite
 
 
关系型数据库,以表格的形式存储
 
 
sqlite中类似表格的表头的位置是字段(字段是用来查找数据的关键字《每张表格的关键字,不能重名》)
 
 
可以通过这张表格任意一个字段,查找到对应的那条数据
 
 sqlite
中可以有多个表,表与表之间是通过主键和外键关联起来的
 sqlite
最上面横向的是字段名,字段名不能重复(同一张表)
 
查找某条数据的关键字
 
 
在字段的下面是每一条数据(存储的内容)
 sqlite
中可以有多张表表关联->主键外键
 --------------------------------------------
 
操作数据库
 1
sqlstructured query language)结构化查询语言
 
 sql
语句->结构化查询语言组成的一条语句
 
 2
、操作数据库的函数(C语言)
 
 
sql语句
 
 
常用关键字:selectinsertupdatedeletefromcreatewheredescorderbygrouptabledropviewindex等等
 
 
功能性:建表、删表
 
操作类:增、删、改、查
 
 
建表:create table
 
删表:drop table
 
 
建表的公式:create table表名(字段名类型,字段名类型);
 
删表公式:drop table表名
 
//
如果不存在这个表,就去创建(if not exists
 create table if not exists
表名 (字段名类型,字段名类型)
//
例子
 create table if not exists user (name text, age integer)
 
 
ID自动增长把某个字段设置成主键,并让他自动增长
 create table if not exists user (id integer primary key autoincrement, name text, age integer)
 
 integer:
整型值
 real:
浮点值
 text:
文本字符串
 blob:
二进制数据
 
 
删表公式:drop table表名
 drop table user
//
如果User存在就删除
  drop table if exists user
 -----------------------------------------
 
操作数据
 
增删改查
 
 
增:inster into values
 inster into
表名(字段名) values(值)
 
删:delete from 
 delete from
表名 where 字段 = '';
 
改:updata form where set
//
将哪一个字段的值改成一个新的值
 update
表名 set 字段名 = '新值' where字段名= '';
 
查:select from where
//
查询某一数据数据
 select
字段(整条数据所包含的字段) from 表名 where 字段 like ?;
//
查询整个表
 select from
表名 *
 -----------------------------------------
 iOS
中操作数据库的函数
 1
、在使用数据库之前需要导入sqlite3
 
 2
、打开数据库和关闭数据库:
  sqlite3_open(<#const char *filename#>, <#sqlite3 **ppDb#>)
打开数据库
 sqlite3_close(<#sqlite3 *#>)
关闭数据库
 3
、(如果没有建表,需要建表)增删改对应的操作
   
查对应的操作 关闭数据库
 
对表格进行操作:
 sqlite3_exec(<#sqlite3 *#>, <#const char *sql#>, <#int (*callback)(void *, int, char **, char **)#>, <#void *#>, <#char **errmsg#>)

 
查询:
 1
、核对sql语句的合法性
 sqlite3_prepare_v2(<#sqlite3 *db#>, <#const char *zSql#>, <#int nByte#>, <#sqlite3_stmt **ppStmt#>, <#const char **pzTail#>)
 
 2
、绑定要查询的数据
 sqlite3_bind_text(<#sqlite3_stmt *#>, <#int#>, <#const char *#>, <#int#>, <#void (*)(void *)#>)
 
 3
、开始查询
 sqlite3_column_text(<#sqlite3_stmt *#>, <#int iCol#>)
 
 
使用完毕数据库,及时关闭数据库
 */

#import"ViewController.h"
#import
<sqlite3.h>
@interfaceViewController()<UITextFieldDelegate>
{
   
sqlite3 *db;
   
UIView *baview;

}
@end

@implementationViewController
- (
void)viewDidLoad {
    [
superviewDidLoad];
  
//   打开数据库
//    (1)数据库的文件路径
//    (2)打开数据库
//   创建一个叫课件的数据库课件.sqlite
   
NSArray *pathList =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES);
   
NSString *path = [[pathListlastObject]stringByAppendingPathComponent:@"课件.sqlite"];
//    [path UTF8String];直接转换成char *类型
//   需要两个值:1、文件路径2、数据库对象的内存地址
//    sqlite3_open返回值是int类型,可以通过系统定义的一个宏定义来判断是否打开成功
   
if (sqlite3_open([pathUTF8String], &db) !=SQLITE_OK) {
       
NSLog(@"打开数据库失败");
       
sqlite3_close(db);//关闭数据库
    }
   
else{
   
       
NSLog(@"%@",path);
    }
//建表
//  需要传的对象
//    1、数据库对象
//    2sql语句
//    34NULL
//    5、传一个char *类型的字符串如果有错误,会返回一个错误信息
//    char *error;
//    sqlite3_exec(db, [@"建表(添加、修改、删除)的语句" UTF8String], NULL, NULL, &error);
  
   
   
/*
 
在操作数据库的时候删除或者添加字段都需要将原来的数据库删除再去运行,否则回崩溃。
 */

//   ""内使用字符串使用''
//    [self addName:@"肖耐" age:18];
//    [self addName:@"许弋" age:18];
//   
//    sqlite3_exec(db, [@"update user set name = '豆豆' where name = '小明';"UTF8String], NULL, NULL, &error);
   
//   查询
//    1、查询sql语句是否合法
//   需要传的值:
// ①数据库的对象。②sql语句。③-1不限制查询语句的长度。④结果集的内存地址。⑤nil
   
   
sqlite3_stmt *stmt;//结果集查询到的数据会存放在结果集里面。
   
int isVerify =sqlite3_prepare_v2(db, [@"select * from user where name like ?"UTF8String], -1, &stmt,nil);
   
if (isVerify ==SQLITE_OK){
//        2、绑定要查询的数据
//       ①绑定要查询的数据
       
NSString *searchString =@"";
//       ①数据集的队像。②绑定的第几个问号。③查询的内容。④要查询的长度-1。⑤null
//       查询到的内容前后都可以有数据
       
NSString *s = [NSStringstringWithFormat:@"%%%@%%",searchString];

       
      
sqlite3_bind_text(stmt,1, [sUTF8String], -1,NULL);
//        sqlite3_step查询还有没有下一个结果
//        int next = sqlite3_step(stmt);
//        while循环会一直判断括号里面的条件,所以要把查询是不是还有下一步的方法sqlite3_step(stmt)放在括号里面
       
while (sqlite3_step(stmt) ==SQLITE_ROW) {
//           只要走一次循环就会查找到一条数据,存放在结果集中
//            3、分离结果集中的数据。(列是从0开始)
//           ①结果集的参数。②列数
           
char *name = (char*)sqlite3_column_text(stmt,0);
           
int  age =sqlite3_column_int(stmt,1);

          
NSString *nameString = [NSStringstringWithCString:nameencoding:NSUTF8StringEncoding];
           
NSLog(@"=%@ %d",nameString,age);

        }
    }
    [
selfaddRightButtonItem];
 }

- (
void)addName:(NSString*)name age:(int)age{
   
char *error;
   
   
NSString *sql = [NSStringstringWithFormat:@"insert into user (name,age) values('%@',%d);",name,age];
   
int insertresult =sqlite3_exec(db, [sql UTF8String],NULL,NULL, &error);
   
if (insertresult !=SQLITE_OK) {
       
NSLog(@"%s",error);
    }


}

- (
void)addRightButtonItem{
   
UIBarButtonItem *barButton = [[UIBarButtonItemalloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAddtarget:selfaction:@selector(showAddView)];
   
   
self.navigationItem.rightBarButtonItem= barButton;
}

- (
void)showAddView{
  
baview = [[UIViewalloc]initWithFrame:CGRectMake(0,0,414,414)];
   
baview.backgroundColor= [UIColoryellowColor];
   
baview.center=self.view.center;
    [
self.viewaddSubview:baview];
   
   
NSArray *list =@[@"名字",@"年龄"];
   
for (inti=0; i<2; i++) {
       
UITextField *textField = [[UITextFieldalloc]initWithFrame:CGRectMake(50,20+70*i,200,50)];
        textField.
placeholder= list[i];
       
        textField.
borderStyle=UITextBorderStyleRoundedRect;
        textField.
delegate=self;
       
        textField.
tag=100+i;
        textField.
clearButtonMode=UITextFieldViewModeWhileEditing;
       
        [
baviewaddSubview:textField];
    }
   
UIButton *doneButton = [UIButtonbuttonWithType:UIButtonTypeCustom];
    doneButton.
frame=CGRectMake(50,150,100,50);
    [doneButton
setTitle:@"完成"forState:UIControlStateNormal];
    doneButton.
backgroundColor= [UIColorcolorWithRed:1.000green:0.435blue:0.812alpha:1.000];
    doneButton.
showsTouchWhenHighlighted=YES;
    [
baviewaddSubview:doneButton];
    [doneButton
addTarget:selfaction:@selector(done)forControlEvents:UIControlEventTouchDown];
}

- (
void)done{
   
UITextField *nameText = [self.viewviewWithTag:100];
    
UITextField *ageText = [self.viewviewWithTag:101];
    [nameText
resignFirstResponder];
    [ageText
resignFirstResponder];
//   网数据库中添加数据
    [
selfaddName:nameText.textage:[ageText.textintValue]];
//   移除点击添加按钮出现的视图
    [
baviewremoveFromSuperview],baview=nil;
   
}

- (
void)textFieldDidEndEditing:(UITextField*)textField{
   
NSLog(@"%@",textField.text);
}

- (
BOOL)textFieldShouldReturn:(UITextField*)textField{

   
return textField;
   
}
- (
void)didReceiveMemoryWarning {
    [
superdidReceiveMemoryWarning];
   
// Dispose of any resources that can be recreated.
}

@end
0 0