2013-06-22 2 views
0

Я только начал изучать SQLite, взаимодействуя с приложением iPhone, и я застреваю не с ошибкой, но я не могу вставить значения в БД, используя следующий код.iphone app SQLite Database заполнить сбой

Я не мог понять, где ошибка ползла здесь. Чтобы увидеть вставку, у меня есть NSlogged строка, отображаемая в отладчике, но код не доходит до нее, не могли бы вы любезно помочь мне с этим.

Я пробовал смотреть на другие сообщения, но я не мог получить много от них, я вижу, что мой синтаксис и утверждения верны, и, увидев конкретный пост на SO, я понял, что совершил ошибку в какой-то части, а затем исправил ее.

Но все же его не работает. Я работаю над системой, находящейся в университете, и я не могу получить доступ к файлам на диске, независимо от того, набирает ли я db, заполняется или даже создается .. есть что-то с настройкой привилегий для создания db. (я действительно подозреваю, что), если да, то как я могу создать db в другом месте в файловой системе для доступа или что-то не так в приведенном ниже коде, если вам нужны какие-либо другие файлы, любезно сделайте комментарий, чтобы я мог разместить их здесь ...

vc.m

#import "ViewController.h" 

@interface ViewController() 
{ 
NSMutableArray *arrayOfPerson; 
sqlite3 *personDB; 
NSString *dbPathString; 

} 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
arrayOfPerson = [[NSMutableArray alloc]init]; 
[[self myTableView]setDelegate:self]; 
[[self myTableView]setDataSource:self]; 
[self createOrOpenDB]; 
} 

-(void)createOrOpenDB{ 

NSArray *path=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *docPath=[path objectAtIndex:0]; 

dbPathString = [docPath stringByAppendingPathComponent:@"persons.db"]; 

char *error; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
if (![fileManager fileExistsAtPath:dbPathString]) { 

    const char *dbPath=[dbPathString UTF8String]; 

    //creating DB 
    if (sqlite3_open(dbPath, &personDB)==SQLITE_OK) { 
     const char *sql_stmt="CREATE TABLE IF NOT EXISTS PERSONS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT,AGE INTEGER"; 
     sqlite3_exec(personDB, sql_stmt, NULL, NULL, &error); 
     NSLog(@"Created !"); 
     sqlite3_close(personDB); 
    } 

} 


- (void)didReceiveMemoryWarning 
{ 
[super didReceiveMemoryWarning]; 

} 

- (IBAction)addPersonButton:(id)sender { 
char *error; 
if (sqlite3_open([dbPathString UTF8String], &personDB)==SQLITE_OK) { 
    NSString *insertStmt = [NSString stringWithFormat:@"INSERT INTO PERSONS(NAME,AGE) VALUES   ('%s','%d')",[self.nameField.text UTF8String],[self.ageField.text intValue]]; 
    const char *insert_stmt = [insertStmt UTF8String]; 

    if (sqlite3_exec(personDB, insert_stmt, NULL 
        , NULL, &error)==SQLITE_OK) { 
     NSLog(@"Person Added"); 

     Person *person = [[Person alloc]init]; 

     [person setName:self.nameField.text]; 
     [person setAge:[self.ageField.text intValue]]; 

     [arrayOfPerson addObject:person]; 


    } 

    sqlite3_close(personDB); 
} 

} 

- (IBAction)displayPersonButton:(id)sender { 
sqlite3_stmt *statement; 
if(sqlite3_open([dbPathString UTF8String], &personDB)==SQLITE_OK){ 
    [arrayOfPerson removeAllObjects]; 
    NSString *querySql=[NSString stringWithFormat:@"SELECT *FROM PERSONS"]; 
    const char *query_sql=[querySql UTF8String]; 
    if(sqlite3_prepare(personDB, query_sql, -1, &statement, NULL)==SQLITE_OK){ 
     while(sqlite3_step(statement)==SQLITE_ROW){ 
      NSString *name=[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement,1)]; 
      NSString *ageString=[[NSString alloc]initWithUTF8String:(const char*)sqlite3_column_text(statement, 2)];//used sqlite3_column_int here before ! Mistake 
      Person *person = [[Person alloc] init]; 

      [person setName:name]; 

      [person setAge:[ageString intValue]]; 
      [arrayOfPerson addObject:person]; 

     } 
    } 
} 
[[self myTableView] reloadData]; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
[super touchesBegan:touches withEvent:event]; 
[[self ageField]resignFirstResponder ]; 
[[self nameField]resignFirstResponder];} 
- (IBAction)deletePersonButton:(id)sender { 
} 
@end 

vc.h

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

@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate> 
@property (weak, nonatomic) IBOutlet UITextField *nameField; 
@property (weak, nonatomic) IBOutlet UITextField *ageField; 
@property (weak, nonatomic) IBOutlet UITableView *myTableView; 
- (IBAction)addPersonButton:(id)sender; 
- (IBAction)displayPersonButton:(id)sender; 
- (IBAction)deletePersonButton:(id)sender; 
@end 

ли любая ошибка ползучесть между ними, я проверил это на мой лучший, но не смог найти любой синтаксически

+0

ОК, во-первых, почему ваш контроллер представления не наследуется от 'UIViewController'? – trojanfoe

+0

он делает..Я считаю, что его каркас по умолчанию включен ... любезно поправьте меня, если мое объяснение неверно. – uLYsseus

+0

@trojanfoe: может быть, это потому, что у меня нет привилегии в этой системе, чтобы создать db..i mean write to диск ... если это так, как я могу установить местоположение для создания db в каком-то другом месте .. есть ли какой-либо параметр, который я могу изменить на Xcode ... – uLYsseus

ответ

1

Отсутствует закрывающая скобка на CREATE TABLE.

const char *sql_stmt="CREATE TABLE IF NOT EXISTS PERSONS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT,AGE INTEGER"; 

Вам также не нужно обернуть целочисленный параметр в одинарные кавычки, либо это заявление:

NSString *insertStmt = [NSString stringWithFormat:@"INSERT INTO PERSONS(NAME,AGE) VALUES   ('%s','%d')",[self.nameField.text UTF8String],[self.ageField.text intValue]]; 

Попробуйте добавить этот код после того, как тело вашей попытки вставки, чтобы увидеть, если SQLite даст больше информации о возможной ошибке.

if (sqlite3_exec(personDB, insert_stmt, NULL 
       , NULL, &error)==SQLITE_OK) { 
    NSLog(@"Person Added"); 

    Person *person = [[Person alloc]init]; 

    [person setName:self.nameField.text]; 
    [person setAge:[self.ageField.text intValue]]; 

    [arrayOfPerson addObject:person]; 


} 
else  // Add this in the hope it will shed more light on the problem. 
{ 
    NSLog(@"Error: %s", sqlite3_errmsg(personDB)); 
} 

Просто заметил также, что у вас есть несколько вопросов, в вашем - (IBAction) displayPersonButton: метод.

Во-первых, у вас нет места между * FROM. И в идеале вы должны указать столбцы, которые вы хотите выбрать, а не использовать *.

Во-вторых, у вас нет sqlite3_finalize (statement).

В-третьих, вы открываете базу данных при входе в метод, но не закрываете его перед выходом.

+0

исправил это, но не помог: (.... – uLYsseus

+0

ok будет помещать это сейчас ... – uLYsseus

+0

Вы изучили содержимое ошибки char *, чтобы увидеть какая ошибка sqlite сообщает после того, как вы попытаетесь выполнить инструкцию? –