Esh*_*nya 1 sqlite iphone uitableview
我是objective-c和sqlite的新手.我已经成功地使用sqlite将数据插入到表中.我的项目包含2个页面
添加提醒页面:用户输入数据并单击保存,这是右侧导航栏
查看提醒页面:这是用户在表格视图的单元格中查看已保存的提醒的位置,
即第一单元的第一次提醒,第二单元的第二次提醒等等......
我使用以下代码更轻松地指定了部分的数量,这意味着已保存的提醒的数量等于视图提醒表中的部分数量
-(NSInteger)numberOfSectionsInTableView:(UITableView *)view
{
numTableRecords = -1;
sqlite3_stmt *statement;
if (sqlite3_open([self.databasePath UTF8String], &remindersDB) == SQLITE_OK)
{
NSString *sqlStatement = [NSString stringWithFormat: @"select count(*) from reminders"];
const char *sql = [sqlStatement cStringUsingEncoding:NSUTF8StringEncoding];
if(sqlite3_prepare_v2(remindersDB, sql, -1, &statement, NULL) == SQLITE_OK)
{
while(sqlite3_step(statement) == SQLITE_ROW)
{
numTableRecords = sqlite3_column_int(statement, 0);
}
}
else
{
printf("could not prepare statement: %s\n", sqlite3_errmsg(remindersDB));
}
}
else
{
NSLog(@"Error in Opening Database File");
}
sqlite3_close(remindersDB);
NSLog(@"Number of records = %d",numTableRecords);
return numTableRecords;
}
Run Code Online (Sandbox Code Playgroud)
基于以下链接中给出的建议,与我的要求非常相似:
我拿了一个数组并将检索到的数据作为对象插入到数组中,如下所示:
-(void)viewWillAppear:(BOOL)animated
{
//Retrieve the values of database
const char *dbpath = [self.databasePath UTF8String];
sqlite3_stmt *statement;
if (sqlite3_open(dbpath, &remindersDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM reminders"];
NSLog(@"Data = %@",querySQL);
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(self.remindersDB ,query_stmt , -1, &statement, NULL) == SQLITE_OK)
{
if (sqlite3_step(statement) == SQLITE_ROW)
{
ID = [[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]autorelease];
nameField = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)]autorelease];
eventField = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]autorelease];
dateField = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)]autorelease];
}
sqlite3_finalize(statement);
}
sqlite3_close(self.remindersDB);
}
[array addObject:ID];
[array addObject:nameField];
[array addObject:eventField];
[array addObject:dateField];
[self.theTable reloadData];
[super viewWillAppear:YES];
}
Run Code Online (Sandbox Code Playgroud)
现在在(UITableViewCell)-cell中用于索引路径的行我获取了4个标签并将它们添加为子视图并将[array objectAtIndex:indexPath.row]分配给label.text,即:
- (UITableViewCell *)tableView:(UITableView *)view cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//NSString *CellId = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row];
UITableViewCell *cell = (UITableViewCell *)[view dequeueReusableCellWithIdentifier:nil];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil] autorelease];
view.backgroundColor = [UIColor clearColor];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
label1 = [[[UILabel alloc]initWithFrame:CGRectMake(26, 3, 30, 40)]autorelease];
label1.backgroundColor = [UIColor clearColor];
label1.textColor = [UIColor whiteColor];
label2 = [[[UILabel alloc]initWithFrame:CGRectMake(45, 3, 100, 40)]autorelease];
label2.backgroundColor = [UIColor clearColor];
label2.textColor = [UIColor whiteColor];
label3 = [[[UILabel alloc]initWithFrame:CGRectMake(119, 3, 100, 40)]autorelease];
label3.backgroundColor = [UIColor clearColor];
label3.textColor = [UIColor whiteColor];
label4 = [[[UILabel alloc]initWithFrame:CGRectMake(198, 3, 120, 40)]autorelease];
label4.backgroundColor = [UIColor clearColor];
label4.textColor = [UIColor whiteColor];
}
label1.text = [array objectAtIndex:indexPath.row];
label2.text = [array objectAtIndex:indexPath.row];
label3.text = [array objectAtIndex:indexPath.row];
label4.text = [array objectAtIndex:indexPath.row];
[cell addSubview:label1];
[cell addSubview:label2];
[cell addSubview:label3];
[cell addSubview:label4];
return cell;
}
Run Code Online (Sandbox Code Playgroud)
没有什么东西可以显示在单元格上,请帮助我解决这个问题.对此非常不好,因为我是Objective-c的新手,如果有人提出详细的解释和解决方案,我会非常高兴.请继续提问如果它听起来很愚蠢
在此先感谢所有:)
我明白你现在想做什么.
我建议创建一个类来保存每个提醒的数据,然后你可以有一个提醒数据的数组.
所以我会在你的项目中添加一个新类,称之为Reminder,然后为每个字段添加一个属性.
您的提醒课程如下:
Reminder.h
#import <Foundation/Foundation.h>
@interface Reminder : NSObject
@property (nonatomic, copy) NSString *reminderId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *event;
@property (nonatomic, copy) NSString *date;
@end
Run Code Online (Sandbox Code Playgroud)
和你的reminder.m文件将是:
#import "Reminder.h"
@implementation Reminder
@synthesize reminderId, name, event, date;
-(void)dealloc
{
self.reminderId = nil;
self.name = nil;
self.event = nil;
self.date = nil;
}
@end
Run Code Online (Sandbox Code Playgroud)
因此,此课程将简单地保存每个提醒的数据.
然后在您的视图控制器中显示提醒列表,您需要添加一个数组属性来保存提醒对象.
因此,请将以下属性添加到ViewController,以显示提醒列表.
@property (nonatomic, retain) NSMutableArray *reminders;
Run Code Online (Sandbox Code Playgroud)
确保你也在视图控制器.m文件中合成它,为此,在视图控制器.m文件的@implementation行下添加这行代码:
@synthesize reminders;
Run Code Online (Sandbox Code Playgroud)
还记得在dealloc方法中将reminders属性设置为nil以确保正确的内存清理:
self.reminders = nil;
Run Code Online (Sandbox Code Playgroud)
我们将使用我们在视图控制器中创建的Reminder类,因此您还需要导入您的类,因此在视图控制器.m文件中,在文件顶部附近添加一个import语句,如下所示:
#import "Reminder.h"
Run Code Online (Sandbox Code Playgroud)
现在您的视图控制器已设置好并准备好使用我们创建的提醒类.
然后,您需要在视图控制器中添加一个方法,该方法将用于从数据库加载数据并填充提醒对象和提醒数组.
向视图控制器添加一个新方法,称之为loadReminders
此方法的实现将是:
-(void)loadReminders
{
// setup the reminders array
self.reminders = nil;
self.reminders = [[[NSMutableArray alloc] init] autorelease];
//Retrieve the values of database
const char *dbpath = [self.databasePath UTF8String];
sqlite3_stmt *statement;
if (sqlite3_open(dbpath, &remindersDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM reminders"];
NSLog(@"Data = %@",querySQL);
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(self.remindersDB ,query_stmt , -1, &statement, NULL) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
Reminder *loadedReminder = [[Reminder alloc] init];
loadedReminder.reminderId = [[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]autorelease];
loadedReminder.name = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)]autorelease];
loadedReminder.event = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]autorelease];
loadedReminder.date = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)]autorelease];
[self.reminders addObject:loadedReminder];
[loadedReminder release];
}
sqlite3_finalize(statement);
}
sqlite3_close(self.remindersDB);
}
}
Run Code Online (Sandbox Code Playgroud)
所以这个方法正在做的是从数据库加载行,并且对于数据库中的每一行,它创建一个新的Reminder对象,使用行中的数据设置属性,然后将此提醒对象添加到提醒数组.
注意我从原始代码中做出的更改:
while (sqlite3_step(statement) == SQLITE_ROW)
Run Code Online (Sandbox Code Playgroud)
while语句将循环并从数据库中获取每一行.
每当要刷新数据列表时,都会调用此新方法(loadReminders),因此在代码中当前正在重新加载表的任何位置,在重新加载表之前调用此方法,这将确保设置的提醒数组准备好在重新加载时使用该表.所以在上面的示例中,我将viewWillAppear方法替换为:
-(void)viewWillAppear:(BOOL)animated
{
[self loadReminders];
[self.theTable reloadData];
}
Run Code Online (Sandbox Code Playgroud)
现在所有数据都已设置好并可以使用.使用提醒对象应该使tableView中的代码更容易阅读.
因此,要将数据放入表中,请使用以下内容替换当前的tableview方法.
-(NSInteger)numberOfSectionsInTableView:(UITableView *)view
{
return [self.reminders count];
}
Run Code Online (Sandbox Code Playgroud)
这将告诉表格为提醒数组中的每个提醒创建一个部分.
现在从你的描述(和链接)你正在做的是在每个部分创建1个单元格.因此,添加以下方法告诉tableView我们希望每个部分有1行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
Run Code Online (Sandbox Code Playgroud)
现在对于cellForRowAtIndexPath,用以下内容替换当前方法:
- (UITableViewCell *)tableView:(UITableView *)view cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Reminder *reminderToDisplay;
reminderToDisplay = [self.reminders objectAtIndex:indexPath.section];
// Now create the cell to display the reminder data:
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil] autorelease];
view.backgroundColor = [UIColor clearColor];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
label1 = [[[UILabel alloc]initWithFrame:CGRectMake(26, 3, 30, 40)]autorelease];
label1.backgroundColor = [UIColor clearColor];
label1.textColor = [UIColor whiteColor];
label2 = [[[UILabel alloc]initWithFrame:CGRectMake(45, 3, 100, 40)]autorelease];
label2.backgroundColor = [UIColor clearColor];
label2.textColor = [UIColor whiteColor];
label3 = [[[UILabel alloc]initWithFrame:CGRectMake(119, 3, 100, 40)]autorelease];
label3.backgroundColor = [UIColor clearColor];
label3.textColor = [UIColor whiteColor];
label4 = [[[UILabel alloc]initWithFrame:CGRectMake(198, 3, 120, 40)]autorelease];
label4.backgroundColor = [UIColor clearColor];
label4.textColor = [UIColor whiteColor];
// Now set the labels using our reminder object
label1.text = reminderToDisplay.reminderId;
label2.text = reminderToDisplay.name;
label3.text = reminderToDisplay.event;
label4.text = reminderToDisplay.date;
// now add the labels to the cell
cell.contentView = [[UIView alloc] init] autorelease]
[cell.contentView addSubview:label1];
[cell.contentView addSubview:label2];
[cell.contentView addSubview:label3];
[cell.contentView addSubview:label4];
return cell;
}
Run Code Online (Sandbox Code Playgroud)
所以在这个方法中发生了什么,首先我们得到提醒数组中当前部分的提醒:
Reminder *reminderToDisplay;
reminderToDisplay = [self.reminders objectAtIndex:indexPath.section];
Run Code Online (Sandbox Code Playgroud)
接下来的几行应该很熟悉,我们正在创建单元格和标签.然后我们使用提醒对象来设置标签文本.
您现有解决方案无法正常工作的原因是因为您使用的是indexPath.Row,并且因为您为每个提醒使用了一个部分,所以indexPath.Row将始终为0,因为每个部分中只有1行.
我知道它很长,但希望能帮助你了解正在发生的事情.有任何问题然后让我知道
| 归档时间: |
|
| 查看次数: |
11596 次 |
| 最近记录: |