我刚刚开始学习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
之间是否有任何错误蔓延,我检查到了最好,但无法找到任何语法
答案 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(语句)。
第三,在输入方法时打开数据库,但在退出之前不要再关闭它。