将SQlite3连接到UITextview

时间:2012-02-29 12:50:30

标签: iphone ios ipad

我正在做一个iPad应用程序,我将在同一个屏幕上有UITabelview和Button和UiTextview。我的任务是,如果我在UITableview中选择一行并按下按钮,则文本必须出现在UITextview上。

我填写了一些方法,但它没有用,任何人都可以让我知道我能做些什么来成功完成这项任务。

请在下面找到我的代码供您参考......它可以帮助您解释我的问题。

#import <UIKit/UIKit.h>
#import "table1.h"
#import "textView.h"


@interface searchOne : UIViewController

{
    IBOutlet UITableView *firstTable;
    table1 *tableOne;
    textView * text1;
    int row;
}
@property(nonatomic,retain)IBOutlet UIButton * search;
@property (nonatomic,retain) IBOutlet UITextView *txt;
@property(nonatomic, assign) int row;

-(IBAction)resPage:(id)sender;
@end
#import "searchOne.h"
#import "textView.h"

@implementation searchOne
@synthesize search;
@synthesize txt, row;


- (void)viewDidLoad {
    [super viewDidLoad];
    if (tableOne == nil) {
        tableOne = [[table1 alloc] init];
    }

    [firstTable setDataSource:tableOne];

    tableOne.view = tableOne.tableView;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{   

    row = [indexPath row];


}   
-(IBAction)resPage:(id)sender{

    NSString *str = txt.text;
    row  = [str intValue];   
    NSLog(@"get clicked");
    self.view =txt;

}

/*
 // Override to allow orientations other than the default portrait orientation.
 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 // Return YES for supported orientations
 return (interfaceOrientation == UIInterfaceOrientationPortrait);
 }
 */

- (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.
}



- (void)viewDidUnload {
// [self setTxt:nil];
[super viewDidUnload];
                         }
@end

DB:

#import <Foundation/Foundation.h>

@interface db : NSObject{
    NSInteger ID;
    NSString * name;
}


@property (nonatomic, retain) NSString * name;
@property(nonatomic, readwrite) NSInteger ID;



-(id)initWithID: (NSInteger)i andName:(NSString *)n;

@end
@implementation db
@synthesize name,ID;

-(id)initWithID: (NSInteger)i andName:(NSString *)n{
    self=[super init];
    if(self)
    {
        self.ID = i;
        self.name = n;
    }
    return self;
}


@end

表格视图:

#import <UIKit/UIKit.h>
#import "sqlite3.h"
#import "db.h"

@interface table1 : UITableViewController<UITableViewDataSource>{
    NSString *databaseName;
    NSString * databasePath;
    NSMutableArray * tableOne;

}
@property(nonatomic, retain)  NSMutableArray * tableOne;


-(void)checkAndCreateDatabase;
-(void)readDataFromDatabase;


@end

#import "table1.h"
#import "db.h"

@implementation table1
@synthesize tableTwo;

#pragma mark - View lifecycle
- (void)viewDidLoad
{

    databaseName=@"nobel10.db";

    NSArray *documentPaths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentDir = [documentPaths objectAtIndex:0];
    databasePath=[documentDir stringByAppendingPathComponent:databaseName];
    [self checkAndCreateDatabase];
    [self readDataFromDatabase];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


#pragma mark - TableView Data Source methods
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [tableTwo count]; }

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell= nil;
    cell = [tableView dequeueReusableCellWithIdentifier:@"mycell"];
    if (cell == nil) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"mycell"];}

    db * temp =(db *)[self.tableTwo objectAtIndex:indexPath.row];
    cell.textLabel.text=temp.name;
    return cell;
}


-(void)checkAndCreateDatabase{
    BOOL success;
    NSFileManager *fileManager=[NSFileManager defaultManager];
    success=[fileManager fileExistsAtPath:databasePath];
    if(success)
        return;

    NSString *databasePathFromApp = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:databaseName];
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}
-(void)readDataFromDatabase{
    sqlite3 *database;
    tableTwo=[[NSMutableArray alloc]init];
    if(sqlite3_open([databasePath UTF8String], &database)== SQLITE_OK){
        const char *sqlStatement = "SELECT * FROM country";
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL)==SQLITE_OK){
            while (sqlite3_step(compiledStatement)==SQLITE_ROW) {
                NSInteger pId = sqlite3_column_int(compiledStatement, 0);
                NSString *stringName=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                db *info =[[db alloc]initWithID:pId andName:stringName];
                [tableTwo addObject:info];

            }            
        }
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);
}



@end

的UITextView:

#import <UIKit/UIKit.h>
#import "sqlite3.h"
#import "db.h"

@interface textView : UIViewController<UITextViewDelegate>{
    NSString *databaseName;
    NSString * databasePath;
    NSMutableArray *textOne;
   NSString *description;
}
@property(nonatomic, retain) NSMutableArray *textOne;
@property (nonatomic, retain) NSString *description;
-(void)checkAndCreateDatabase;
-(void)readDataFromDatabase;
-(id)initWithDescription:(NSString *)d;
@end

#import "textView.h"

@implementation textView
@synthesize textOne, description;;
#pragma mark - View lifecycle
- (void)viewDidLoad
{

    databaseName=@"nobel10.db";

    NSArray *documentPaths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString * documentDir = [documentPaths objectAtIndex:0];
    databasePath=[documentDir stringByAppendingPathComponent:databaseName];
    [self checkAndCreateDatabase];
    [self readDataFromDatabase];
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


#pragma mark - TableView Data Source methods


// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)


-(void)checkAndCreateDatabase{
    BOOL success;
    NSFileManager *fileManager=[NSFileManager defaultManager];
    success=[fileManager fileExistsAtPath:databasePath];
    if(success)
        return;

    NSString *databasePathFromApp = [[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:databaseName];
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}
-(void)readDataFromDatabase{
    sqlite3 *database;
    textOne=[[NSMutableArray alloc]init];
    if(sqlite3_open([databasePath UTF8String], &database)== SQLITE_OK){
        const char *sqlStatement = "SELECT name,item_country.id,text.item FROM country,item_country,text WHERE country.name ='India' AND country.id = item_country.id AND text.item =item_country.item ";
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL)==SQLITE_OK){
            while (sqlite3_step(compiledStatement)==SQLITE_ROW) {
                NSInteger pId = sqlite3_column_int(compiledStatement, 0);
                NSString *stringName=[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                db *info =[[db alloc]initWithID:pId andName:stringName];
                [textOne addObject:info];

            }            
        }
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);
}
-(id)initWithDescription:(NSString *)d{
self.description = d;
    return self;
}

@end

请帮助我,我是iPad开发的新手,并在这里发现..

2 个答案:

答案 0 :(得分:0)

我意识到这不是您提出的问题,但根据您的需求,您可能希望使用Core Data。它从你的.sqlite数据库中抽象出来,并在内存使用,建模对象和关系等方面做了一些很酷的事情。

答案 1 :(得分:0)

快速而肮脏的方法就是删除UITextView,并在选择行时将其重新添加。看看是否有效。