从SQLite数据库中填充SplitViewController中的UITableView和DetailsView



我的应用程序的主窗口显示一个SplitViewController。左边是显示名称的TableView。右边是一个DetailsView,由2个textview组成,显示姓名和年龄。

这是我为应用程序创建的SQLite数据库和'USERS'表。

-(NSString *)dataFilePath
{
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDir = [paths objectAtIndex:0];
  return [documentsDir stringByAppendingPathComponent:@"Mydata.sqlite"];
}
- (void)viewDidLoad 
{
  [super viewDidLoad];
  if(sqlite3_open([[self dataFilePath] UTF8String], &database) != SQLITE_OK)
  {
    sqlite3_close(database);
    NSAssert(0, @"Failed to open database.");
  }
  char *err;
  NSString *sql = @"CREATE TABLE IF NOT EXISTS USERS" "(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER);";
  if(sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK)
  {
    sqlite3_close(database);
    NSAssert(0, @"Failed to create table.");
  }
}

我想用名字填充TableView。当一个名字在表格中被选中时,SplitViewController右侧的textviews将显示被选中的名字以及年龄。

我可以知道怎么做吗?

里面有很多问题。从它的声音你想知道如何加载值,如何在表视图中显示它们,如何从表视图发送消息到主视图,然后如何在主视图中显示内容。

首先为'User'对象创建一个模型对象。然后在user类中编写一个可以调用的静态方法,该方法返回一个数组中的所有用户。

一旦你有了数组,使用它来填充tableView使用标准的'cellForRowAtIndexPath'方法。一旦用户点击单元格,通过委托方法将选定的用户对象传递给主视图,然后最后在相关标签中显示其各种详细信息(姓名,年龄等)。

如果有任何不清楚的地方让我知道,我可以发布一个代码片段来帮助你。

编辑:所以. .创建对象并将其加载到tableViewController(只写.ms)的代码片段:

对于User类

@implementation User
@synthesize pk, name, age;
#pragma mark - Public Instance Methods
+ (NSArray *)getAllUsers
{
    sqlite3 *db = **However you get your db conn**
    sqlite3_stmt *statement = nil;
    NSMutableArray *userArray = [NSMutableArray array];
    NSString *fullQuery = @"SELECT * FROM User";
    const char *sql = [fullQuery UTF8String];
    if(sqlite3_prepare_v2(db, sql, -1, &statement, NULL)!=SQLITE_OK)
        NSAssert1(0, @"Error preparing statement '%s'", sqlite3_errmsg(db));
    else
    {
        while(sqlite3_step(statement) == SQLITE_ROW)
        {
            User *currentUser = [[User alloc] init];
            [User setPk:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 0)]];
            [User setName:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 1)]];
            [User setAge:[NSString stringWithUTF8String:(const char*)sqlite3_column_text(statement, 2)]];
            [userArray currentUser];
            [currentUser release];
        }
    }
    sqlite3_finalize(statement);
    sqlite3_close(db);
    return [NSArray arrayWithArray:userArray]; 
}

现在对于你的表视图控制器:

- (void)init
{
    self = [self init];
    if (self)
    {
        [self setUserArray:[User getAllUsers]];
    }
}
- (void)dealloc
{
    [super dealloc];
    [userArray release];
}
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [userArray count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
        [cell setSelectionStyle:UITableViewCellSelectionStyleBlue];
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
    User *currentUser = [userArray objectAtIndex:indexPath.row];
    [[cell textLabel] setText:user.name];
    return cell;
}

希望这能给你一个如何进行的想法。如果你对如何继续感到困惑,我建议你阅读"模型-视图-控制器"编程方法以及表视图是如何工作的。一开始有点困难,但你会成功的。

希望有帮助

最新更新