iOS数据库的使用

作者: flybear_Li | 来源:发表于2016-11-09 16:23 被阅读0次

          iOS常用的数据存取方式。1.存文件。2.存NSUserDefault,这种方式是以plist文件存储的,也是持久化的一种。3.数据库。苹果自带的框架是coreData,可以导入sqlite3使用sqlite数据库。还可以使用FMDB,它是对sqlite数据库的封装,开发者不用面对c语言的sqlite开发,使用更加简单.

          sqlite数据库的特点;1.是基于c语言开发的数据库,2.用c语言对数据库执行操作,访问。3.sqlite是动态的数据库类型,即存储的时候是一种类型,使用的时候可以存储为其他类型。4.建立连接之后可以不关闭连接。

         iOS操作sqlite数据库分为以下几步:

    1.打开数据库sqlite_open()。如果数据库已经创建,则直接打开,否则创建再打开。打开之后会得到一个sqlite对象,接下来的数据库操作均要对此对象进行操作。

    -(void)openDb:(NSString*)daname{

    //先取得数据库的路径

    NSString*path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];

    NSString*databasePath = [path stringByAppendingString:daname];

    self.database = [FMDatabase databaseWithPath:databasePath];

    //再打开或者创建打开数据库

    if(SQLITE_OK!=

    sqlite3_open([databasePath UTF8String], &self.database)) {

    NSLog(@"数据库打开失败");

    }

    else{

    NSLog(@"数据库打开成功");

    }

    }

    在open之前,定义一个单例staticSqliteManager*shareManager;

    +(instancetype)shareManager{

    if(shareManager==nil) {

    shareManager=[[SqliteManageralloc]init];

    [shareManageropenDb:kDatabaseName];

    }

    returnshareManager;

    }

    2.执行SQL语句,又分为有返回值的语句和无返回值的语句:(1)无返回值的语句:sqlite_exec()直接执行增insert,删remove,改,update操作。

    -(void)excuteNonQuery:(NSString*)sql{

    char*error;

    if(SQLITE_OK!=

    sqlite3_exec(_datebase, sql.UTF8String,NULL,NULL, &error)) {

    NSLog(@"执行sql语句过程发生错误,错误信息:%s",error);

    }

    }

    (2)有返回值的语句:查enquiry操作。首先通过sqlite_prepare_v2()进行sql语句语法检测,然后通过sqlite_step依次查询每一行的内容,对于每一行的数据可以通过sqlite_column_(列类型)获得对应列的数据,如此反复遍历直至完成。最后,执行释放句柄操作。在ios中对数据的读取每次只能够获取到一行的数据,因此封装这些操作更为方便使用。

    -(NSArray*)excuteQuery:(NSString*)sql {

    NSMutableArray*array =

    [NSMutableArrayarray];

    //先检查语法正确性

    sqlite3_stmt*stmt;

    if(SQLITE_OK==sqlite3_prepare_v2(_datebase, sql.UTF8String, -1, &stmt,NULL)) {

    //再单步执行sql语句

    while(SQLITE_ROW==sqlite3_step(stmt)) {

    intcolumnCount =sqlite3_column_count(stmt);

    NSMutableDictionary*dic = [NSMutableDictionarydictionary];

    for (int i=0; i<columnCount;i++){

    constchar*name =sqlite3_column_name(stmt, i);

    const unsignedchar*value =sqlite3_column_text(stmt, i);

    dic[[NSString stringWithUTF8String:name]] = [NSString stringWithUTF8String:(constchar*)value];

    }

    [rows addObject:dic];

    }

    }

    sqlite3_finalize(stmt);

    returnrows;

    }

    FMDB是对sqlite的封装,同时相比简单的封装,考虑到了更多的细节,例如并发安全性处理,如何更好地处理事务等,是企业开发的首选。FMDB的基本使用步骤跟sqlite类似,首先打开数据库,如果数据库不存在,则先创建再打开。数据库已经封装好了类似demo中sqliteManager的两个方法excuteUpdate和excuteQuery,分别用于执行无返回值的更新和有返回值的查询。需要注意的是,如果要调用有格式化的sql语句,用?而不用%@。

    如果直接使用FMDB或者直接使用sqlite对数据库进行操作,是线程不安全的。要线程安全可以使用FMDB的FMDB DataQueue线程队列操作数据库。使用databaseQueue不需要打开操作。

    Github地址:https://github.com/ccgus/fmdb

    考虑到一般使用场景经常涉及到多线程的应用,databaseQueue是更好的选择。

    @property(nonatomic)FMDatabaseQueue*databaseQueue;

    -(void)openDb:(NSString*)daname{

    //先取得数据库的路径

    NSString*path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)firstObject];

    NSString*databasePath = [pathstringByAppendingString:daname];

    self.databaseQueue= [FMDatabaseQueuedatabaseQueueWithPath:databasePath];

    }

    -(void)excuteNonQuery:(NSString*)sql{

    [self.databaseQueueinDatabase:^(FMDatabase*db) {

    [dbexecuteUpdate:sql];

    }];

    }

    -(NSArray*)excuteQuery:(NSString*)sql {

    NSMutableArray*array =

    [NSMutableArrayarray];

    [self.databaseQueueinDatabase:^(FMDatabase*db) {

    FMResultSet*result = [dbexecuteQuery:sql];

    while(result.next) {

    NSMutableDictionary*dic = [NSMutableDictionarydictionary];

    for(inti=0; i

    dic[[resultcolumnNameForIndex:i]]= [resultstringForColumnIndex:i];

    }

    [arrayaddObject:dic];

    }

    }];

    returnarray;

    }

    在使用FMDB的同时,还需要掌握一定的常用SQL语句。

    常用的SQL语句不外乎围绕增删改查对数据库进行操作。

    Sql语言对大小写不敏感。WHERE关键字等效于where

    以下是SQL语句常见的基本用法。

    SQL select语法:

    1.SELECT列名称FROM表名称;SELECT*FROM表名称;

    2.在表中,可能会包含重复值,如果仅仅需要列出不同的值用如下方式:SELECT DISTINCT列名称FROM表名称

    3.INSERT语句用于向表格中插入新的行。INSERT

    INTO表名称VALUES(值1,值2,…)

    我们也可以指定插入数据的列的值:INSERT INTO table_name(列1,列2,…)VALUES (值1,值2,…)

    4.UPDATE用于修改或者是更新表格中的数据。UPDATE表名称SET列名称=新值WHERE列名称=某值

    5.DELETE用于删除表中的行

    DELETE FROM表名称WHERE列名称=值

    6.WHERE子句如果需要有条件地操作表格中的数据,可以将WHERE子句添加到SELECT语句,DELETE语句等。

    例如:SELECT列名称FROM表名称WHERE列运算符值

    7.AND和OR运算符:AND和OR可以将WHERE语句中的两个或者多个条件结合起来。

    例如:SELECT*FROM persons WHERE FirstName=’Tomas’ AND LastName = ‘Carter’

    8.ORDER BY语句:用于根据指定的列对结果集进行排序。DESC关键字是指降序排列

    SELECT Company,OrderNumber FROM OrdersORDER BY Company [DESC]

    CREATETABLE IF NOT EXISTS user (id integer PRIMARY KEY AUTOINCREMENT, name text NOT NULL, age integer NOT NULL)

    [self.dbexecuteUpdate:@"INSERT INTO user (name, age) VALUES (?, ?);", name,@(arc4random_uniform(40))];

    [self.dbexecuteUpdate:@"DROP TABLE IF EXISTS user;"];

    1- (void)query

    2{

    3// 1.执行查询语句

    4FMResultSet*resultSet = [self.dbexecuteQuery:@"SELECT * FROM user"];

    5

    6// 2.遍历结果

    7while([resultSetnext]) {

    8intID = [resultSetintForColumn:@"id"];

    9NSString*name = [resultSetstringForColumn:@"name"];

    10intage = [resultSetintForColumn:@"age"];

    11NSLog(@"%d %@ %d", ID, name, age);

    12}

    }最后,附上可以进行增删改查简单功能的数据库Demo,下载地址:github.com/flybear123/FMDBDemo.git

    相关文章

      网友评论

        本文标题:iOS数据库的使用

        本文链接:https://www.haomeiwen.com/subject/xxttpttx.html