iphone app SQLite数据库填充失败

时间:2013-06-22 08:21:14

标签: iphone objective-c sqlite

我刚刚开始学习SQLite与iPhone应用程序接口,但我没有遇到错误,但我无法使用以下代码将值插入数据库。

我无法弄清楚错误在这里蔓延的位置,要查看插入内容我有一个字符串要在调试器中显示,但代码不会到达那里,你能不能帮我解决这个问题。

我试着查看其他帖子,但我无法从中得到很多,我看到我的语法和语句是正确的,在看到SO上的特定帖子后,我意识到我在某个部分犯了一个错误然后纠正了它。 / p>

但它仍然不起作用。我正在大学拥有的系统上工作,我无法访问mac磁盘文件是否看到我的数据库正在填充甚至创建..是否有设置创建数据库的权限。 (我真的很怀疑),如果是这样的话我怎么能在文件系统的其他地方创建一个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

之间是否有任何错误蔓延,我检查到了最好,但无法找到任何语法

1 个答案:

答案 0 :(得分: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(语句)。

第三,在输入方法时打开数据库,但在退出之前不要再关闭它。