Я только начал изучать 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
ли любая ошибка ползучесть между ними, я проверил это на мой лучший, но не смог найти любой синтаксически
ОК, во-первых, почему ваш контроллер представления не наследуется от 'UIViewController'? – trojanfoe
он делает..Я считаю, что его каркас по умолчанию включен ... любезно поправьте меня, если мое объяснение неверно. – uLYsseus
@trojanfoe: может быть, это потому, что у меня нет привилегии в этой системе, чтобы создать db..i mean write to диск ... если это так, как я могу установить местоположение для создания db в каком-то другом месте .. есть ли какой-либо параметр, который я могу изменить на Xcode ... – uLYsseus