- 浏览: 582084 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
JYY282:
[i][/i]
Ecshop与Shopex的比较 -
qq247890212:
我也遇见这问题了,真诡异。重新下载个猫换了就好了。 太浪费时间 ...
诡异:ClassNotFoundException: org.springframework.web.filter.CharacterEncoding
From:http://www.2cto.com/kf/201110/108296.html
今天我们来看看iPhone 中数据库的使用方法。iPhone 中使用名为SQLite 的数据库管理系统。它是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
其使用步骤大致分为以下几步:
创建DB文件和表格
添加必须的库文件(FMDB for iPhone, libsqlite3.0.dylib)
通过FMDB 的方法使用SQLite
创建DB文件和表格
$ sqlite3 sample.db
sqlite> CREATE TABLE TEST(
...> id INTEGER PRIMARY KEY,
...> name VARCHAR(255)
...> );
简单地使用上面的语句生成数据库文件后,用一个图形化SQLite管理工具,比如Lita 来管理还是很方便的。
然后将文件(sample.db)添加到工程中。
添加必须的库文件(FMDB for iPhone, libsqlite3.0.dylib)
首先添加Apple 提供的sqlite 操作用程序库ibsqlite3.0.dylib 到工程中。
位置如下
/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${VER}.sdk/usr/lib/libsqlite3.0.dylib
这样一来就可以访问数据库了,但是为了更加方便的操作数据库,这里使用FMDB for iPhone。
svn co http://flycode.googlecode.com/svn/trunk/fmdb fmdb
如上下载该库,并将以下文件添加到工程文件中:
FMDatabase.h
FMDatabase.m
FMDatabaseAdditions.h
FMDatabaseAdditions.m
FMResultSet.h
FMResultSet.m
通过FMDB 的方法使用SQLite
使用SQL 操作数据库的代码在程序库的fmdb.m 文件中大部分都列出了、只是连接数据库文件的时候需要注意 — 执行的时候,参照的数据库路径位于Document 目录下,之前把刚才的sample.db 文件拷贝过去就好了。
位置如下
/Users/xxxx/Library/Application Support/iPhone Simulator/User/Applications/xxxx/Documents/sample.db
以下为链接数据库时的代码:
BOOL success;
NSError *error;
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sample.db"];
success = [fm fileExistsAtPath:writableDBPath];
if(!success){
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sample.db"];
success = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!success){
NSLog([error localizedDescription]);
}
}
// 连接DB
FMDatabase* db = [FMDatabase databaseWithPath:writableDBPath];
if ([db open]) {
[db setShouldCacheStatements:YES];
// INSERT
[db beginTransaction];
int i = 0;
while (i++ < 20) {
[db executeUpdate:@"INSERT INTO TEST (name) values (?)" , [NSString stringWithFormat:@"number %d", i]];
if ([db hadError]) {
NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
}
}
[db commit];
// SELECT
FMResultSet *rs = [db executeQuery:@"SELECT * FROM TEST"];
while ([rs next]) {
NSLog(@"%d %@", [rs intForColumn:@"id"], [rs stringForColumn:@"name"]);
}
[rs close];
[db close];
}else{
NSLog(@"Could not open db.");
}
接下来再看看用DAO 的形式来访问数据库的使用方法,代码整体构造如下。
首先创建如下格式的数据库文件:
$ sqlite3 sample.db
sqlite> CREATE TABLE TbNote(
...> id INTEGER PRIMARY KEY,
...> title VARCHAR(255),
...> body VARCHAR(255)
...> );
创建DTO(Data Transfer Object)
//TbNote.h
#import <Foundation/Foundation.h>
@interface TbNote : NSObject {
int index;
NSString *title;
NSString *body;
}
@property (nonatomic, retain) NSString *title;
@property (nonatomic, retain) NSString *body;
- (id)initWithIndex:(int)newIndex Title:(NSString *)newTitle Body:(NSString *)newBody;
- (int)getIndex;
@end
//TbNote.m
#import "TbNote.h"
@implementation TbNote
@synthesize title, body;
- (id)initWithIndex:(int)newIndex Title:(NSString *)newTitle Body:(NSString *)newBody{
if(self = [super init]){
index = newIndex;
self.title = newTitle;
self.body = newBody;
}
return self;
}
- (int)getIndex{
return index;
}
- (void)dealloc {
[title release];
[body release];
[super dealloc];
}
@end
创建DAO(Data Access Objects)
这里将FMDB 的函数调用封装为DAO 的方式。
//BaseDao.h
#import <Foundation/Foundation.h>
@class FMDatabase;
@interface BaseDao : NSObject {
FMDatabase *db;
}
@property (nonatomic, retain) FMDatabase *db;
-(NSString *)setTable:(NSString *)sql;
@end
//BaseDao.m
#import "SqlSampleAppDelegate.h"
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"
#import "BaseDao.h"
@implementation BaseDao
@synthesize db;
- (id)init{
if(self = [super init]){
// 由AppDelegate 取得打开的数据库
SqlSampleAppDelegate *appDelegate = (SqlSampleAppDelegate *)[[UIApplication sharedApplication] delegate];
db = [[appDelegate db] retain];
}
return self;
}
// 子类中实现
-(NSString *)setTable:(NSString *)sql{
return NULL;
}
- (void)dealloc {
[db release];
[super dealloc];
}
@end
下面是访问TbNote 表格的类。
//TbNoteDao.h
#import <Foundation/Foundation.h>
#import "BaseDao.h"
@interface TbNoteDao : BaseDao {
}
-(NSMutableArray *)select;
-(void)insertWithTitle:(NSString *)title Body:(NSString *)body;
-(BOOL)updateAt:(int)index Title:(NSString *)title Body:(NSString *)body;
-(BOOL)deleteAt:(int)index;
@end
//TbNoteDao.m
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"
#import "TbNoteDao.h"
#import "TbNote.h"
@implementation TbNoteDao
-(NSString *)setTable:(NSString *)sql{
return [NSString stringWithFormat:sql, @"TbNote"];
}
// SELECT
-(NSMutableArray *)select{
NSMutableArray *result = [[[NSMutableArray alloc] initWithCapacity:0] autorelease];
FMResultSet *rs = [db executeQuery:[self setTable:@"SELECT * FROM %@"]];
while ([rs next]) {
TbNote *tr = [[TbNote alloc]
initWithIndex:[rs intForColumn:@"id"]
Title:[rs stringForColumn:@"title"]
Body:[rs stringForColumn:@"body"]
];
[result addObject:tr];
[tr release];
}
[rs close];
return result;
}
// INSERT
-(void)insertWithTitle:(NSString *)title Body:(NSString *)body{
[db executeUpdate:[self setTable:@"INSERT INTO %@ (title, body) VALUES (?,?)"], title, body];
if ([db hadError]) {
NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
}
}
// UPDATE
-(BOOL)updateAt:(int)index Title:(NSString *)title Body:(NSString *)body{
BOOL success = YES;
[db executeUpdate:[self setTable:@"UPDATE %@ SET title=?, body=? WHERE id=?"], title, body, [NSNumber numberWithInt:index]];
if ([db hadError]) {
NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
success = NO;
}
return success;
}
// DELETE
- (BOOL)deleteAt:(int)index{
BOOL success = YES;
[db executeUpdate:[self setTable:@"DELETE FROM %@ WHERE id = ?"], [NSNumber numberWithInt:index]];
if ([db hadError]) {
NSLog(@"Err %d: %@", [db lastErrorCode], [db lastErrorMessage]);
success = NO;
}
return success;
}
- (void)dealloc {
[super dealloc];
}
@end
为了确认程序正确,我们添加一个UITableView。使用initWithNibName 测试DAO。
//NoteController.h
#import <UIKit/UIKit.h>
@class TbNoteDao;
@interface NoteController : UIViewController <UITableViewDataSource, UITableViewDelegate>{
UITableView *myTableView;
TbNoteDao *tbNoteDao;
NSMutableArray *record;
}
@property (nonatomic, retain) UITableView *myTableView;
@property (nonatomic, retain) TbNoteDao *tbNoteDao;
@property (nonatomic, retain) NSMutableArray *record;
@end
//NoteController.m
#import "NoteController.h"
#import "TbNoteDao.h"
#import "TbNote.h"
@implementation NoteController
@synthesize myTableView, tbNoteDao, record;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
tbNoteDao = [[TbNoteDao alloc] init];
[tbNoteDao insertWithTitle:@"TEST TITLE" Body:@"TEST BODY"];
// [tbNoteDao updateAt:1 Title:@"UPDATE TEST" Body:@"UPDATE BODY"];
// [tbNoteDao deleteAt:1];
record = [[tbNoteDao select] retain];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
myTableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
myTableView.delegate = self;
myTableView.dataSource = self;
self.view = myTableView;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [record count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}
TbNote *tr = (TbNote *)[record objectAtIndex:indexPath.row];
cell.text = [NSString stringWithFormat:@"%i %@", [tr getIndex], tr.title];
return cell;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)dealloc {
[super dealloc];
}
@end
最后我们开看看连接DB,和添加ViewController 的处理。这一同样不使用Interface Builder。
//SqlSampleAppDelegate.h
#import <UIKit/UIKit.h>
@class FMDatabase;
@interface SqlSampleAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
FMDatabase *db;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) FMDatabase *db;
- (BOOL)initDatabase;
- (void)closeDatabase;
@end
//SqlSampleAppDelegate.m
#import "SqlSampleAppDelegate.h"
#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"
#import "NoteController.h"
@implementation SqlSampleAppDelegate
@synthesize window;
@synthesize db;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
if (![self initDatabase]){
NSLog(@"Failed to init Database.");
}
NoteController *ctrl = [[NoteController alloc] initWithNibName:nil bundle:nil];
[window addSubview:ctrl.view];
[window makeKeyAndVisible];
}
- (BOOL)initDatabase{
BOOL success;
NSError *error;
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"sample.db"];
success = [fm fileExistsAtPath:writableDBPath];
if(!success){
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"sample.db"];
success = [fm copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];
if(!success){
NSLog([error localizedDescription]);
}
success = NO;
}
if(success){
db = [[FMDatabase databaseWithPath:writableDBPath] retain];
if ([db open]) {
[db setShouldCacheStatements:YES];
}else{
NSLog(@"Failed to open database.");
success = NO;
}
}
return success;
}
- (void) closeDatabase{
[db close];
}
- (void)dealloc {
[db release];
[window release];
[super dealloc];
}
@end
发表评论
-
Phone应用开发之十二:使用ShareKit一键分享到Facebook,Twitter等平台
2012-02-12 18:27 0ShareKit是iPhone开发的第三方接口,允许你一 ... -
iPhone应用开发之十一:常用的三种动画表现效果
2012-02-12 18:24 0From:http://www.2cto.com/kf/201 ... -
iphone应用开发之十:发送短信/邮件/打电话
2012-02-20 22:00 948From:http://www.2cto.com/kf/201 ... -
iPhone应用开发之六:UITableView的详细讲解(一)
2012-02-12 18:02 0From:http://www.2cto.com/kf/201 ... -
iPhone应用开发之五: UIScrollView的详细讲解
2012-02-26 17:45 1012From:http://www.2cto.com/kf/201 ... -
iPhone应用开发之四:UIImageView和UIWebView的详细讲解
2012-02-27 09:14 1334From: http://www.2cto.com/kf/20 ... -
iPhone应用开发之三:UILable和UITextField的详细讲解
2012-02-25 17:41 1141From:http://www.2cto.com/kf/201 ... -
iPhone 应用开发之二:UITextView控件的详细讲解
2012-02-26 17:45 1120From:http://www.2cto.com/kf/201 ... -
iPhone应用开发之一:窗口,视图,视图控制器和UIKit基础
2012-02-29 09:12 1029From:http://www.2cto.com/kf/201 ... -
iPhone操作队列 VS Java线程池
2012-02-24 20:14 731From:http://www.2cto.com/kf ... -
iPhone开发的门槛和成本及线路图
2012-02-12 15:42 0From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(11)--- 多线程的使用与注意事项
2012-02-25 17:40 1020From:http://www.2cto.com/kf/ ... -
iPhone开发进阶(10)--- 在程序中使用GPS
2012-02-25 17:41 910From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(8)--- 检测屏幕触摸事件
2012-02-25 17:39 939From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(7)--- 利用ModalViewController切换View
2012-02-27 09:09 1032From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(6)--- 编程定制UIButton
2012-02-12 15:29 0From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(5) --- 编程定制UIViewController
2012-02-12 15:26 0From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(4) --- 使用Makefile自动编译iPhone程序
2012-02-12 15:25 0From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(3) --- iPhone应用程序的启动过程
2012-02-12 15:15 0From:http://www.2cto.com/kf/201 ... -
iPhone开发进阶(2) --- iPhone应用程序/项目的构成
2012-02-26 17:43 997开发iPhone程序,首先接触到的不是源代码,而是项目工 ...
相关推荐
iPhone开发进阶内容包含了多个关键知识点和技巧,主要涉及Objective-C编程、iOS开发框架和工具,以及iOS应用的高级功能实现。 首先,文档提到了Objective-C 2.0,这是iPhone应用程序开发的基础语言之一。Objective-...
总的来说,iPhone开发进阶涉及到的不仅是编程语言本身,还包括操作系统层面的理解和使用SDK中的各种工具,以及有效地管理内存和数据结构。通过这些基础知识的学习和实践,开发者能够更深入地理解和构建高质量的...
iPhone OS iPhone OS 由4个主要部分组成。下面简单地罗列一下它们的功能。...• SQLite(SQL数据库) • XML Core OS • 多线程 • 网络应用(BSD套接字) • 文件系统 • Bonjour(利用无线网络连接其他机器)
### iPhone开发进阶知识点概述 #### 一、iPhone OS架构详解 **1.1 Cocoa Touch** Cocoa Touch层是iOS应用程序开发的核心,它提供了一系列框架,帮助开发者构建用户界面和处理用户交互。主要包括以下几个方面: - *...
在掌握基本概念后,你将学习到如何处理数据存储,包括使用Core Data框架进行结构化数据管理,以及SQLite数据库的应用。此外,网络编程也是iOS开发中不可或缺的部分,如利用URLSession进行HTTP请求,获取远程API数据...
《iPhone开发秘籍第二版》是一本针对iOS应用开发者的权威指南,涵盖了从基础到进阶的诸多关键知识点。此资源包含2至12章的源代码,为开发者提供了实战练习和深入理解iOS编程的宝贵材料。以下是这些章节中涉及的主要...
《Iphone开发基础教程》第十一章深入探讨了如何在iPhone应用程序中实现基本的数据持久性,主要关注SQLite数据库的使用。SQLite是一种轻量级的关系型数据库,适用于移动设备,因为它占用资源少且易于管理。 首先,...
- **SQLite数据库应用**:教授如何在iPhone应用中集成SQLite数据库,实现高效的数据检索和管理。 #### 网络通信 - **网络编程基础**:涵盖HTTP请求、JSON解析、异步数据加载等网络编程基础知识。 - **WebSocket实战...
- **SQLite数据库**: SQLite是一种轻量级的关系型数据库管理系统,适合用于移动应用的数据存储。可能会涉及到如何在iOS应用中集成SQLite。 ##### 5. 网络通信 - **HTTP请求**: 教程会解释如何使用NSURLSession或第...
在iOS应用中,数据可以存储在内存、沙盒文件系统、SQLite数据库或使用Core Data框架。源代码可能包含对UserDefaults的简单操作,或者演示如何使用SQLite或Core Data进行结构化数据管理。 网络编程是现代应用的基石...
4. **Lecture 4 Slides (April 13, 2009)**: 讲座四可能会涵盖数据持久化,比如使用NSUserDefaults存储轻量级数据,SQLite数据库进行结构化数据存储,或者使用Core Data框架进行复杂的数据管理。 5. **Lecture 5 ...
虽然具体书名没有给出,但可以推测这份资源可能涵盖了基础到进阶的iPhone开发知识,包括UIKit框架的使用、Cocoa Touch设计原则、网络编程、数据库操作、多线程处理、用户界面设计、动画效果、以及App Store的发布...
此外,还有关于SQLite数据库的基础知识和使用方法,以及如何利用JSON或XML进行网络数据的存取。 网络通信是现代应用不可或缺的部分。本书会介绍URLSession的使用,包括GET和POST请求的发送,以及处理响应数据。对于...
同时,也会涉及本地数据存储,如Core Data框架的使用,以及SQLite数据库的集成。 在用户体验方面,书会探讨手势识别、动画、通知和推送服务。这些都是提升应用交互性和用户满意度的关键元素。另外,还会介绍如何...
- **SQLite**:SQLite是一种轻量级的关系型数据库,广泛应用于移动应用开发中。它可以直接嵌入到应用程序中,无需单独的服务器进程。 **2.2 网络通信** - **URLSession**:URLSession是用于执行HTTP请求的API,...
3. **Lecture 12 Slides (May 11, 2009)**:可能涉及数据持久化,包括使用Core Data框架存储和检索数据,SQLite数据库的使用,以及文件系统的操作。 4. **Lecture 13 Slides (May 13, 2009)**:可能涵盖网络编程,...
6. **数据持久化**:包括SQLite数据库、Property List、Core Data等内容,这些是iPhone应用保存用户数据的常见方式。 7. **网络编程**:介绍如何使用URL Loading System进行HTTP请求,或者使用Bonjour服务进行设备...