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