#ios #objective-c #sqlite #xcode8
#iOS #objective-c #sqlite #xcode8
Вопрос:
Я новичок в разработке iOS. Я пытаюсь создать простое приложение для составления списка задач. Я использую xocde 8 и язык objective-C. Я попробовал несколько руководств, но не смог создать таблицу базы данных. Вот мой код.
-(void)createOrOpenDB{
printf("createOrOpenDB: into this function n");
NSArray *docsDir = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *dirPaths = [docsDir objectAtIndex:0];
dbPathString = [[NSString alloc] initWithString: [dirPaths stringByAppendingPathComponent:@"person.db"]];
NSFileManager *fileManager = [NSFileManager defaultManager];
char *err;
printf("createOrOpenDB: into this function before if statement n");
if(![fileManager fileExistsAtPath:dbPathString]){
const char *dbPath = [dbPathString UTF8String];
printf("createOrOpenDB: into this functions 1st if statement n");
//create db here
if(sqlite3_open(dbPath, amp;personDB) ==SQLITE_OK){
const char *sql_stnt = "CREATE TABLE IF NOT EXISTS PERSONS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER)";
if(sqlite3_exec(personDB, sql_stnt, NULL, NULL, amp;err) !=SQLITE_OK){
printf("Failed to create tablen");
}
sqlite3_close(personDB);
printf("createOrOpenDB: database table createdn");
}
}
}
когда я нажимаю кнопку добавления, она не выдает мне никакой ошибки. но он не добавляет никаких данных. NSLog не работает в xcode 8. поэтому вместо этого я сделал printf . и мой код прерывается перед операцией if . кто-нибудь может сказать мне, что я делаю не так?
Комментарии:
1. Это создает таблицу, если база данных не существует. Но что, если база данных существует, но таблицы там нет (например, возможно, у вас было более раннее исполнение, в котором не было этой
create table
логики)? Я бы заглянул в папку documents и посмотрел, есть ли там база данных или нет. Если есть, я бы удалил его и попробовал еще раз.2. правильно. моя таблица уже создана. но проблема в том, что когда я нажимаю кнопку добавления, она ничего не добавляет в базу данных.
Ответ №1:
сделайте так,
(DBManager*)getSharedInstance{
if (!sharedInstance) {
sharedInstance = [[super allocWithZone:NULL]init];
[sharedInstance createDB];
}
return sharedInstance;
}
-(BOOL)createDB{
NSString *docsDir;
NSArray *dirPaths;
// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = dirPaths[0];
// Build the path to the database file
databasePath = [[NSString alloc] initWithString:
[docsDir stringByAppendingPathComponent: @"student.db"]];
BOOL isSuccess = YES;
NSFileManager *filemgr = [NSFileManager defaultManager];
if ([filemgr fileExistsAtPath: databasePath ] == YES)
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, amp;database) == SQLITE_OK)
{
char *errMsg;
const char *sql_stmt = "create table if not exists studentsDetail (regno integer primary key, name text, department text, year text)";
if (sqlite3_exec(database, sql_stmt, NULL, NULL, amp;errMsg)
!= SQLITE_OK)
{
isSuccess = NO;
NSLog(@"Failed to create table");
}
else
{
NSLog(@"Table Created Successfully");
}
sqlite3_close(database);
return isSuccess;
}
else {
isSuccess = NO;
NSLog(@"Failed to open/create database");
}
sqlite3_finalize(statement);
}
return isSuccess;
// NSLog(@"database %@", isSuccess);
}
Для сохранения данных в этой таблице,
- (BOOL) saveData:(NSString*)registerNumber name:(NSString*)name
department:(NSString*)department year:(NSString*)year;
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, amp;database) == SQLITE_OK)
{
NSString *insertSQL = [NSString stringWithFormat:@"insert into studentsDetail (regno,name, department, year) values ("%ld","%@", "%@", "%@")",(long)[registerNumber integerValue], name, department, year];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(database, insert_stmt,-1, amp;statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
return YES;
}
else {
return NO;
}
sqlite3_reset(statement);
}
return NO;
}
Он будет создавать таблицу каждый раз, когда таблица не существует.
Надеюсь, t вам поможет.
Комментарии:
1. Я думаю, что это наоборот. Цель этой процедуры — создать базу данных и таблицу, если она не существует. Если там нет базы данных, это не создаст ее…
2. Кроме того,
sqlite3_finalize
здесь не место. Вы делаете это только в том случае, если подготовили инструкцию, которой у вас здесь нет…3. спасибо за ответ. но моя таблица базы данных уже создана. но когда я нажимаю кнопку добавить, она не добавляет информацию в таблицу базы данных.
4. не могли бы вы рассказать, как я могу добавить данные в эту таблицу?
5. @Droppy bro проверьте этот код и мой. Я реализовал этот код из одного руководства в своем проекте, поэтому его код не копируется. Выполните поиск в Интернете, и вы найдете этот код в одном из учебников, доступных в Интернете. Этот код в моем проекте. И цель состоит в том, чтобы решить проблему