您的位置:首页 > 数据库

ios初学SQLite3(创建、插入、查询、更新数据库和表)

2016-06-12 21:37 357 查看
一、必备条件

在ios项目中使用sqlite需要添加  libsqlite3.dylib 库



二、简单介绍常用方法

sqlite3          *db,
数据库句柄,跟文件句柄FILE很类似

sqlite3_stmt      *stmt, 这个相当于ODBC的Command对象,用于保存编译好的SQL语句

sqlite3_open(),   打开数据库,没有数据库时创建。

sqlite3_exec(),   执行非查询的sql语句

Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。

Sqlite3_close(), 关闭数据库文件

还有一系列的函数,用于从记录集字段中获取数据,如

sqlite3_column_text(), 取text类型的数据。

sqlite3_column_blob(),取blob类型的数据

sqlite3_column_int(), 取int类型的数据

三、创建(或打开)数据库

3-1首先自定义一个方法,返回我们当前应用程序沙盒目录(也就是说希望数据库保存在哪里)

[cpp]
view plain
copy

-(NSString *) dataFilePath{  
  
   NSArray *path =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);  
  
    NSString *document = [path objectAtIndex:0];  
  
    return [document stringByAppendingPathComponent:TABLENAME];//'persion.sqlite'  
  
}  

3-2 在指定位置 创建或打开一个数据库

SQLITE_OK是sqlite3的一个常量,代表操作执行成功

[java]
view plain
copy

//SQLite3  
  
sqlite3 *database;  
if (sqlite3_open([[self dataFilePath] UTF8String], &database)!=SQLITE_OK) {  
    sqlite3_close(database);  
    NSAssert(0, @"open database faid!");  
    NSLog(@"数据库创建失败!");  
}  

【注意】由于sqlite3是基于C语言编写的,而不是纯粹的object-c,所以有关字符串,我们不能使用NSString,因为它不识别,所以只能用c语言的字符串,char*,好在Nsstring提供了转换的方法,那就是 UTF8String。



上图便是我们创建的数据库在app中的指定位置。

四、创建一张表

[cpp]
view plain
copy

NSString *ceateSQL = @"CREATE TABLE IF NOT EXISTS PERSIONINFO(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER, SEX TEXT, WEIGHT INTEGER, ADDRESS TEXT)";  
  
char *ERROR;  
  
if (sqlite3_exec(database, [ceateSQL UTF8String], NULL, NULL, &ERROR)!=SQLITE_OK){  
    sqlite3_close(database);  
    NSAssert(0, @"ceate table faild!");  
    NSLog(@"表创建失败");  
}  

我创建了一张名为PERSIONINFO的数据库表,其中有一个自增的ID,和NAME,AGE,SEX,WEIGTH,ADDRESS五个属性。

五、查询表数据

[cpp]
view plain
copy

NSString *quary = @"SELECT * FROM PERSIONINFO";//SELECT ROW,FIELD_DATA FROM FIELDS ORDER BY ROW  
sqlite3_stmt *stmt;  
if (sqlite3_prepare_v2(database, [quary UTF8String], -1, &stmt, nil) == SQLITE_OK) {  
      
    while (sqlite3_step(stmt)==SQLITE_ROW) {  
          
        char *name = (char *)sqlite3_column_text(stmt, 1);  
        NSString *nameString = [[NSString alloc] initWithUTF8String:name];  
        self.nameTextField.text = nameString;  
        [nameString release];  
          
        int age = sqlite3_column_int(stmt, 2);  
        self.ageTextField.text = [NSString stringWithFormat:@"%d",age];  
          
        char *sex = (char *)sqlite3_column_text(stmt, 3);  
        NSString *sexString = [[NSString alloc] initWithUTF8String:sex];  
        self.sexTextField.text = sexString;  
        [sexString release];  
          
        int weight = sqlite3_column_int(stmt, 4);  
        self.weightTextField.text = [NSString stringWithFormat:@"%d",weight];  
          
          
        char *address = (char *)sqlite3_column_text(stmt, 5);  
        NSString *addressString = [[NSString alloc] initWithUTF8String:address];  
        self.addressTextField.text = addressString;  
        [addressString release];  
          
          
    }  
      
    sqlite3_finalize(stmt);  
}  
//用完了一定记得关闭,释放内存  
sqlite3_close(database);  

sqlite3_prepare_v2是执行查询的方法,当查询语句执行成功时,使用sqlite3_step当游标指向每一行SQLITE_ROW时,我们开始读取数据

sqlite_3_column_text可以读取字符串类型的数据,参数二为column号,sqlite_3column_int读取int类型数据,其它的就不举例了,大家可以尝试。

六、保存,插入数据

[cpp]
view plain
copy

char *update = "INSERT OR REPLACE INTO PERSIONINFO(NAME,AGE,SEX,WEIGHT,ADDRESS)""VALUES(?,?,?,?,?);";  
//上边的update也可以这样写:  
//NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES(?,?,?,?,?)",NAME,AGE,SEX,WEIGHT,ADDRESS];  
  
char *errorMsg = NULL;  
sqlite3_stmt *stmt;  
  
if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {  
      
    //【插入数据】在这里我们使用绑定数据的方法,参数一:sqlite3_stmt,参数二:插入列号,参数三:插入的数据,参数四:数据长度(-1代表全部),参数五:是否需要回调  
    sqlite3_bind_text(stmt, 1, [self.nameTextField.text UTF8String], -1, NULL);  
    sqlite3_bind_int(stmt, 2, [self.ageTextField.text intValue]);  
    sqlite3_bind_text(stmt, 3, [self.sexTextField.text UTF8String], -1, NULL);  
    sqlite3_bind_int(stmt, 4, [self.weightTextField.text integerValue]);  
    sqlite3_bind_text(stmt, 5, [self.addressTextField.text UTF8String], -1, NULL);  
}  
if (sqlite3_step(stmt) != SQLITE_DONE)  
NSLog(@"数据更新失败");  
NSAssert(0, @"error updating :%s",errorMsg);  
  
 sqlite3_finalize(stmt);  
  
sqlite3_close(database);  

当然,你也可以用大家熟知的,直接把数据写在要执行的sql语句后面,如下:

[cpp]
view plain
copy

NSString *insert = [NSString stringWithFormat:@"INSERT OR REPLACE INTO PERSIONINFO('%@','%@','%@','%@','%@')VALUES('%@','%d','%@','%d','%@')",NAME,AGE,SEX,WEIGHT,ADDRESS,@"小杨",23,@"man",65,@"中国北京,haidian,shangdi,xinxiRoad,100014"];  
  
//执行语句  
if (sqlite3_exec(database, [insert UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK) {  
    sqlite3_close(database);  
}  

这样看着是不是就轻松很多了呢?

七:运行效果:



demo中我在每回打开APP时,在viewdidload里,读取数据库,如果有数据,赋值到相应的属性,当用户按下home键后,及时保存当前数据。也就是说,模拟一个游戏,当我们来电话时或是按下home键做别的事情时,一定要为用户保存当前进度和数据,不然下次打开游戏,又归零了?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sqlite3