目前,应用应该执行以下操作:
>使用来自sqlite db的数据填充表(基本上只列出所有表)
>用户按下按钮(触发fetchData方法)
>(void)fetchData将本地数据库与服务器数据库校验和进行比较
>(void)fetchData设置NSURLConnection,通过POST与服务器通信
>当连接收到所有数据时,它会更新本地数据库
>使用新的db数据更新tableView dataSource(NSMutableArray)
> tableview更新并列出数据库中的所有表[myTableView reloadData]被调用
我经过双重检查的事情:tableview和delegate,datasource和outlet之间的连接; tableView不是零;数据源本身已经准确更新;
一切都达到了最后一点(7).似乎myTableView当时并不是零.想法?如果您需要查看更多我的代码,请告诉我.
我也看了一下beginUpdates和endUpdates的方法,但在我看来,他们一度关注一些变化和用户交互性.我想根据用户选择重新加载整个表(即希望根据当前用户登录反映整个其他sql选择字符串).或者还有另一种更好的方法吗?
提前致谢!
这是一段相当不错的代码:
- #import "FirstViewController.h"
- @interface FirstViewController ()
- @end
- @implementation FirstViewController
- #import "FirstViewController.h"
- @synthesize myTextView,myTableViewDataSource,myFetchedData,resultat,tablesAndChecks,tablesArr,checksArr,tablesToRequest,receivedData,receivedDataString,sql,sqlStatementsArr,FailedsqlStatementsArr,FailedsqlStatementsCodeArr,dbloop1;
- #pragma mark Table view methods
- - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
- return 1;
- }
- // Customize the number of rows in the table view.
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
- NSLog(@"Konfigurerar tableView"); //swedish for "Configuring tableView"
- if(myTableView.dataSource==nil){
- NSLog(@"datasource = nil");
- }else{
- NSLog(@"datasource != nil"); //This prints in log
- }
- NSLog(@"%d",[myTableViewDataSource count]); //prints "19" in log
- return [myTableViewDataSource count];
- }
- // Customize the appearance of table view cells.
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
- NSLog(@"calling cellForRowAtIndexPath"); //This does NOT print in log
- static NSString *CellIdentifier = @"myCell";
- UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
- if (cell == nil) {
- cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
- }
- // Set up the cell...
- cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:15];
- cell.textLabel.text = [NSString stringWithFormat:@"Tabell %d: %@",[indexPath row],[myTableViewDataSource objectAtIndex:[indexPath row]]];
- return cell;
- }
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection
- {
- NSLog(@"connection did finish loading");
- //...
- //script that receives a long sql-string from the server
- //and then updates the database with it goes here
- //...
- //Ok,so now the database has updated correctly,and it's time
- //to update the tableview so that it reflects the new data.
- //
- //Get data from database...
- NSMutableArray * tempArray = [[NSMutableArray alloc] initWithCapacity:0];
- if (sqlite3_open(dbpath,&contactDB) == sqlITE_OK)
- {
- NSLog(@"Databasen öppnad");
- NSString *beginsql = [NSString stringWithFormat: @"SELECT name FROM sqlite_master WHERE type='table' ORDER BY name;"];
- const char *begin_stmt = [beginsql UTF8String];
- sqlite3_prepare_v2(contactDB,begin_stmt,-1,&statement,NULL);
- while(sqlite3_step(statement) == sqlITE_ROW) {
- char *col1 = (char *)sqlite3_column_text(statement,0);
- if (col1 !=NULL){
- [tempArray addObject:[NSString stringWithUTF8String: col1]];
- }
- }
- if (sqlite3_step(statement) == sqlITE_DONE)
- {
- NSLog(@"#####%s; Done: %@",sqlite3_errmsg(nil),beginsql);
- } else {
- NSLog(@"#####%s; Error with string: %@; Errcode: %d Errmsg: %s",beginsql,sqlite3_errcode(contactDB),sqlite3_errmsg(nil));
- }
- NSLog(@"%d",sqlite3_finalize(statement));
- sqlite3_close(contactDB);
- //update the datasource to the values of tempArray
- myTableViewDataSource = tempArray;
- //Some logging to see that the updated data is in the array... (which it is)
- NSLog(@"myTableViewDataSource count: %d",[myTableViewDataSource count]);
- for (i=0; i<[myTableViewDataSource count]; i++) {
- NSLog(@"%@",[myTableViewDataSource objectAtIndex:i]);
- }
- }
- //Finally,check so that myTableView isn't nil and can receive messages
- if(myTableView == nil){
- NSLog(@"NILCHECK mytableview is nil!");
- }else{
- NSLog(@"NILCHECK mytableview is NOT nil!"); //This is printed out to the log
- }
- //Reload data -> nothing happens...
- [myTableView reloadData];
- }
- - (void)fetchData
- {
- //function that gets current checksums for all db tables on the server,compares them to the local database
- //and then requests an sql-string from the server to update the tables that needs it.
- //I don't think this is relevant for my problem,and it runs fine anyways.
- //The last thing it does is setting up a NSURLConnection to communicate with
- //the server (sending which tables to request via POST and then getting the sql-string as the server response)
- NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
- if (theConnection) {
- //receivedData = [NSMutableData data];
- NSLog(@"ReceivedData är: %d",[receivedData length]);
- } else {
- NSLog(@"Connection Failed!");
- }
- //All done here,now the ReceivedData method takes over
- }
- }
更新:
这是我的viewDidLoad方法:
- - (void)viewDidLoad
- {
- //creates database and fills "tempArray" with data
- NSLog(@"%d",sqlite3_finalize(statement));
- sqlite3_close(contactDB);
- myTableViewDataSource = tempArray;
- NSLog(@"myTableViewDataSource count: %d",[myTableViewDataSource objectAtIndex:i]);
- }
- }
- myTableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];
- myTableView.delegate = self; //Added this after comment (1)
- myTableView.dataSource = self; //Added this after comment (2)
- }
更新:
添加后:
- myTableView.delegate = self;
- myTableView.dataSource = self;
to viewDidLoad,tableView:numberOfRowsInSection:被调用,而dataSource不是nil,但是没有调用tableView:cellForRowAtIndexPath:,并且表没有被更新.
更新2:
这是我的头文件:
- //
- // FirstViewController.h
- // OHBSYS Storyboards
- //
- // Created by David Forsberg on 2012-09-25.
- // Copyright (c) 2012 David Forsberg. All rights reserved.
- //
- #import <UIKit/UIKit.h>
- #import <sqlite3.h>
- @interface FirstViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>{
- NSString *databasePath;
- sqlite3 *contactDB;
- UITextView *myTextView;
- UITableView *myTableView;
- NSMutableArray *myTableViewDataSource;
- NSMutableString * tableRowCount;
- NSMutableArray * dbloop1;
- //And a bunch of other variables here
- }
- @property (retain,nonatomic) IBOutlet UITextView *myTextView;
- @property (nonatomic,retain) IBOutlet UITableView *myTableView;
- @property (nonatomic,retain) IBOutlet NSMutableArray *myTableViewDataSource;
- - (IBAction) fetchData;
- @property (nonatomic) NSString * tableRowCount;
- @property (nonatomic,retain) NSMutableArray * dbloop1;
- //A bunch of other properties here as well
- @end
更新3:
我已经尝试使用断点检查值.
tableview内的断点:numberofrowsinsection:
- (lldb) po self.myTableView
- (UITableView *) $0 = 0x0d13ca00 <UITableView: 0xd13ca00; frame = (0 20; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x2a3d30>; contentOffset: {0,0}>
- (lldb) po self.myTableView.delegate
- (objc_object *) $1 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableView.dataSource
- (objc_object *) $2 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableViewDataSource
- (NSMutableArray *) $3 = 0x0029fb20 <__NSArrayM 0x29fb20>(
- CONTACTS,sqlite_sequence
- )
- (lldb)
- (lldb) po self.myTableView
- (UITableView *) $4 = 0x0d13ca00 <UITableView: 0xd13ca00; frame = (0 20; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x2a3d30>; contentOffset: {0,0}>
- (lldb) po self.myTableView.delegate
- (objc_object *) $5 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableView.dataSource
- (objc_object *) $6 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableView.dataSource //(accidentally hit that twice)
- (objc_object *) $7 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableViewDataSource
- (NSMutableArray *) $8 = 0x0ce6baa0 <__NSArrayM 0xce6baa0>(
- CONTACTS,Meta_tablechecksums,prot_multicoltest,prot_multicoltest_4,prot_multicoltest_4_desc,prot_multicoltest_desc,sqlite_sequence,superadmin_filefolders,superadmin_files,superadmin_imagefolders,superadmin_images,sys_customers,sys_fieldlooks,sys_fieldtypes,sys_formtables,sys_pages,sys_subpages,sys_userroles,sys_users
- )
- (lldb)
断点AT reloadData行:
- (lldb) po self.myTableView
- (UITableView *) $9 = 0x0d13ca00 <UITableView: 0xd13ca00; frame = (0 20; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x2a3d30>; contentOffset: {0,0}>
- (lldb) po self.myTableView.delegate
- (objc_object *) $10 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableView.dataSource
- (objc_object *) $11 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableViewDataSource
- (NSMutableArray *) $12 = 0x0ce6baa0 <__NSArrayM 0xce6baa0>(
- CONTACTS,sys_users
- )
- (lldb)
tableview中的断点:numberofrowsinsection:在更新db并运行reloadData命令之后:
- (lldb) po self.myTableView
- (UITableView *) $13 = 0x0d13ca00 <UITableView: 0xd13ca00; frame = (0 20; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x2a3d30>; contentOffset: {0,0}>
- (lldb) po self.myTableView.delegate
- (objc_object *) $14 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableView.dataSource
- (objc_object *) $15 = 0x0ce99500 <FirstViewController: 0xce99500>
- (lldb) po self.myTableViewDataSource
- (NSMutableArray *) $16 = 0x0ce6baa0 <__NSArrayM 0xce6baa0>(
- CONTACTS,sys_users
- )
- (lldb)