2017-08-09 9 views
0

sqlite 3でターミナルを使用して 'Mydatabase.db'という名前のデータベースを作成し、3つのカラム(name、email、food)を持つ 'entries'という名前のテーブルを作成しました。 私は私がのNSLog出力を使用して、データベースファイルのパスをチェックし、上記関数でsqliteデータベースからテーブルビューにデータをロードする

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
     // Override point for customization after application launch. 

     self.Peoples=[[NSMutableArray alloc]init ]; 
     self.databaseName = @"MyDatabase.db"; 
     NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentDir=[documentPaths objectAtIndex:0]; 
     self.databasePath=[documentDir stringByAppendingString:self.databaseName]; 

     [self CheckAndCreateDatabase]; 
     [self readDataFromDatabase]; 
     return YES; 
    } 

ファイルAppDelegate.mにデータベースとの接続のためのこのコードを使用する空の文字列です。 は、私は、データをフェッチするために、これらの機能を使用 -

(void)CheckAndCreateDatabase 
    { 
     bool success; 
     NSFileManager *fileManger=[NSFileManager defaultManager]; 
     success=[fileManger fileExistsAtPath:self.databasePath]; 
     if (success) 
      return; 
     NSString *databasePathFromApp=[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:self.databaseName]; 
     [fileManger copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil]; 

    } 

    -(void) readDataFromDatabase{ 
     [self.Peoples removeAllObjects ]; 
     sqlite3 *database; 
     if(sqlite3_open([self.databasePath UTF8String], & database) ==SQLITE_OK) 
     { 
      char *sqlStatement="select * from entries"; 
      sqlite3_stmt *compiledStatement; 
      if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement,NULL)==SQLITE_OK) { 
       while (sqlite3_step(compiledStatement)==SQLITE_ROW) { 
        char *n=sqlite3_column_text(compiledStatement, 1); 
        char *e=sqlite3_column_text(compiledStatement, 2); 
        char *f=sqlite3_column_text(compiledStatement, 3); 
        NSString *name=[NSString stringWithUTF8String:n]; 
        NSString *email=[NSString stringWithUTF8String:e]; 
        NSString *food=[NSString stringWithUTF8String:f]; 
        NSLog(@"Name= %@",name); 
        Data *data =[[Data alloc] initWithData:name theEmail:email TheFood:food]; 
        [self.Peoples addObject:data]; 
       } 
      } 
      sqlite3_finalize(compiledStatement); 
     } 
     sqlite3_close(database); 
    } 

次にTableViewController.miに、私はテーブルビューにデータを表示することができますどのように

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    NSString *cellIdentifier = @"Cell"; 
    SiteCell *cell=(SiteCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell=nil) { 
     cell=[[SiteCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier ]; 
    } 
    NSInteger row=indexPath.row; 
    Data *d=[mainDelegate.Peoples objectAtIndex:row]; 
    cell.primaryLabal.text=d.name; 
    cell.secondaryLabal.text=d.email; 
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; 
    return cell; 

} 

「データ」オブジェクトを使用して取得したデータを表示していますデータベースから?私はtableviewの理由でデータベースの接続が確立されていないことが表示されていませんか?私はそれを修正し、希望の出力を取得しますか?このリンクからサンプルコードをダウンロードできますか?https://drive.google.com/file/d/0B5pNDpbvZ8SnQkFySHkwZm9nR1k/view?usp=sharing

+0

最新のデータをリフレッシュする必要があります。この行の後に 'reload data'を使用してください。 –

答えて

0

あなたのデータが正しく収集されていますが、テーブルを更新するのを忘れてしまったようです。 [self.yourTableView reloadData]を使用します。

あなただけDBOperation.mファイルにデータベース名を変更する必要が

https://github.com/prashantbelani/DBOperation

簡単かつ小型のライブラリーでは、このリポジトリを使用し

Data *data =[[Data alloc] initWithData:name theEmail:email TheFood:food]; 
       [self.Peoples addObject:data]; 
      } 
      [self.yourTableView reloadData]; 
+0

@frincitこれは空ではなく、documentPathsを取得するのに間違っています。 NSLog(@ "Path =%@"、documentPaths)を使用する必要があります。編集した質問を確認してください。 –

+0

データ* data = [[データ割り当て] initWithData:名前theEmail:email TheFood:food]; [self.Peoples addObject:data]; - >この行はAppDelegate.mのこの関数 'readDataFromDatabase'に属しています。私はAppDelegate.mファイルでTableViewを使用していません。 –

+0

NSLog(@ "Name =%@"、name); 'readDataFromDatabase'関数が表示されない.infect接続が確立されていないため、これらの条件はコンパイルされません - > if(sqlite3_prepare_v2(database、sqlStatement、-1、&compiledStatement、NULL)== SQLITE_OK){ while(sqlite3_step(compiledStatement )== SQLITE_ROW){ –

-1

この行のafer。

E/g。 databaseName = @ "Emoji_app.rdb";

とDBFunctionであなたがselectDataでデータを取得するメソッドを記述し、は、ExecuteSQL でクエリを実行できるファイルは、これはあなたを助けることを願っています。

関連する問題