0

我是IOS的初学者,我的数据库中有存款表和费用表我只想从存款表中检索存款金额和费用表中的费用金额到两个表格视图中,这意味着一个用于存款金额表格视图,另一个用于费用金额单个屏幕中的表格视图。下面是我的 dbmodelclass.h

#import <UIKit/UIKit.h>
#import <sqlite3.h>
@interface dbModelClass : UIViewController
{
    NSMutableDictionary *readDic;
    NSMutableArray *readArray;
}
+(NSString *)connectDb;
+(BOOL)createTable;
+(BOOL)createTable3;
+(int)saveData:(NSMutableArray *)data;
+(int)saveData2:(NSMutableArray *)data;
+(NSMutableArray *)getData;
@end

这是我的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];
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 WHERE deposit_amount";
    const char *query=[string UTF8String];
    if(sqlite3_prepare_v2(dbobj, query, -1, &statement, NULL)==SQLITE_OK)
    {
        while (sqlite3_step(statement)==SQLITE_ROW)
        {
    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:@"remarks"];
            //  [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

这是我的netviewcontroller.h

#import <UIKit/UIKit.h>

@interface NetViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>//DepositTable *depositCo
{
IBOutlet  UILabel *depositLabel,*expenseLabel,*netvalueLabel;
IBOutlet  UITextField *netvalueText;
IBOutlet UITableView *depositTable,*expenseTable;


}
@property (strong, nonatomic) UINavigationController *navigationController;
@property(strong,nonatomic)UILabel  *depositLabel,*expenseLabel,*netvalueLabel;
@property(strong,nonatomic)UITextField *netvalueText;
@property(strong,nonatomic)UITableView *depositTable,*expenseTable;



-(IBAction)netvalue:(id)sender;

@end

这是我的netviewcontroller.m

#import "NetViewController.h"
#import "dbModelClass.h"
@interface NetViewController ()

@end

@implementation NetViewController
@synthesize depositLabel,expenseLabel,netvalueLabel,depositTable,expenseTable,netvalueText;


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[dbModelClass connectDb];
[dbModelClass getData];
NSMutableArray *issuesArray = [[NSMutableArray alloc]init];  [dbModelClass financeappDB:@"SELECT * FROM  deposit" resultsArray:issuesArray];
NSLog(@"contents count:%d",[issuesArray count]);

}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(IBAction)netvalue:(id)sender
{

}
@end

请帮我

4

2 回答 2

0

您的问题有几种解决方案。

最好的解决方案实际上是最简单的。

具有两个嵌入式 tableViewControllers 的主视图控制器,每个显示和管理数据库中的一个表。

在 viewDidLoad 期间,您将创建每个 tableViewController 的实例,将其框架设置为位于主视图的所需坐标上,并将其添加到主视图中。

现在您可以为每个表创建一个干净简单的委托模型,并且如果您在主视图控制器中保留每个 tableViewController 的实例(分配为属性),您将能够从主视图与每个表进行通信。

更复杂的方法是将两个 tableView 添加到主视图 xib,将它们连接到主 viewController 中的数据源和委托方法,然后测试对委托方法的每次调用以确定哪个 tableView 调用了该方法。我已经做到了,但从长远来看,维护起来很痛苦。

于 2013-06-03T08:44:42.370 回答
0

你做得不好:)。

  1. 为什么要创建一个从 a 继承UIViewController来管理数据库的对象,您只需创建一个从NSObject.

  2. 在 getData 方法中,您只为存款表询问数据,您应该将参数(表名和金额)传递给您的方法,以了解您是否需要来自存款表或费用表的数据。

  3. 最后在 NetViewController 类中,您可以执行以下操作:

...

[dbModelClass connectDb];
NSArray *depositData =  [dbModelClass getDataWith....]; // here you fetch your database with deposit table and others param 

NSArray * expenseData = [dbModelClass getDataWith....]; // Here you fetch your database with expensive table and others param 

编辑答案:

例如,您可以这样做:

-(NSMutableArray *)getDataForTable:(NSString *)tableName withAmount:(NSString *)amountName
{
sqlite3 *dbobj;
NSString *dbpath  =[dbModelClass connectDb];
readArray=[[NSMutableArray alloc]init];
if(sqlite3_open([dbpath UTF8String], &dbobj)==SQLITE_OK)
{
    sqlite3_stmt *statement=nil;

    //**** NSString *string=@"SELECT name FROM emptable";

   NSString *string = [NSString stringWithFormat:@"SELECT *FROM %@ WHERE %@",tableName,amountName];

   const char *query=[string UTF8String];
    if(sqlite3_prepare_v2(dbobj, query, -1, &statement, NULL)==SQLITE_OK)
    {
        while (sqlite3_step(statement)==SQLITE_ROW)
        {
    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:@"remarks"];
            //  [readArray addObject:aName];
            // [readArray1 addObject:pwd];
            [readArray addObject:readDic];
            // NSLog(@"%@",readDic);
        }
    }
    sqlite3_finalize(statement);
}

将此添加
-(NSMutableArray *)getDataForTable:(NSString *)tableName withAmount:(NSString *)amountNamedbModelClass.h

现在您可以在 NetViewController 中通过传递表名和数量来调用此方法:

[dbModelClass connectDb];
NSArray * depositResult = [dbModelClass getDataWith:@"deposite" amountName:@"deposit_amount"];

// 通过传递适当的名称对另一个表执行相同的操作。

PS:此代码未经测试,您应该对其进行重构,它只是向您展示如何为方法传递参数

于 2013-06-03T08:42:16.173 回答