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

时间:2013-06-05 10:25:17

标签: ios iphone objective-c sqlite

我有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.
        // e.g. 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

2 个答案:

答案 0 :(得分:3)

首先,阅读this教程中的NSArray

然后阅读this教程中的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;
}

答案 1 :(得分:0)

首先,我无法看到你初始化dbModelClass对象

的位置

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

 - (void)viewDidLoad
    {

    [super viewDidLoad];

    [dbModelClass connectDb];      

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

替换此行

 [dbModelClass getData];        

有了这个

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

建议:对类名称使用第一个字母大写