目前,应用应该执行以下操作:
>使用来自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)