iOS study Day17-沙盒数据库(sqlite)的增删改查

程序启动时需要Delegate文件将文件从沙盒取出(如果不存在),并执行相关的操作

-(void)addEditableDatabaseIfNeed
{
    // 寻找 当前程序所在 沙盒下面的 Documents 文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 取数组里面的第一个路径值
    NSString *documentsPath = [paths objectAtIndex:0];
    // 附加数据库文件名称
    NSString *path = [documentsPath stringByAppendingPathComponent:SqliteName];
    
    // 使用文件管理器,来判断数据库文件是否存在
    NSFileManager *fm = [NSFileManager defaultManager];
    bool ifFind = [fm fileExistsAtPath:path];
    if(!ifFind)
    {
        NSLog(@"沙盒数据库文件不存在,需要复制!");
        
        // 把 包 里面的 数据库文件 复制到 沙盒的 Documents 文件夹
        NSString * srcPath = [[NSBundle mainBundle] pathForResource:@"0101.db" ofType:nil];
        
        // 复制操作
        [fm copyItemAtPath:srcPath toPath:path error:nil];
    }
}

添加 didFinishLaunchingWithOptions 代理模式 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [self addEditableDatabaseIfNeed];
    
    // 创建窗口
    self.window = [[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds] autorelease];
    
    // 创建第一个视图的 视图控制器
    self.viewController = [[[RootViewController alloc] initWithNibName:@"RootView" bundle:nil] autorelease];
    
    // 作为根视图控制器,并显示窗口
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    
    return YES;
}
第二步 Finder中新建实体文件夹Model and sqlite并拖入项目

#import <Foundation/Foundation.h>
#import "NewsInfoModel.h"

// 新闻信息的 本地数据库 操作
@interface NewsInfoSqlite : NSObject

// 新增新闻
+(BOOL)addItem:(NewsInfoModel *)item;

// 编辑新闻
+(BOOL)updateItem:(NewsInfoModel *)item;

// 删除操作
+(BOOL)deleteItem:(int)newsID;

// 取单条
+(NewsInfoModel *)getItem:(int)newsID;

// 取列表
+(NSMutableArray *)getList;

@end

#import "NewsInfoSqlite.h"
#import <sqlite3.h>

#define TableName @"NewsInfo"

@implementation NewsInfoSqlite

// 新增新闻
+(BOOL)addItem:(NewsInfoModel *)item
{
    if(item == nil)
        return false;
    
    BOOL result = false;
    
    // 寻找 当前程序所在 沙盒下面的 Documents 文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 取数组里面的第一个路径值
    NSString *documentsPath = [paths objectAtIndex:0];
    // 附加数据库文件名称
    NSString *path = [documentsPath stringByAppendingPathComponent:SqliteName];
    
    // 使用文件管理器,来判断数据库文件是否存在
    NSFileManager *fm = [NSFileManager defaultManager];
    bool ifFind = [fm fileExistsAtPath:path];
    if(ifFind)
    {
        // 定义数据库操作对象
        sqlite3 *database;
        
        // 打开数据库
        if(sqlite3_open([path UTF8String], &database) != SQLITE_OK)
        {
            sqlite3_close(database);
            NSLog(@"打开数据库文件失败!");
        }
        else
        {
            // nil 值 处理
            if(item.title == nil)
                item.title = @"";
            if(item.content == nil)
                item.content = @"";
            
            // 创建SQL语句
            NSMutableString *sql = [NSMutableString string];
            [sql appendFormat:@"insert into %@",TableName];
            [sql appendFormat:@" (title,content) values ('%@','%@')",item.title,item.content];
            
            // 执行sql语句
            char *errorMsg;
            if(sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK)
            {
                result = false;
                NSLog(@"error to exec %@",sql);
            }
            else
            {
                result = true;
            }
            
            // 关闭数据库
            sqlite3_close(database);
        }
    }
    
    return result;
}

// 编辑新闻
+(BOOL)updateItem:(NewsInfoModel *)item
{
    if(item == nil)
        return false;
    
    BOOL result = false;
    
    // 寻找 当前程序所在 沙盒下面的 Documents 文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 取数组里面的第一个路径值
    NSString *documentsPath = [paths objectAtIndex:0];
    // 附加数据库文件名称
    NSString *path = [documentsPath stringByAppendingPathComponent:SqliteName];
    
    // 使用文件管理器,来判断数据库文件是否存在
    NSFileManager *fm = [NSFileManager defaultManager];
    bool ifFind = [fm fileExistsAtPath:path];
    if(ifFind)
    {
        // 定义数据库操作对象
        sqlite3 *database;
        
        // 打开数据库
        if(sqlite3_open([path UTF8String], &database) != SQLITE_OK)
        {
            sqlite3_close(database);
            NSLog(@"打开数据库文件失败!");
        }
        else
        {
            // nil 值 处理
            if(item.title == nil)
                item.title = @"";
            if(item.content == nil)
                item.content = @"";
            
            // 创建SQL语句
            NSMutableString *sql = [NSMutableString string];
            [sql appendFormat:@"update %@ set ",TableName];
            [sql appendFormat:@" title = '%@',",item.title];
            [sql appendFormat:@" content = '%@'",item.content];
            [sql appendFormat:@" where NewsID = %i",item.newsID];
            
            // 执行sql语句
            char *errorMsg;
            if(sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK)
            {
                result = false;
                NSLog(@"error to exec %@",sql);
            }
            else
            {
                result = true;
            }
            
            // 关闭数据库
            sqlite3_close(database);
        }
    }
    
    return result;
}

// 删除操作
+(BOOL)deleteItem:(int)newsID
{
    BOOL result = false;
    
    // 寻找 当前程序所在 沙盒下面的 Documents 文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 取数组里面的第一个路径值
    NSString *documentsPath = [paths objectAtIndex:0];
    // 附加数据库文件名称
    NSString *path = [documentsPath stringByAppendingPathComponent:SqliteName];
    
    // 使用文件管理器,来判断数据库文件是否存在
    NSFileManager *fm = [NSFileManager defaultManager];
    bool ifFind = [fm fileExistsAtPath:path];
    if(ifFind)
    {
        // 定义数据库操作对象
        sqlite3 *database;
        
        // 打开数据库
        if(sqlite3_open([path UTF8String], &database) != SQLITE_OK)
        {
            sqlite3_close(database);
            NSLog(@"打开数据库文件失败!");
        }
        else
        {
            // 创建SQL语句
            NSMutableString *sql = [NSMutableString string];
            [sql appendFormat:@"delete from %@ ",TableName];
            [sql appendFormat:@" where NewsID = %i",newsID];
            
            // 执行sql语句
            char *errorMsg;
            if(sqlite3_exec(database, [sql UTF8String], NULL, NULL, &errorMsg) != SQLITE_OK)
            {
                result = false;
                NSLog(@"error to exec %@",sql);
            }
            else
            {
                result = true;
            }
            
            // 关闭数据库
            sqlite3_close(database);
        }
    }
    
    return result;
}

// 取单条
+(NewsInfoModel *)getItem:(int)newsID
{
    NewsInfoModel *item = nil;
    
    // 寻找 当前程序所在 沙盒下面的 Documents 文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 取数组里面的第一个路径值
    NSString *documentsPath = [paths objectAtIndex:0];
    // 附加数据库文件名称
    NSString *path = [documentsPath stringByAppendingPathComponent:SqliteName];
    
    // 使用文件管理器,来判断数据库文件是否存在
    NSFileManager *fm = [NSFileManager defaultManager];
    bool ifFind = [fm fileExistsAtPath:path];
    if(ifFind)
    {
        // 定义数据库操作对象
        sqlite3 *database;
        
        // 打开数据库
        if(sqlite3_open([path UTF8String], &database) != SQLITE_OK)
        {
            sqlite3_close(database);
            NSLog(@"打开数据库文件失败!");
        }
        else
        {
            // 创建SQL语句
            NSMutableString *sql = [NSMutableString string];
            [sql appendFormat:@"select newsid,title,content from %@ ",TableName];
            [sql appendFormat:@" where NewsID = %i",newsID];
            
            // 执行sql语句
            sqlite3_stmt *statement;
            if(sqlite3_prepare(database, [sql UTF8String], -1, &statement, nil) == SQLITE_OK)
            {
                while (sqlite3_step(statement) == SQLITE_ROW)
                {
                    item = [[[NewsInfoModel alloc] init] autorelease];
                    
                    item.newsID = (int)sqlite3_column_int(statement, 0);
                    
                    char *title = (char *)sqlite3_column_text(statement, 1);
                    if(title == NULL)
                        item.title = @"";
                    else
                        item.title = [NSString stringWithUTF8String:title];
                    
                    char *content = (char *)sqlite3_column_text(statement, 2);
                    if(content == NULL)
                        item.content = @"";
                    else
                        item.content = [NSString stringWithUTF8String:content];
                }
            }
            
            // 关闭数据库
            sqlite3_close(database);
        }
    }
    
    return item;
}

// 取列表
+(NSMutableArray *)getList
{
    NSMutableArray *list = [NSMutableArray array];
    
    // 寻找 当前程序所在 沙盒下面的 Documents 文件夹
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    // 取数组里面的第一个路径值
    NSString *documentsPath = [paths objectAtIndex:0];
    // 附加数据库文件名称
    NSString *path = [documentsPath stringByAppendingPathComponent:SqliteName];
    
    // 使用文件管理器,来判断数据库文件是否存在
    NSFileManager *fm = [NSFileManager defaultManager];
    bool ifFind = [fm fileExistsAtPath:path];
    if(ifFind)
    {
        // 定义数据库操作对象
        sqlite3 *database;
        
        // 打开数据库
        if(sqlite3_open([path UTF8String], &database) != SQLITE_OK)
        {
            sqlite3_close(database);
            NSLog(@"打开数据库文件失败!");
        }
        else
        {
            // 创建SQL语句
            NSMutableString *sql = [NSMutableString string];
            [sql appendFormat:@"select newsid,title,content from %@ ",TableName];
            
            // 执行sql语句
            sqlite3_stmt *statement;
            if(sqlite3_prepare(database, [sql UTF8String], -1, &statement, nil) == SQLITE_OK)
            {
                while (sqlite3_step(statement) == SQLITE_ROW)
                {
                    NewsInfoModel *item = [[NewsInfoModel alloc] init];
                    
                    item.newsID = (int)sqlite3_column_int(statement, 0);
                    
                    char *title = (char *)sqlite3_column_text(statement, 1);
                    if(title == NULL)
                        item.title = @"";
                    else
                        item.title = [NSString stringWithUTF8String:title];
                    
                    char *content = (char *)sqlite3_column_text(statement, 2);
                    if(content == NULL)
                        item.content = @"";
                    else
                        item.content = [NSString stringWithUTF8String:content];
                    
                    [list addObject:item];
                    [item release],item = nil;
                }
            }
            // 关闭数据库
            sqlite3_close(database);
        }
    }
    return list;
}

@end

最后在ViewControler中写入相关业务逻辑方法,我引用其他项目的一个类,此时我只写了新增,其他方法类推。

- (IBAction)btnsubmit:(id)sender {
    if (_cname.text.length <= 0) {
        [self msg:@"用户名必须录入"];
    }else{
        Company *company = [[Company alloc] init];
        company.cname = _cname.text;
        company.cGuoshui = _cguoshui.text;
        company.cDishui = _cdishui.text;
        company.isXiao = _isxiaoguimo.on;
        company.isGongye = _isgongye.on;
        company.cPerson = _cperson.text;
        company.cPhone = _cphone.text;
        company.cAddress = _caddress.text;
        company.beizhu = _beizhu.text;
        if ([CompanySqlite addCompany:company]) {
            [self msg:@"添加成功!"];
        } else {
            [self msg:@"addCompany添加失败!"];
        }
        [company release];
    }
}

此时我引用的MSG方法为自定义,屏幕显示1秒

// 显示屏幕事件
-(IBAction)msg:(NSString*) mesg
{
    alert = [[UIAlertView alloc] initWithTitle:mesg message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:nil, nil];
    [alert setBackgroundColor:[UIColor blueColor]];
    [alert setContentMode:UIViewContentModeScaleAspectFit];
    [alert show];
    UIActivityIndicatorView *active = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite] autorelease];
    active.center = CGPointMake(alert.bounds.size.width/2, alert.bounds.size.height-40);
    [alert addSubview:active];
    [active startAnimating];
    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(c) userInfo:nil repeats:NO];
}
-(void)c
{
    [alert dismissWithClickedButtonIndex:0 animated:YES];
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值