2012-01-19 7 views
1

こんにちはを示し、私はSearchBarDBクラスにStudentDbwithsearchbarViewControllerクラスから配列を取得しようとしていますが、結果として得られる配列は、それがnullArrayを与えている任意のデータを持っていません。これで私を助けてください。事前に
感謝の潜在的な問題の配列に一つのクラスから配列をコピーしようとしているが、コピーされた配列がnull

#import <UIKit/UIKit.h> 
@interface StudentDbwithsearchbarViewController : UIViewController<UITableViewDelegate,UITableViewDataSource> { 
IBOutlet UITextField *txtMarks,*txtSname; 
IBOutlet UITableView *tableStudents; 
NSMutableArray *arrStudents; 

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

-(IBAction)saveStudentDetails; 
-(IBAction)gotoSearchpage; 
@end 

@implementation StudentDbwithsearchbarViewController 
@synthesize arrStudents; 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    arrStudents = [[DbStudent getStudentRecords]retain]; 
    NSLog(@"%@",arrStudents); 
    NSLog(@"%d",[arrStudents retainCount]); 
} 

#import "DbStudent.h" 
+(NSMutableArray*)getStudentRecords{ 

    NSArray *arrDocPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *strDestPath = [NSString stringWithFormat:@"%@/Student5.sqlite",[arrDocPath objectAtIndex:0]]; 
    NSMutableArray *arrStudents = [[NSMutableArray alloc]init]; 
    sqlite3 *db; 
    if(sqlite3_open([strDestPath UTF8String], &db)==SQLITE_OK) 
    { 

     NSString *query = @"SELECT * FROM Student"; 
     void* v; 
     char* err_msg; 
     sqlite3_stmt *studentStmt; 
     if(sqlite3_prepare_v2(db, [query UTF8String], -1, &studentStmt, &err_msg)==SQLITE_OK) 
     { 
      while (sqlite3_step(studentStmt)==SQLITE_ROW) { 

       int sno = sqlite3_column_int(studentStmt, 0); 
       NSString *sname = [NSString stringWithUTF8String: sqlite3_column_text(studentStmt, 1)]; 
       float marks = sqlite3_column_double(studentStmt, 2); 

       Student *st = [[Student alloc]init]; 
       st.Sno = sno; 
       st.Sname = sname; 
       st.marks = marks; 
       [arrStudents addObject:st]; 
      } 

     } 

    } 
    return arrStudents; 


} 

#import "SearchBarDB.h" 
#import"StudentDbwithsearchbarViewController.h" 

- (void)viewDidLoad { 

    [super viewDidLoad]; 
    StudentDbwithsearchbarViewController *sbd = [[StudentDbwithsearchbarViewController alloc]init]; 
    NSLog(@"%d",[sbd.arrStudents retainCount]); 
    NSLog(@"%@",sbd.arrStudents); 

// arrstudentBase = [sbd.arrStudents copy]; 
    arrMatchedString = [[NSMutableArray alloc]init]; 
} 
+0

初心者のこの問題の通常の原因は、オブジェクトの理解ではありません。あるオブジェクトに値を設定すると、同じクラスの別々に作成された別のオブジェクトに魔法のように表示されることはありません。 –

+0

(あなたのケースでは少し違って見える - 設定する前に 'arrStudents'を参照しています。値を設定して参照する場所にNSLogステートメントを置き、出てくる順序を観察して、 ) –

答えて

1

多く、あなたが試したものに、またはどのようにあなたはそれが失敗したと判断してきたような手がかりのない決定的な答え。

  • のメソッドには、getという接頭辞を使用しないでください。ちょうどそれをstudentRecordsまたはfetchStudentRecords

  • あなたのメモリ管理コードはどこにでもあります。少なくともあなたはその配列を漏らしているでしょう。

  • retainCountは役に立たないので、電話しないでください。

  • 生のSQLを書くことは時間の無駄です。データベースが存在しないか、クエリが失敗します。少なくとも、いっそのこと、失敗のCoreData

に最高の推測を移動したり、FMDBのようなラッパーを使用します。クエリコードを踏んだことはありますか?

+0

'retainCount'は、時折、ストレージバグを見つけるのに便利ですが、最初はやっていることが分かっている場合にのみ便利です。かなりスマートな人々の多くはまだ生のSQLを書いています。 –

+0

スマートな人々は、しばしばホイールを再発明するのが好きです(私は確かにそうすることが知られています)が、ホイールを再発明してもそれほど再発明されることはありません。 SQLは必須ですが、それほど多くはありません。 – bbum

+0

私は、賢明な人々は、脳細胞をSQLを行うための10の異なる方法を覚えていることに捧げるのが好きではないと考えています。 –

関連する問題