IOS开发数据库sqlite

来源:互联网 发布:淘宝取消绑定银行卡 编辑:程序博客网 时间:2024/06/10 04:09

http://blog.sina.com.cn/s/blog_68661bd801019uzd.html

1.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);

sqlite3_stmt     用于保存编译好的SQL语句
sqlite3_open(),   打开数据库,没有数据库时创建。
sqlite3_exec(),   执行非查询的sql语句
Sqlite3_step(), 在调用sqlite3_prepare后,使用这个函数在记录集中移动。
sqlite3_finalize //删除一条已备语句
Sqlite3_close(), 关闭数据库文件还有一系列的函数,用于从记录集字段中获取数据,如
sqlite3_column_text(), 取text类型的数据。
sqlite3_column_blob(),取blob类型的数据
sqlite3_column_int(), 取int类型的数据

sqlite3_column_string //返回某一行的字符串


一、使用方法

 

  sqliteHelper*sh=[[sqliteHelperalloc]init];

   sh.databasePath=path;

    if ([sh open]) {

        

        NSMutableArray *arr=[sh excelSql:query andParamCount:7];

        [shclose];

    }


一,源文件


//

//  sqliteHelper.h

//  TestSqlite

//

//  Created by ch_soft on 12-1-13.

//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.

//


#import<UIKit/UIKit.h>

#import"sqlite3.h"

@interface sqliteHelper :NSObject 

{    

        

@property (strong,nonatomic)NSString *databaseName;

@property (strong,nonatomic)NSString *databasePath;

@property (nonatomic)sqlite3_stmt *statement;

-(BOOL)open;

-(void)close;


//query:是查新的SQl

//cout:是参数个数

// 如:query 为 select a,b,c from db;参数个是为3个(a,b,c)

-(NSMutableArray *) excelSql:(NSString *) query andParamCount:(NSInteger) cout;

@end




 

//

//  sqliteHelper.m

//  TestSqlite

//

//  Created by ch_soft on 12-1-13.

//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.

//


#import "sqliteHelper.h"

#import "sqlite3.h"

@implementation sqliteHelper


@synthesize databaseName;

@synthesize databasePath;

@synthesize statement;

static sqlite3 *database_ =nil;//定义个全局的变量

-(BOOL)open

{

    NSFileManager *fileManager = [NSFileManagerdefaultManager];

    BOOL find = [fileManager fileExistsAtPath:databasePath];//首先判断sqlite数据库文件是否存在

    if (find) {

        if (sqlite3_open([databasePathUTF8String], &database_) !=SQLITE_OK) {//如何打开数据库失败

            sqlite3_close(database_);

            NSLog(@"Error: open database error.");

            return NO;

        }

        return YES;

    }else

    {

        sqlite3_close(database_);

        NSLog(@"Error: open file error.");

        return NO;

    }

    return NO;

}

-(void)close

{

     sqlite3_finalize(statement);

     sqlite3_close(database_);

}


-(NSString*)getColumn:(NSInteger) index

{

    char *temp =(char*)sqlite3_column_text(statement, index);

    NSString * retValue=[NSStringstringWithUTF8String:temp];

    return retValue;

}


-(NSMutableArray *) excelSql:(NSString *) query andParamCount:(NSInteger) cout

{

    NSMutableArray * retArr=[NSMutableArrayarray];

    if(sqlite3_prepare_v2(database_, [queryUTF8String], -1, &statement,nil) == SQLITE_OK)

{

while(sqlite3_step(statement) == SQLITE_ROW)

{

 

            NSMutableArray * ary=[NSMutableArrayarray];

            for (int i=1; i<=cout; i++) {

                NSString * oneValue=[selfgetColumn:i];

                NSLog(@"one value is %@",oneValue);

                [ary addObject:oneValue];

            }

[retArr addObject:ary];

}

}

    return retArr;

}


@end


0 0
原创粉丝点击