Xcode4.3 添加libsqlite3.0.dylib
点击工程名:在右侧选择TARGETS下Build Phases
然后选择Link Binary With Libraries 点击下面的“+”号添加
输入框写入sqllite
选择libsqlite3.0.dylib,点击Add,添加成功。
.iphone中的数据一般指sqlite,而如果连接服务器,那就另说,那就不是iphone直接操作其它数据库,譬如SqlSever,Mysql,Orical。要使用数据库sqlite,首先将libsqlite3.0.dylib加到项目中。5.0之后的版本导入数据库头文件变成了#import "sqlite3.h",之前还有指定路径user。这也说明苹果不断改进着
2.iphone中有个沙箱的概念,什么是沙箱,简单的理解就是指在iphone中程序能操作的位置只能在指定目录,意思就是只能在沙箱中进行操作。譬如文件的写入写出,要传输的图片,都只能放在那个目录,当然你也可以在其中建立子目录。数据库的本质其实也是一个文件。所以也只能在目录中进行。那么数据库建立的路径也只能在这个目录下。
3.首先是数据库要保存的路径
NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPaths=[array objectAtIndex:0];
NSString *databasePaths=[documentsPaths stringByAppendingPathComponent:@"test_DB"];
4.然后建立数据库,新建数据库这个苹果做的非常好,非常方便
sqlite3 *database;
//新建数据库,存在则打开,不存在则创建
if (sqlite3_open([databasePaths UTF8String], &database)==SQLITE_OK)
{
NSLog(@"open success");
else {
NSLog(@"open failed");
}
}
5.对数据库建表操作:如果在些程序的过程中,发现表的字段要更改,一定要删除之前的表,如何做,就是删除程序或者换个表名,主键是自增的
char *errorMsg;
NSString *sql=@"create table if not exists users(User_id integer primary key,Password text)";
//创建表
if (sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errorMsg)==SQLITE_OK )
{
NSLog(@"create success");
}else{
NSLog(@"create error:%s",errorMsg);
sqlite3_free(errorMsg);
}
6.插入数据
NSString *insertSQLStr = [NSString stringWithFormat:@"insert into users(Password)values ("%@")",str1];
const char *insertSQL=[insertSQLStr UTF8String];
//插入数据
if (sqlite3_exec(database, insertSQL, NULL, NULL, &errorMsg)==SQLITE_OK)
{
NSLog(@"insert ok");
}else{
NSLog(@"insert error:%s",errorMsg);
sqlite3_free(errorMsg);
}
7.查找数据
sql = @"select * from users";
sqlite3_stmt *stmt;
//查找数据
if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &stmt, nil)==SQLITE_OK)
{
while (sqlite3_step(stmt)==SQLITE_ROW) {
int userId=sqlite3_column_int(stmt, 0);
const unsigned char *password= sqlite3_column_text(stmt, 1);
NSLog(@"UserId:%i,password:%s",userId,password);
}
}
8.更新数据
const char *sqlUpdate="update users set Password=?where User_id=?";
if (sqlite3_prepare_v2(database, sqlUpdate, -1, &stmt, NULL)!=SQLITE_OK) {
NSLog(@"Error:%s",sqlite3_errmsg(database));
}
const char* newPass="6666";
sqlite3_bind_text(stmt, 1, newPass, -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, 1);
sqlite3_step(stmt);
sqlite3_reset(stmt);
9.我在弄的时候碰到了一个问题:就是连续多次更新sqlite数据时发现只能执行一条,最后发现错误在于没有使用sqlite3_finalize(stmt);例子如下:
sqlite3_stmt *stmt;
//如果已经存在并且已登陆,则修改状态值
const char *Update="update TABLE1 set status=0 where status=1";
if (sqlite3_prepare_v2(dataBase, Update, -1, &stmt, NULL)!=SQLITE_OK) {
NSLog(@"Error:%s",sqlite3_errmsg(dataBase));
}
sqlite3_step(stmt);
sqlite3_finalize(stmt);
const char *sqlUpdate="update TABLE1 set status=?where accountname=?";
if (sqlite3_prepare_v2(dataBase, sqlUpdate, -1, &stmt, NULL)!=SQLITE_OK) {
NSLog(@"Error:%s",sqlite3_errmsg(dataBase));
}
NSLog(@"csc:%@",username);
sqlite3_bind_int(stmt, 1, 1);
sqlite3_bind_text(stmt, 2,[username UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_step(stmt);