众所周知,sqlite3是ios数据存储其一,具体优势和缺点,我就再也不赘述,请你们搜索之。java
1、必备条件ios
在ios项目中使用sqlite须要添加 libsqlite3.dylib 库sql

2、简单介绍经常使用方法数据库
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类型的数据
app
3、建立(或打开)数据库ide
3-1首先自定义一个方法,返回咱们当前应用程序沙盒目录(也就是说但愿数据库保存在哪里)函数
- -(NSString *) dataFilePath{
-
- NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-
- NSString *document = [path objectAtIndex:0];
-
- return [document stringByAppendingPathComponent:TABLENAME];
-
- }
3-2 在指定位置 建立或打开一个数据库
SQLITE_OK是sqlite3的一个常量,表明操做执行成功spa
-
-
- 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中的指定位置。.net
4、建立一张表orm
- 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五个属性。
5、查询表数据
- NSString *quary = @"SELECT * FROM PERSIONINFO";
- 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类型数据,其它的就不举例了,你们能够尝试。
6、保存,插入数据
- char *update = "INSERT OR REPLACE INTO PERSIONINFO(NAME,AGE,SEX,WEIGHT,ADDRESS)""VALUES(?,?,?,?,?);";
-
-
-
- char *errorMsg = NULL;
- sqlite3_stmt *stmt;
-
- if (sqlite3_prepare_v2(database, update, -1, &stmt, nil) == SQLITE_OK) {
-
-
- 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语句后面,以下:
- 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键作别的事情时,必定要为用户保存当前进度和数据,否则下次打开游戏,又归零了?
demo地址:
http://download.csdn.net/detail/mad1989/5752207