iOS数据库的使用

      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

    原文作者:flybear_Li
    原文地址: https://www.jianshu.com/p/27bfcb85044a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞