UItableview顯示數據

這篇學習目標:

1. 使用自定義UITableViewCell 控件

2. 使用SQLite離線數據庫

 

引言

iPhone 中內置了 SQLite的數據庫管理系統。它是一款輕型的數據庫,是遵守ACID的關聯式數據庫管理系統,它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式設備中,可能只需要幾百K的內存就夠了。它能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如C#、PHP、Java等,還有ODBC接口。SQLite 是c寫的,IOS中可以直接使用c代碼來操作數據庫。效率槓槓的~~

最常用的方法有如下:

  1. sqlite3_open() -
    打開指定的數據庫文件。如果數據庫文件不存在,將創建此數據庫。

  2. sqlite3_close() -
    關閉先前打開的數據庫文件。

  3. sqlite3_prepare_v2() -
    準備sql語句,執行select語句或者要使用parameter bind時,用這個函數(封裝了sqlite3_exec)。

  4. sqlite3_step() -
    在調用sqlite3_prepare後,使用這個函數在記錄集中移動。

  5. sqlite3_column_<type>() -
    返回的數據字段的SQL數據集操作,其中<type>被替換的數據類型的數據進行提取(TEXT,BLOB字節,整型,INT16等)的結果。

  6. sqlite3_finalize() -
    釋放資源。

  7. sqlite3_exec() -
    執行非查詢的sql語句。

 

其使用步驟大致分爲以下幾步:

  1. 首先獲取iPhone上Sqlite的數據庫文件的地址

  2. 打開Sqlite的數據庫文件

  3. 定義查詢或執行的SQL語句

  4. 邦定執行SQL所需要的參數

  5. 執行SQL語句,並獲取結果

  6. 釋放相關的資源

  7. 關閉Sqlite數據庫

思路:

我們今天來實現一個聯繫人的功能,讀取SQLite中的數據,自定義顯示在UITableView上

 

開始具體操作如下:

1. 創建項目,如何操作,此處略過,可以參考之前的文章,下面只顯示對項目名稱的圖:

2. 導入SQLite庫文件

拖動文件到Framework中去

 

3. 創建一個聯繫人的實體 Contact,修改Contact.h如下

複製代碼
//
// Contact.h
// listContactCustom
//
// Created by tony on 12-9-4.
// Copyright (c) 2012年 chinapcc.com. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Contact : NSObject
{
NSString *_person_id;
NSString *_name;
int _sex;
NSString *_address;
NSString *_phone;
NSString *_email;
NSString *_remark;
}

// 屬性:人員編號
@property (strong,nonatomic) NSString *person_id;

// 屬性:姓名
@property (strong,nonatomic) NSString *name;

// 屬性:性別
@property int sex;

// 屬性:地址
@property (strong,nonatomic) NSString *address;

// 屬性:電話號碼
@property (strong,nonatomic) NSString *phone;

// 屬性:電子郵件
@property (strong,nonatomic) NSString *email;

// 屬性:備註
@property (strong,nonatomic) NSString *remark;


// 方法:初始化參數
-(id) initWithName:(NSString*)name Sex:(int)sex Address:(NSString*)address Phone:(NSString*)phone Email:(NSString*)email Remark:(NSString *)remark;


@end
複製代碼

 

添加 Contact.m 如下:

複製代碼
1//
2// Contact.m
3// listContactCustom
4//
5// Created by tony on 12-9-4.
6// Copyright (c) 2012年 chinapcc.com. All rights reserved.
7//
8
9#import"Contact.h"
10
11@implementation Contact
12
13@synthesize person_id=_person_id;
14@synthesize name=_name;
15@synthesize sex=_sex;
16@synthesize address=_address;
17@synthesize phone=_phone;
18@synthesize email=_email;
19@synthesize remark=_remark;
20
21
22// 方法:初始化參數
23-(id) initWithName:(NSString*)name Sex:(int)sex Address:(NSString*)address Phone:(NSString*)phone Email:(NSString*)email Remark:(NSString *)remark
24 {
25 self = [super init];
26if (self)
27 {
28 _person_id = [[NSProcessInfo processInfo] globallyUniqueString]; // 獲取到一個GUID編號
29_name = name; // 設置姓名
30_sex = sex; // 設置性別
31_address = address; // 設置地址
32_phone = phone; // 設置電話
33_email = email; // 設置電子郵件
34_remark = remark; // 設置備註
35
36 }
37return self;
38 }
39
40// 釋放內存
41-(void) dealloc
42 {
43 self.person_id = nil;
44 self.name = nil;
45 self.address = nil;
46 self.phone = nil;
47 self.email = nil;
48 self.remark = nil;
49 }
50
51
52@end
複製代碼

 

4. 創建一個操作數據庫的類, 修改ContactDao.h代碼如下:

複製代碼
1//
2// ContactDao.h
3// listContactCustom
4//
5// Created by tony on 12-9-4.
6// Copyright (c) 2012年 chinapcc.com. All rights reserved.
7//
8
9#import <Foundation/Foundation.h>
10
11// 此處要引用SQLite3的頭文件
12#import <sqlite3.h>
13
14// 要引用剛剛寫的實體類
15#import"Contact.h"
16
17// 聯繫人處理的數據操作類(DAO:Data Access Objects)
18@interface ContactDao : NSObject
19 {
20// 數據庫
21sqlite3 *database;
22
23// 返回的是sql解析的結果集
24sqlite3_stmt *statement;
25
26// 返回的錯誤信息
27char *errorMsg;
28
29// 數據庫名稱
30NSString *databaseName;
31
32// 數據庫路徑
33NSString *databasePath;
34 }
35
36//打開數據庫
37-(BOOL)open;
38
39//創建數據表
40-(BOOL)create;
41
42//增加、刪除、修改、查詢, 不用我每行註解了吧,大家都懂的
43-(BOOL)insert:(Contact *)model;
44 -(BOOL)deleteALLContact;
45 -(BOOL)deleteContact:(Contact*)model;
46 -(BOOL)update:(Contact*)model;
47
48 -(NSMutableArray*)selectAll;
49 -(Contact*)selectContact:(NSString*)person_id;
50
51// 爲了測試,寫入測試數據
52-(void)initWithPerson;
53
54@end
複製代碼

 

5. 修改 ContactDao.m 文件,詳細如下:

5.1 找到數據庫位置或重新創建數據文件的地址

複製代碼
1// 打開數據庫文件地址,方法內代碼,不需要註解吧,(如果不懂,可以找谷歌老師)
2-(BOOL)open
3 {
4 BOOL success = NO;
5 NSFileManager *fileManager = [NSFileManager defaultManager];
6 success = [fileManager fileExistsAtPath:databasePath];
7if(!success)
8 {
9 NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
10 [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
11 }
12if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
13 {
14 success = YES;
15 NSLog(@" 打開數據庫成功!");
16 }
17else
18 {
19 success = NO;
20 NSLog(@" 打開數據庫出錯!");
21 }
22return success;
23 }
複製代碼

 

5.2 創建表結構

複製代碼
1// 創建表結構
2-(BOOL)create
3 {
4 BOOL success = NO;
5// 打開數據庫文件
6if([self open])
7 {
8// 創建表的SQL語句
9constchar *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACT(person_id TEXT PRIMARY KEY, NAME TEXT,SEX INTEGER, ADDRESS TEXT, PHONE TEXT, EMAIL TEXT, REMARK TEXT)";
10// 執行創建表的語句
11if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
12 {
13 success = YES;
14 }
15else
16 {
17 NSLog(@" 執行出錯:%s ",errorMsg);
18 sqlite3_free(errorMsg); // 釋放錯誤信息資源
19}
20 } 
21
22// 關閉數據庫
23sqlite3_close(database);
24return success;
25 }
複製代碼

 

5.3 新增方法

複製代碼
1// 方法:新增聯繫人
2-(BOOL)insert:(Contact *)model
3 {
4 BOOL success = NO;
5if([self open])
6 {
7 NSString *sql = [[NSString alloc] initWithFormat:@"INSERT INTO CONTACT(person_id, NAME,SEX, ADDRESS, PHONE, EMAIL, REMARK) VALUES ('%@','%@',%d,'%@','%@','%@','%@')",model.person_id,model.name, model.sex,model.address,model.phone,model.email,model.remark];
8constchar *query_stmt = [sql UTF8String];
9if (sqlite3_exec(database, query_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
10 {
11 NSLog(@"寫入數據成功!'%@','%@',%d,'%@','%@','%@','%@'",model.person_id,model.name,model.sex,model.address,model.phone,model.email,model.remark);
12 success = YES;
13 } else {
14 NSLog(@"寫入數據失敗!%s",errorMsg);
15 sqlite3_free(errorMsg);
16 }
17 } 
18 sqlite3_close(database);
19return success;
20 }
複製代碼

 

5.4 刪除所有聯繫人 

複製代碼
1// 方法:刪除所有聯繫人
2-(BOOL)deleteALLContact
3 {
4 BOOL success = NO;
5// 打開數據庫文件
6if([self open])
7 {
8// 刪除聯繫人的SQL語句
9constchar *sql_stmt = "DELETE FROM CONTACT";
10// 執行刪除聯繫人的SQL語句
11if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
12 {
13 NSLog(@" 刪除所有聯繫人資料!");
14 success = YES;
15 }
16else
17 {
18 NSLog(@" 執行出錯:%s ",errorMsg);
19 sqlite3_free(errorMsg); // 釋放錯誤信息資源
20}
21 } 
22// 關閉數據庫
23sqlite3_close(database);
24return success;
25 }
複製代碼

 

5.5 刪除單個聯繫人

複製代碼
1// 方法:刪除指定的聯繫人
2-(BOOL)deleteContact:(Contact *)model
3 {
4 BOOL success = NO;
5// 打開數據庫文件
6if([self open])
7 { 
8 NSString *sql = [[NSString alloc] initWithFormat:@"DELETE FROM CONTACT WHERE (person_id='%@')",model.person_id];
9constchar *query_stmt = [sql UTF8String];
10// 執行刪除聯繫人的SQL語句
11if (sqlite3_exec(database, query_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
12 {
13 NSLog(@" 刪除[%@]資料成功!",model.name);
14 success = YES;
15 }
16else
17 {
18 NSLog(@" 執行出錯:%s ",errorMsg);
19 sqlite3_free(errorMsg); // 釋放錯誤信息資源
20}
21 } 
22// 關閉數據庫
23sqlite3_close(database);
24return success;
25 }
複製代碼

 

5.6 更新聯繫人資料

複製代碼
1// 方法:更新聯繫人資料
2-(BOOL)update:(Contact *)model
3 {
4 BOOL success = NO;
5if([self open])
6 {
7 NSString *sql = [[NSString alloc] initWithFormat:@"UPDATE CONTACT SET NAME='%@',SEX=%d, ADDRESS='%@', PHONE='%@', EMAIL='%@', REMARK='%@') WHERE (person_id='%@') ",model.name, model.sex,model.address,model.phone,model.email,model.remark,model.person_id];
8constchar *query_stmt = [sql UTF8String];
9if (sqlite3_exec(database, query_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
10 {
11 NSLog(@"更新數據成功!'%@','%@',%d,'%@','%@','%@','%@'",model.person_id,model.name,model.sex,model.address,model.phone,model.email,model.remark);
12 success = YES;
13 } else {
14 NSLog(@"更新數據失敗!%s",errorMsg);
15 sqlite3_free(errorMsg);
16 }
17 }
18 sqlite3_close(database);
19return success;
20 }
複製代碼

 

5.7 查詢所有聯繫人

複製代碼
1// 方法:列出所有聯繫人資料
2-(NSMutableArray*)selectAll
3 {
4 NSMutableArray *list = [[NSMutableArray alloc] init];
5if([self open])
6 {
7// 設置SQL查詢語名
8constchar *sqlStatement = "SELECT * FROM CONTACT";
9
10if(sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK) {
11// 循環遍歷結果並將它們添加到人員列表
12while(sqlite3_step(statement) == SQLITE_ROW) {
13// 從結果行讀取數據
14NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
15int sex = sqlite3_column_int(statement, 2);
16 NSString *address = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)];
17 NSString *phone = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)];
18 NSString *email = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)];
19 NSString *remark = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 6)];
20
21// 創建一個新對像,並且初始化賦值
22Contact *person = [[Contact alloc] initWithName:name
23 Sex:sex
24 Address:address
25 Phone:phone
26 Email:email
27 Remark:remark];
28
29// 添加對像到數組中
30[list addObject:person];
31 }
32 }
33 }
34return list;
35 }
複製代碼

 

5.8 查詢單個聯繫人 

複製代碼
1// 方法:根據人員編號,獲取聯繫人的實體
2-(Contact*)selectContact:(NSString*)person_id;
3 {
4 Contact *person = [[Contact alloc] init];
5if([self open])
6 {
7// 設置SQL查詢語名
8constchar *sqlStatement = "SELECT * FROM CONTACT";
9
10if(sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK) {
11// 取出查詢到的第一條記錄,返回結果
12if (sqlite3_step(statement) == SQLITE_ROW) {
13// 從結果行讀取數據
14NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
15int sex = sqlite3_column_int(statement, 2);
16 NSString *address = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)];
17 NSString *phone = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)];
18 NSString *email = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)];
19 NSString *remark = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 6)];
20
21// 創建一個新對像,並且初始化賦值
22person = [[Contact alloc] initWithName:name
23 Sex:sex
24 Address:address
25 Phone:phone
26 Email:email
27 Remark:remark];
28 }
29 }
30 }
31return person;
32 }
複製代碼

 

5.9 爲了測試,初始化一些數據 

複製代碼
1// 爲了測試初始化一些代碼
2-(void)initWithPerson
3 {
4 [self create];
5 Contact *c1 = [[Contact alloc] initWithName:@"汪肄敏"
6 Sex:1
7 Address:@"上海市嘉定區滬宜公路88888號"
8 Phone:@"133xxxx8987"
9 Email:@"[email protected]"
10 Remark:@" 脫脫 "];
11 [self insert:c1];
12
13 Contact *c2 = [[Contact alloc] initWithName:@"石磊"
14 Sex:1
15 Address:@"上海市長寧區武夷路99號"
16 Phone:@"138xxxx5775"
17 Email:@"[email protected]"
18 Remark:@" 情聖 "];
19 [self insert:c2];
20
21 Contact *c3 = [[Contact alloc] initWithName:@"李清美"
22 Sex:0
23 Address:@"上海市楊清區岱山路18號"
24 Phone:@"138xxxx1314"
25 Email:@"[email protected]"
26 Remark:@" 妹子 "];
27 [self insert:c3];
28
29
30 Contact *c4 = [[Contact alloc] initWithName:@"邱學軍"
31 Sex:1
32 Address:@"上海市閔行區長清路88號"
33 Phone:@"139xxxx7551"
34 Email:@"[email protected]"
35 Remark:@" Q君 "];
36 [self insert:c4];
37
38
39 Contact *c5 = [[Contact alloc] initWithName:@"李志強"
40 Sex:1
41 Address:@"上海市清東新區張江路100號"
42 Phone:@"136xxxx9018"
43 Email:@"[email protected]"
44 Remark:@" P哥 "];
45 [self insert:c5];
46
47 Contact *c6 = [[Contact alloc] initWithName:@"戴豔豐"
48 Sex:1
49 Address:@"上海市楊浦區政權路520號"
50 Phone:@"152xxxx1314"
51 Email:@"[email protected]"
52 Remark:@" 瘋子 "];
53 [self insert:c6];
54 }
複製代碼

 

5.10 釋放資源

複製代碼
1// 釋放資源
2-(void) dealloc
3 {
4 database = nil;
5 statement = nil;
6 databaseName = nil;
7 databasePath = nil;
8 errorMsg = nil;
9 }
複製代碼

 

5.11 完整代碼如下:

View Code  
1//
2// ContactDao.m
3// listContactCustom
4//
5// Created by tony on 12-9-4.
6// Copyright (c) 2012年 chinapcc.com. All rights reserved.
7//
8
9#import"ContactDao.h"
10
11@implementation ContactDao
12
13 -(id) init
14 {
15 self = [super init];
16if (self)
17 {
18 databaseName = @"contact.db";
19 NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
20 NSString *documentsDir = [documentPaths objectAtIndex:0];
21 databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
22 }
23return self;
24 }
25
26
27// 打開數據庫文件地址,方法內代碼,不需要註解吧,(如果不懂,可以找谷歌老師)
28-(BOOL)open
29 {
30 BOOL success = NO;
31 NSFileManager *fileManager = [NSFileManager defaultManager];
32 success = [fileManager fileExistsAtPath:databasePath];
33if(!success)
34 {
35 NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
36 [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
37 }
38if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
39 {
40 success = YES;
41 NSLog(@" 打開數據庫成功!");
42 }
43else
44 {
45 success = NO;
46 NSLog(@" 打開數據庫出錯!");
47 }
48return success;
49 }
50
51// 創建表結構
52-(BOOL)create
53 {
54 BOOL success = NO;
55// 打開數據庫文件
56if([self open])
57 {
58// 創建表的SQL語句
59constchar *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACT(person_id TEXT PRIMARY KEY, NAME TEXT,SEX INTEGER, ADDRESS TEXT, PHONE TEXT, EMAIL TEXT, REMARK TEXT)";
60// 執行創建表的語句
61if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
62 {
63 success = YES;
64 }
65else
66 {
67 NSLog(@" 執行出錯:%s ",errorMsg);
68 sqlite3_free(errorMsg); // 釋放錯誤信息資源
69}
70 } 
71
72// 關閉數據庫
73sqlite3_close(database);
74return success;
75 }
76
77// 方法:新增聯繫人
78-(BOOL)insert:(Contact *)model
79 {
80 BOOL success = NO;
81if([self open])
82 {
83 NSString *sql = [[NSString alloc] initWithFormat:@"INSERT INTO CONTACT(person_id, NAME,SEX, ADDRESS, PHONE, EMAIL, REMARK) VALUES ('%@','%@',%d,'%@','%@','%@','%@')",model.person_id,model.name, model.sex,model.address,model.phone,model.email,model.remark];
84constchar *query_stmt = [sql UTF8String];
85if (sqlite3_exec(database, query_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
86 {
87 NSLog(@"寫入數據成功!'%@','%@',%d,'%@','%@','%@','%@'",model.person_id,model.name,model.sex,model.address,model.phone,model.email,model.remark);
88 success = YES;
89 } else {
90 NSLog(@"寫入數據失敗!%s",errorMsg);
91 sqlite3_free(errorMsg);
92 }
93 } 
94 sqlite3_close(database);
95return success;
96 }
97
98
99// 方法:刪除所有聯繫人
100-(BOOL)deleteALLContact
101 {
102 BOOL success = NO;
103// 打開數據庫文件
104if([self open])
105 {
106// 刪除聯繫人的SQL語句
107constchar *sql_stmt = "DELETE FROM CONTACT";
108// 執行刪除聯繫人的SQL語句
109if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
110 {
111 NSLog(@" 刪除所有聯繫人資料!");
112 success = YES;
113 }
114else
115 {
116 NSLog(@" 執行出錯:%s ",errorMsg);
117 sqlite3_free(errorMsg); // 釋放錯誤信息資源
118}
119 } 
120// 關閉數據庫
121sqlite3_close(database);
122return success;
123 }
124
125// 方法:刪除指定的聯繫人
126-(BOOL)deleteContact:(Contact *)model
127 {
128 BOOL success = NO;
129// 打開數據庫文件
130if([self open])
131 { 
132 NSString *sql = [[NSString alloc] initWithFormat:@"DELETE FROM CONTACT WHERE (person_id='%@')",model.person_id];
133constchar *query_stmt = [sql UTF8String];
134// 執行刪除聯繫人的SQL語句
135if (sqlite3_exec(database, query_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
136 {
137 NSLog(@" 刪除[%@]資料成功!",model.name);
138 success = YES;
139 }
140else
141 {
142 NSLog(@" 執行出錯:%s ",errorMsg);
143 sqlite3_free(errorMsg); // 釋放錯誤信息資源
144}
145 } 
146// 關閉數據庫
147sqlite3_close(database);
148return success;
149 }
150
151// 方法:更新聯繫人資料
152-(BOOL)update:(Contact *)model
153 {
154 BOOL success = NO;
155if([self open])
156 {
157 NSString *sql = [[NSString alloc] initWithFormat:@"UPDATE CONTACT SET NAME='%@',SEX=%d, ADDRESS='%@', PHONE='%@', EMAIL='%@', REMARK='%@') WHERE (person_id='%@') ",model.name, model.sex,model.address,model.phone,model.email,model.remark,model.person_id];
158constchar *query_stmt = [sql UTF8String];
159if (sqlite3_exec(database, query_stmt, NULL, NULL, &errorMsg) == SQLITE_OK)
160 {
161 NSLog(@"更新數據成功!'%@','%@',%d,'%@','%@','%@','%@'",model.person_id,model.name,model.sex,model.address,model.phone,model.email,model.remark);
162 success = YES;
163 } else {
164 NSLog(@"更新數據失敗!%s",errorMsg);
165 sqlite3_free(errorMsg);
166 }
167 }
168 sqlite3_close(database);
169return success;
170 }
171
172// 方法:列出所有聯繫人資料
173-(NSMutableArray*)selectAll
174 {
175 NSMutableArray *list = [[NSMutableArray alloc] init];
176if([self open])
177 {
178// 設置SQL查詢語名
179constchar *sqlStatement = "SELECT * FROM CONTACT";
180
181if(sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK) {
182// 循環遍歷結果並將它們添加到人員列表
183while(sqlite3_step(statement) == SQLITE_ROW) {
184// 從結果行讀取數據
185NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
186int sex = sqlite3_column_int(statement, 2);
187 NSString *address = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)];
188 NSString *phone = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)];
189 NSString *email = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)];
190 NSString *remark = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 6)];
191
192// 創建一個新對像,並且初始化賦值
193Contact *person = [[Contact alloc] initWithName:name
194 Sex:sex
195 Address:address
196 Phone:phone
197 Email:email
198 Remark:remark];
199
200// 添加對像到數組中
201[list addObject:person];
202 }
203 }
204 }
205return list;
206 }
207
208// 方法:根據人員編號,獲取聯繫人的實體
209-(Contact*)selectContact:(NSString*)person_id;
210 {
211 Contact *person = [[Contact alloc] init];
212if([self open])
213 {
214// 設置SQL查詢語名
215constchar *sqlStatement = "SELECT * FROM CONTACT";
216
217if(sqlite3_prepare_v2(database, sqlStatement, -1, &statement, NULL) == SQLITE_OK) {
218// 取出查詢到的第一條記錄,返回結果
219if (sqlite3_step(statement) == SQLITE_ROW) {
220// 從結果行讀取數據
221NSString *name = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)];
222int sex = sqlite3_column_int(statement, 2);
223 NSString *address = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 3)];
224 NSString *phone = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 4)];
225 NSString *email = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 5)];
226 NSString *remark = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 6)];
227
228// 創建一個新對像,並且初始化賦值
229person = [[Contact alloc] initWithName:name
230 Sex:sex
231 Address:address
232 Phone:phone
233 Email:email
234 Remark:remark];
235 }
236 }
237 }
238return person;
239 }
240
241// 爲了測試初始化一些代碼
242-(void)initWithPerson
243 {
244 [self create];
245 Contact *c1 = [[Contact alloc] initWithName:@"汪肄敏"
246 Sex:1
247 Address:@"上海市嘉定區滬宜公路88888號"
248 Phone:@"133xxxx8987"
249 Email:@"[email protected]"
250 Remark:@" 脫脫 "];
251 [self insert:c1];
252
253 Contact *c2 = [[Contact alloc] initWithName:@"石磊"
254 Sex:1
255 Address:@"上海市長寧區武夷路99號"
256 Phone:@"138xxxx5775"
257 Email:@"[email protected]"
258 Remark:@" 情聖 "];
259 [self insert:c2];
260
261 Contact *c3 = [[Contact alloc] initWithName:@"李清美"
262 Sex:0
263 Address:@"上海市楊清區岱山路18號"
264 Phone:@"138xxxx1314"
265 Email:@"[email protected]"
266 Remark:@" 妹子 "];
267 [self insert:c3];
268
269
270 Contact *c4 = [[Contact alloc] initWithName:@"邱學軍"
271 Sex:1
272 Address:@"上海市閔行區長清路88號"
273 Phone:@"139xxxx7551"
274 Email:@"[email protected]"
275 Remark:@" Q君 "];
276 [self insert:c4];
277
278
279 Contact *c5 = [[Contact alloc] initWithName:@"李志強"
280 Sex:1
281 Address:@"上海市清東新區張江路100號"
282 Phone:@"136xxxx9018"
283 Email:@"[email protected]"
284 Remark:@" P哥 "];
285 [self insert:c5];
286
287 Contact *c6 = [[Contact alloc] initWithName:@"戴豔豐"
288 Sex:1
289 Address:@"上海市楊浦區政權路520號"
290 Phone:@"152xxxx1314"
291 Email:@"[email protected]"
292 Remark:@" 瘋子 "];
293 [self insert:c6];
294 }
295
296// 釋放資源
297-(void) dealloc
298 {
299 database = nil;
300 statement = nil;
301 databaseName = nil;
302 databasePath = nil;
303 errorMsg = nil;
304 }
305
306@end

 

6. 自定義UITableViewCell 類

6.1 刪除默認的View, 添加Table View

6.2 設置Cell的屬性

6.3 設置Cell的高度

6.4 添加展示的控件

6.5 添加Cell的控制器類

6.6 View與Controller Class關聯起來

 

6.7 修改 ContactCell.h文件如下

複製代碼
1//
2// ContactCell.h
3// listContactCustom
4//
5// Created by tony on 12-9-4.
6// Copyright (c) 2012年 chinapcc.com. All rights reserved.
7//
8
9#import <UIKit/UIKit.h>
10
11@interface ContactCell : UITableViewCell
12 {
13 IBOutlet UILabel *lbName;
14 IBOutlet UILabel *lbPhone;
15 IBOutlet UILabel *lbEmail;
16 IBOutlet UILabel *lbAddress;
17 IBOutlet UIImageView * ivPhoto;
18 }
19
20 @property (copy, nonatomic) UIImage *image;
21 @property (copy, nonatomic) NSString *name;
22 @property (copy, nonatomic) NSString *phone;
23 @property (copy, nonatomic) NSString *email;
24 @property (copy, nonatomic) NSString *address;
25
26@end
複製代碼

6.8 修改 ContactCell.m 文件,重寫SET方法 

複製代碼
1@synthesize name;
2@synthesize phone;
3@synthesize image;
4@synthesize email;
5@synthesize address;
6
7
8// 重寫屬性
9
10 - (void)setImage:(UIImage *)img {
11if (![img isEqual:image]) {
12 image = [img copy];
13 self.imageView.image = image;
14 }
15 }
16
17 -(void)setName:(NSString *)n {
18if (![n isEqualToString:name]) {
19 name = [n copy];
20 lbName.text = name;
21 }
22 }
23
24 -(void)setPhone:(NSString *)p {
25if (![p isEqualToString:phone]) {
26 phone = [p copy];
27 lbPhone.text = phone;
28 }
29 }
30
31 -(void)setEmail:(NSString *)e {
32if (![e isEqualToString:email]) {
33 email = [e copy];
34 lbEmail.text = email;
35 }
36 }
37
38 -(void)setAddress:(NSString *)a {
39if (![a isEqualToString:address]) {
40 address = [a copy];
41 lbAddress.text = address;
42 }
43 }
複製代碼

6.9 類與View關聯如下:

 

7. 實現UITableViewController 類

7.1 刪除默認的ViewController

7.2 添加myTableViewController類,繼承於TableViewController,並且綁定如下:

 

7.3 添加幾個按鈕控件

7.4 修改myTableViewController.h 

複製代碼
1//
2// myTableViewController.h
3// listContactCustom
4//
5// Created by tony on 12-9-4.
6// Copyright (c) 2012年 chinapcc.com. All rights reserved.
7//
8
9#import <UIKit/UIKit.h>
10#import"Contact.h"
11#import"ContactCell.h"
12#import"ContactDao.h"
13
14@interface myTableViewController : UITableViewController
15 {
16 NSMutableArray *listContact;
17 }
18
19// 事件:初始化數據
20-(IBAction)btnInitData:(id)sender;
21
22// 事件:清除聯繫人數據
23-(IBAction)btnClearData:(id)sender;
24
25// 事件:刷新聯繫人數據
26-(IBAction)btnRefreshData:(id)sender;
27@end
複製代碼

7.5 綁定事件

 

8. 綁定數據源,修改 myTableViewController.m 文件,具體就不細說了,前二篇看過,應該沒有問題 

複製代碼
1 - (void)viewDidLoad
2 {
3// 實例化DAO
4ContactDao *dao = [[ContactDao alloc] init];
5
6// 獲取所有聯繫人
7listContact = [dao selectAll];
8
9 [super viewDidLoad];
10 }
11
12 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
13 {
14return1;
15 }
16
17 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
18 {
19return [listContact count];
20 }
21
22 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
23 {
24static NSString *CellIdentifier = @"Cell";
25 ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
26 // 重點就在這裏
27 Contact *p = [listContact objectAtIndex:indexPath.row];
28
29if (p.sex==1) {
30// 男性
31cell.image = [UIImage imageNamed:@"male.png"];
32 } else {
33 cell.image = [UIImage imageNamed:@"female.png"];
34 }
35 cell.name = p.name; // 顯示姓名
36cell.phone = p.phone; // 顯示電話
37cell.email = p.email; // 顯示電子郵件
38cell.address = p.address; // 顯示通訊地址
39return cell;
40 }
41
42#pragma mark - 按鈕事件
43// 初始化數據
44-(IBAction)btnInitData:(id)sender
45 {
46 ContactDao *dao = [[ContactDao alloc] init];
47
48// 初始化數據
49[dao initWithPerson];
50
51// 獲取所有聯繫人
52listContact = [dao selectAll];
53
54// 重新加載數據
55[self.tableView reloadData];
56 }
57
58// 清除所有數據
59-(IBAction)btnClearData:(id)sender
60 {
61 ContactDao *dao = [[ContactDao alloc] init];
62
63// 刪除所有聯繫人
64[dao deleteALLContact];
65
66// 獲取所有聯繫人
67listContact = [dao selectAll];
68
69// 重新加載數據
70[self.tableView reloadData];
71
72 }
73
74// 刷新數據
75-(IBAction)btnRefreshData:(id)sender
76 {
77 ContactDao *dao = [[ContactDao alloc] init];
78
79// 獲取所有聯繫人
80listContact = [dao selectAll];
81
82 [self.tableView reloadData];
83 }

 

複製代碼

9. 執行,看效果 

10. 按國際慣例,附上:源代碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章