在ios移动开发中用到本地存储数据的地方很多,网上有很多第三方的封装关于sqlite3,用的比较多的是FMDB,但是在我做项目的时候,刚开始用FMDB,后来一些简单的存储我就直接使用了sqlite3存储数据到本地,
在项目中因为很多地方都要使用到所以我将方法写在一个单例里,在使用的时候只调用接口。
下面是具体的代码示例
//单例声明部分
//
// DataBaseHelp.h
// S-MixControl
//
// Created by chenq@kensence.com on 15/8/16.
// Copyright © 2016年 KaiXingChuangDa. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <sqlite3.h>
@interface DataBaseHelp : NSObject
@property (nonatomic ,strong)NSMutableArray *sqArray;
//创表
+(void)CreatTable;
//向表中插入数据
/*
*这里出入的元素根据你自己项目的实际需要可以随便的写入参数
*
*/
+(void)InsertIntoTemp:(int)temp Type:(int)type Key:(NSString *)key Values:(NSString *)values;
//查询数据
+(NSArray *)SelectTemp:(int)temp Type:(int)type;
//删除数据
+(void)DeleteWithTemp:(int)temp type:(int)type Key:(NSString *)key;
@end
//单例实现部分
//
// DataBaseHelp.m
// S-MixControl
//
// Created by chenq@kensence.com on 15/8/16.
// Copyright © 2016年 KaiXingChuangDa. All rights reserved.
//
#define FILE_NAME @"database.sqlite"
#import "DataBaseHelp.h"
#import "SignalValue.h"
@implementation DataBaseHelp
static sqlite3 *db;
+(void)CreatTable
{
//打开数据库
//取到沙盒
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
NSString *fileName = [doc stringByAppendingPathComponent:@"Name"];
const char *CfileName = fileName.UTF8String;
int result = sqlite3_open(CfileName, &db);
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功");
//创建表
const char *sql = "CREATE TABLE IF NOT EXISTS t_name (id integer PRIMARY KEY AUTOINCREMENT,stemp integer NOT NULL , type integer NOT NULL , key text NOT NULL , svalue text NOT NULL);";
char *erroMsg = NULL;
sqlite3_exec(db, sql, NULL, NULL, &erroMsg);
if (result == SQLITE_OK) {
NSLog(@"创表成功");
}else
{
NSLog(@"创建表失败");
}
}else
{
NSLog(@"打开数据库失败");
}
}
+(void)InsertIntoTemp:(int)temp Type:(int)type Key:(NSString *)key Values:(NSString *)values
{
NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_name (stemp,type,key,svalue) VALUES (%d,%d,'%@','%@');",temp,type,key,values];
char *erroMsg = NULL;
sqlite3_exec(db, sql.UTF8String, NULL, NULL, &erroMsg);
if (erroMsg) {
printf("插入失败%s",erroMsg);
}else
{
NSLog(@"插入成功");
}
}
+(NSArray *)SelectTemp:(int)temp Type:(int)type
{
NSMutableArray *mutArra = nil;
NSString *sql = [NSString stringWithFormat:@"SELECT stemp,type,key,svalue FROM t_name WHERE stemp = %d and type = %d;",temp,type];
//sqlite3_stmt 用来取数据
sqlite3_stmt *stmt = NULL;
if ( sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL) == SQLITE_OK) {
NSLog(@"查询语句没问题");
mutArra = [NSMutableArray array];
//每一次sqlite3_step函数,就会取出下一条数据
while(sqlite3_step(stmt) == SQLITE_ROW) {
sqlite3_column_int(stmt, 1);
int temp = sqlite3_column_int(stmt, 0);
int type = sqlite3_column_int(stmt, 1);
const unsigned char *key = sqlite3_column_text(stmt, 2);
const unsigned char *svalue = sqlite3_column_text(stmt, 3);
//这里应为在项目中使用NSUserDefaults的查询,不想在做修改就直接在查询时候将查询的结果给了NSUserDefaults,
NSString *string = [NSString stringWithUTF8String:(const char *)key];
NSString *obj = [NSString stringWithUTF8String:(const char *)svalue];
[[NSUserDefaults standardUserDefaults]removeObjectForKey:string];
[[NSUserDefaults standardUserDefaults]setObject:obj forKey:string];
printf("%d %d %s %s\n",temp,type,key,svalue);
}
}else
{
NSLog(@"查询有问题");
}
return mutArra;
}
//删除数据
+(void)DeleteWithTemp:(int)temp type:(int)type Key:(NSString *)key
{
//删除语句
NSString *sql = [NSString stringWithFormat:@"DELETE FROM t_name WHERE stemp = %d and type = %d and key = '%@'",temp,type,key];
sqlite3_stmt *stmt = NULL;
if (sqlite3_prepare_v2(db, sql.UTF8String, -1, &stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_ROW) {
if (sqlite3_step(stmt) == SQLITE_DONE) {
NSLog(@"删除成功");
}
NSLog(@"删除失败");
}
}
}
@end
以上就是封装的单例方法,在调用的时候很简单,
例如在调用添加数据的时候
//调用创建表格的方法,类似于打开数据库
[DataBaseHelp CreatTable];
//出入数据,这里根据数据类型传入相应的参数
[DataBaseHelp InsertIntoTemp:integer Type:tage Key:string Values:title];
很久以前的写的东西了,现在将东西写在博客上,有不懂和模糊的地方可以留言每天我都会在博客上写一篇东西,看到会回复的,希望对有帮助,