如何将sqlite数据库值添加到数组以及如何将这些值添加到tableview?

我有SQLite数据库和检索数据到另一个tableview如何做? 我感到如何将数据库值添加到数组,以及如何将这些值添加到tableview? 这是我的代码dbmodelclass.h

#import <UIKit/UIKit.h> #import <sqlite3.h> @interface dbModelClass :UIViewController { NSMutableDictionary *readDic; NSMutableArray *readArray; // sqlite3 *_database; } +(NSString *)connectDb; +(BOOL)createTable; +(BOOL)createTable3; +(int)saveData:(NSMutableArray *)data; +(int)saveData2:(NSMutableArray *)data; +(NSMutableArray *)getData; @end This is my dbmodelclass.m #import "dbModelClass.h" #import "Expences.h" @implementation dbModelClass; -(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } #pragma mark - View lifecycle - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. } +(NSString *)connectDb { NSArray *docDir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *dbFolder=[docDir objectAtIndex:0]; NSFileManager *manager=[NSFileManager defaultManager]; if (![manager fileExistsAtPath:dbFolder]) { [manager createDirectoryAtPath:dbFolder withIntermediateDirectories:YES attributes:nil error:nil]; } NSString *dbPath=[dbFolder stringByAppendingPathComponent:@"fappDB.sqlite"]; if (![manager fileExistsAtPath:dbPath]) { [manager copyItemAtPath:[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"fappDB.sqlite"] toPath:dbPath error:nil]; } NSLog(@"%@",dbPath); return dbPath; } +(BOOL)createTable { NSString *dbpath=[dbModelClass connectDb]; sqlite3 *dbObj; if (sqlite3_open([dbpath UTF8String], &dbObj)==SQLITE_OK) { sqlite3_stmt *stmt=nil; const char *sql="create table deposit(deposit_amount VARCHAR,remarks VARCHAR)"; sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil); if (sqlite3_step(stmt)==SQLITE_DONE) { NSLog(@"tabel created successfull"); } else { NSLog(@"tabel already created"); } sqlite3_finalize(stmt); sqlite3_close(dbObj); } return YES; } +(BOOL)createTable3; { NSString *dbpath=[dbModelClass connectDb]; sqlite3 *dbObj; if (sqlite3_open([dbpath UTF8String], &dbObj)==SQLITE_OK) { sqlite3_stmt *stmt=nil; const char *sql="create table expense2(expense_title VARCHAR,description VARCHAR,amount VARCHAR,paidcash VARCHAR,date VARCHAR,remarks VARCHAR)"; sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil); if (sqlite3_step(stmt)==SQLITE_DONE) { NSLog(@"tabel created successfull"); } else { NSLog(@"tabel already created"); } sqlite3_finalize(stmt); sqlite3_close(dbObj); } return YES; } +(int)saveData:(NSMutableArray *)data { sqlite3 *dbObj; sqlite3_stmt *stmt=nil; NSString *dbPath=[dbModelClass connectDb]; const char *sql=[[NSString stringWithFormat:@"insert into deposit(deposit_amount,remarks) values(\"%@\",\"%@\")",[data objectAtIndex:0],[data objectAtIndex:1]]UTF8String]; if (sqlite3_open([dbPath UTF8String], &dbObj)==SQLITE_OK) { sqlite3_bind_text(stmt, 1, [[data objectAtIndex:0]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 2, [[data objectAtIndex:1]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil); if (sqlite3_step(stmt)==SQLITE_DONE) { NSLog(@"data insertion stmnt executed properly"); } else NSLog(@"data insertion stmnt not executed"); sqlite3_finalize(stmt); sqlite3_close(dbObj); } return sqlite3_last_insert_rowid(dbObj); } +(int)saveData2:(NSMutableArray *)data { sqlite3 *dbObj; sqlite3_stmt *stmt=nil; NSString *dbPath=[dbModelClass connectDb]; const char *sql=[[NSString stringWithFormat:@"insert into expense2(expense_title,description,amount,paidcash,date,remarks) values(\"%@\",\"%@\",\"%@\",\"%@\",\"%@\",\"%@\")",[data objectAtIndex:0],[data objectAtIndex:1],[data objectAtIndex:2],[data objectAtIndex:3],[data objectAtIndex:4],[data objectAtIndex:5]]UTF8String]; if (sqlite3_open([dbPath UTF8String], &dbObj)==SQLITE_OK) { sqlite3_bind_text(stmt, 1, [[data objectAtIndex:0]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 2, [[data objectAtIndex:1]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 3, [[data objectAtIndex:2]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 4, [[data objectAtIndex:3]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 5, [[data objectAtIndex:4]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(stmt, 6, [[data objectAtIndex:5]UTF8String], -1, SQLITE_TRANSIENT); sqlite3_prepare_v2(dbObj, sql, -1, &stmt, nil); if (sqlite3_step(stmt)==SQLITE_DONE) { NSLog(@"data insertion stmnt executed properly"); } else NSLog(@"data insertion stmnt not executed"); sqlite3_finalize(stmt); sqlite3_close(dbObj); } return sqlite3_last_insert_rowid(dbObj); } +(NSMutableArray *)getData { sqlite3 *dbobj; NSString *dbpath =[dbModelClass connectDb]; NSMutableArray *readArray=[[NSMutableArray alloc]init]; if(sqlite3_open([dbpath UTF8String], &dbobj)==SQLITE_OK) { sqlite3_stmt *statement=nil; //**** NSString *string=@"SELECT name FROM emptable"; NSString *string=@"SELECT * FROM deposit"; const char *query=[string UTF8String]; if(sqlite3_prepare_v2(dbobj, query, -1, &statement, NULL)==SQLITE_OK) { while (sqlite3_step(statement)==SQLITE_ROW) { NSMutableDictionary *readDic=[[NSMutableDictionary alloc] init]; [readDic setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)] forKey:@"deposit_amount"]; // NSString *aName=[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 0)]; // NSString *pwd=[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; // [readDic setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)] forKey:@"password"]; // [readArray addObject:aName]; // [readArray1 addObject:pwd]; [readArray addObject:readDic]; // NSLog(@"%@",readDic); } } sqlite3_finalize(statement); } NSLog(@"%@",readArray); sqlite3_close(dbobj); return readArray; } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // eg self.myOutlet = nil; } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations return (interfaceOrientation == UIInterfaceOrientationPortrait); } @end This is my netviewcontroller.h #import <UIKit/UIKit.h> @interface NetViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> { IBOutlet UILabel *depositLabel,*expenseLabel,*netvalueLabel; IBOutlet UITextField *netvalueText; IBOutlet UITableView *depositTable; } @property (strong, nonatomic) UINavigationController *navigationController; @property(strong,nonatomic)UILabel *depositLabel,*expenseLabel,*netvalueLabel; @property(strong,nonatomic)UITextField *netvalueText; @property(strong,nonatomic)UITableView *depositTable; -(IBAction)netvalue:(id)sender; @end This is my netviewcontroller.m #import "NetViewController.h" #import "dbModelClass.h" @interface NetViewController () @end @implementation NetViewController { NSArray *tableData; } @synthesize depositLabel,netvalueLabel,depositTable,netvalueText; //@synthesize str,depositData,depositArray; - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization } return self; } - (void)viewDidLoad { [super viewDidLoad]; [dbModelClass connectDb]; [dbModelClass getData]; /* depositArray=[[NSMutableArray alloc]init]; depositData=[[NSMutableArray alloc]init]; depositArray=[dbModelClass getData:str]; for( NSDictionary *dis in depositArray) { [depositData addObject:[dis objectForKey:@"depositTable"]]; }*/ } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(IBAction)netvalue:(id)sender { } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [tableData count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"SimpleTableItem"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; } cell.textLabel.text = [tableData objectAtIndex:indexPath.row]; return cell; } @end 

首先,阅读本教程中的NSArray

然后阅读本教程中的NSDictionary

通过阅读本教程,您可以学习如何在sqlite中保存数据并在tableview中显示

我张贴我的示例代码尝试休耕这样会帮助你

 -(void)checkAndCreateDB { dataBasePath=[[NSString alloc] initWithString: [NSString stringWithFormat: @"%@/QRCodeDB.sqlite",[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]]]; BOOL success; NSFileManager *filemanager=[NSFileManager defaultManager]; success=[filemanager fileExistsAtPath:dataBasePath]; if(success){ return; } NSString *databasePathFromApp=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"QRCodeDB.sqlite"]; [filemanager copyItemAtPath:databasePathFromApp toPath:dataBasePath error:nil]; } -(void)addNewItemWhereText:(NSString *)text imageData:(NSData *)data dateIs:(NSString *)date { [self checkAndCreateDB]; sqlite3_stmt *compiledStmt; sqlite3 *db; if(sqlite3_open([dataBasePath UTF8String], &db)==SQLITE_OK){ NSString *insertSQL=@"insert into History(image,text,date) VALUES(?,?,?)"; if(sqlite3_prepare_v2(db,[insertSQL cStringUsingEncoding:NSUTF8StringEncoding], -1, &compiledStmt, NULL) == SQLITE_OK) { sqlite3_bind_blob(compiledStmt, 1, [data bytes], [data length], SQLITE_TRANSIENT); sqlite3_bind_text(compiledStmt, 2, [text UTF8String], -1, SQLITE_TRANSIENT); sqlite3_bind_text(compiledStmt, 3, [date UTF8String], -1, SQLITE_TRANSIENT); if(sqlite3_step(compiledStmt) != SQLITE_DONE ) { NSLog( @"Error: %s", sqlite3_errmsg(db) ); } else { NSLog( @"Insert into row id = %lld", (sqlite3_last_insert_rowid(db))); } sqlite3_finalize(compiledStmt); } } sqlite3_close(db); } -(UIImage *)giveMeImageWhereDateIs:(NSString *)date { [self checkAndCreateDB]; UIImage *imageIs; sqlite3_stmt *compiledStmt; sqlite3 *db; if(sqlite3_open([dataBasePath UTF8String], &db)==SQLITE_OK){ NSString *insertSQL = [NSString stringWithFormat:@"Select image from History Where date = '%@'",date]; if(sqlite3_prepare_v2(db,[insertSQL cStringUsingEncoding:NSUTF8StringEncoding], -1, &compiledStmt, NULL) == SQLITE_OK) { while(sqlite3_step(compiledStmt) == SQLITE_ROW) { int length = sqlite3_column_bytes(compiledStmt, 0); NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(compiledStmt, 0) length:length]; imageIs=[UIImage imageWithData:imageData]; NSLog(@"Length : %d", [imageData length]); } } sqlite3_finalize(compiledStmt); } sqlite3_close(db); return imageIs; } -(NSArray *)giveMeAllDataInTable { NSMutableArray *tableDataArray=[[NSMutableArray alloc]init]; [self checkAndCreateDB]; sqlite3_stmt *compiledStmt; sqlite3 *db; if(sqlite3_open([dataBasePath UTF8String], &db)==SQLITE_OK){ NSString *insertSQL = [NSString stringWithFormat:@"Select * from History"]; if(sqlite3_prepare_v2(db,[insertSQL cStringUsingEncoding:NSUTF8StringEncoding], -1, &compiledStmt, NULL) == SQLITE_OK) { while(sqlite3_step(compiledStmt) == SQLITE_ROW) { NSMutableDictionary *dict=[[NSMutableDictionary alloc]init]; // int length = sqlite3_column_bytes(compiledStmt, 0); // NSData *imageData = [NSData dataWithBytes:sqlite3_column_blob(compiledStmt, 0) length:length]; [dict setObject:[NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStmt, 1)] forKey:@"text"]; [dict setObject:[NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStmt, 2)] forKey:@"date"]; [tableDataArray addObject:dict]; } } sqlite3_finalize(compiledStmt); } sqlite3_close(db); return tableDataArray; } 

首先,我不能看到你已经初始化dbModelClass对象

其次,你的方法getData将返回包含你的sqlite数据的数组。 你没有在任何地方保存。

  - (void)viewDidLoad { [super viewDidLoad]; [dbModelClass connectDb]; 

编辑:tableData是您在类NetViewController中使用的NSArray

replace这一行

  [dbModelClass getData]; 

有了这个

 tableData = [dbModelClass getData]; NSLog(@"Content for tableData - %@ ",tableData); 

build议:使用第一个字母大写的类名