Создание файла базы данных SQLite3 через Objective-C

Я пытаюсь создать файл базы данных SQLite3 через Objective-C во время выполнения. Я пытаюсь создать таблицу под названием «tblStore». Я хочу, чтобы имена полей назывались «strStoreNumber» и «strStoreReg». Я новичок в iOS и SQLite, поэтому мне сложно найти синтаксис для этого. В дополнение к созданию таблицы я хочу, чтобы созданная таблица не содержала NOT в наборе приложений, а скорее оставалась / хранилась где-то на телефоне. Стол должен быть доступен для чтения / записи. Я проделал некоторое чтение на «песочнице пользователя», а также в «каталоге документов». Я не уверен, что понимаю разницу между ними. В идеале, мое приложение будет использовать кнопку для ввода ввода из текстовых полей. После ввода текста в поля тексты будут проверяться, существует ли таблица SQLite «tblStore», а если нет, таблица будет создана.

Напомним: 1. Каков синтаксис для Obj-C / SQLite для создания таблицы с названием «tblStore» с полями «strStoreNumber» и «strStoreReg»? 2. Где должен находиться файл db? Мне нужно прочитать и записать в db-файл tblStore. 3. В чем разница между «песочницей пользователя» и «каталогом документов»?

Это то, что у меня есть сейчас:

-(IBAction)setInput:(id)sender { NSString *strStoreNumber; NSString *strRegNumber; NSString *tableName = @"tblStore"; NSString *dbStrStore = @"strStore"; NSString *dbStrReg = @"strReg"; strStoreNumber = StoreNumber.text; strRegNumber = RegNumber.text; NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString* documentsDirectory = [paths lastObject]; NSString* databasePath = [documentsDirectory stringByAppendingPathComponent:@"tblStore.sqlite"]; // NSString* databasePath = [[NSBundle mainBundle] pathForResource:@"tblStore" ofType:@"sqlite"]; if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { NSLog(@"Opened sqlite database at %@", databasePath); char *err; NSString *sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' TEXT PRIMARY KEY, '%@' TEXT);", tableName, dbStrStore, dbStrReg]; if (sqlite3_exec(database, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) { sqlite3_close(database); NSAssert(0, @"Table failed to create."); } //...stuff } else { NSLog(@"Failed to open database at %@ with error %s", databasePath, sqlite3_errmsg(database)); sqlite3_close (database); } NSString *querystring; // create your statement querystring = [NSString stringWithFormat:@"SELECT strStore, strReg FROM tblStore WHERE strStore = %@ AND strReg = %@;", strStoreNumber, strRegNumber]; const char *sql = [querystring UTF8String]; NSString *szStore = nil; NSString *szReg = nil; sqlite3_stmt *statement = nil; if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL)!=SQLITE_OK) //queryString = Statement { NSLog(@"sql problem occured with: %s", sql); NSLog(@"%s", sqlite3_errmsg(database)); } else { // you could handle multiple rows here while (sqlite3_step(statement) == SQLITE_ROW) { szStore = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)]; szReg = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)]; } } sqlite3_finalize(statement); lblStoreNumber.text = szStore; lblRegNumber.text = szReg; } 

Когда я запускаю свое приложение, я получаю следующие ошибки:

 2012-05-10 14:58:38.169 CCoDBTry[355:f803] Opened sqlite database at /Users/Matt****/Library/Application Support/iPhone Simulator/5.1/Applications/5DB7A218-A0F6- 485F-B366-91FD2F9BC062/Documents/tblStore.sqlite 2012-05-10 14:58:38.307 CCoDBTry[355:f803] sql problem occured with: SELECT strStore, strReg FROM tblStore WHERE strStore = 8053 AND strReg = 4; 2012-05-10 14:58:38.308 CCoDBTry[355:f803] no such column: strStore 

Я ценю любого, кто берет время, чтобы объяснить некоторые из этих вещей, так как я очень новичок и не увенчался успехом в выполнении некоторых из вещей, которые я пробовал. Большое спасибо за помощь!

6 Solutions collect form web for “Создание файла базы данных SQLite3 через Objective-C”

sqlite – это боль, если вы не знаете, что делаете. У меня также были некоторые проблемы с функциями sqlite c, но затем я решил использовать обертку sqlite.

FMDB и BWDB являются хорошими и простыми в использовании оболочками sqlite для объективных c. Я предлагаю вам использовать один из них.

Обратите внимание, что BWDB находится в учебнике lynda.com ( этот ), и если вы не найдете его в Интернете … оставьте комментарий, и я его выгружу.

edit: единственное место, где вы можете писать материал в своем приложении, находится в каталоге ваших документов … так что простые выражения … если db не находится в каталоге ваших документов .. это только чтение … также … вы читаете / записываете на свой db .. ОС копирует db в каталог документов .. и делает все чтение и запись там, чтобы вы могли иметь db в своем приложении, но вы не можете редактировать этот … так что у вас будет 2 дБ. У меня была такая же проблема. Я исправил ее, объединив 2 дБ, когда обновил приложение

edit2: я загрузил окончательный проект BWDB (у вас есть ваша обложка и проект, чтобы увидеть, как он работает)

// Создать БД

 -(NSString *) filePath { NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDirectory=[paths objectAtIndex:0]; return [documentDirectory stringByAppendingPathComponent:@"LoginDatabase.sql"]; } 

// Открыть БД

 -(void)openDB { if(sqlite3_open([[self filePath]UTF8String], &db) !=SQLITE_OK) { sqlite3_close(db); NSAssert(0, @"Database failed to Open"); } } 

// Создать таблицу

 -(void) createTableNamed:(NSString*)tableName withField1:(NSString*) field1 withField2:(NSString*) field2 { char *err; NSString *sql=[NSString stringWithFormat:@" CREATE TABLE IF NOT EXISTS '%@'('%@' TEXT PRIMARY KEY,'%@' TEXT);",tableName,field1,field2]; if(sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) !=SQLITE_OK) { sqlite3_close(db); NSAssert(0, @"Table failed to create"); } } 

// Вставка записей

 -(void)insertrecordIntoTable:(NSString*) tableName withField1:(NSString*) field1 field1Value:(NSString*)field1Vaue andField2:(NSString*)field2 field2Value:(NSString*)field2Value { NSString *sqlStr=[NSString stringWithFormat:@"INSERT INTO '%@'('%@','%@')VALUES(?,?)",tableName,field1,field2]; const char *sql=[sqlStr UTF8String]; sqlite3_stmt *statement1; if(sqlite3_prepare_v2(db, sql, -1, &statement1, nil)==SQLITE_OK) { sqlite3_bind_text(statement1, 1, [field1Vaue UTF8String], -1, nil); sqlite3_bind_text(statement1, 2, [field2Value UTF8String], -1, nil); } if(sqlite3_step(statement1) !=SQLITE_DONE) NSAssert(0, @"Error upadating table"); sqlite3_finalize(statement1); } 

// Получение данных из таблицы

 -(void)getAllRowsFromTableNamed:(NSString *)tableName { NSString *field1Str,*field2Str; NSString *qsql=[NSString stringWithFormat:@"SELECT * FROM %@",tableName]; sqlite3_stmt *statement; if(sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil)==SQLITE_OK) { while(sqlite3_step(statement) ==SQLITE_ROW) { char *field1=(char *) sqlite3_column_text(statement, 0); char *field2=(char *) sqlite3_column_text(statement, 1); field1Str=[[NSString alloc]initWithUTF8String:field1]; field2Str=[[NSString alloc] initWithUTF8String:field2]; NSString *str=[NSString stringWithFormat:@"%@ - %@",field1Str,field2Str]; NSLog(@"%@",str); } } 

}

В viewDidLoad вызывают методы

 - (void)viewDidLoad { [self openDB]; [self createTableNamed:@"Login" withField1:@"USERNAME" withField2:@"PASSWORD"]; [self insertrecordIntoTable:@"Login" withField1:@"USERNAME" field1Value:username andField2:@"PASSWORD" field2Value:password]; } 

Где имя пользователя и пароль – значения NSString;

Вы можете использовать следующий код для создания базы данных, созданной в папке «Документы». Просто передайте путь в папке с документами, и функция скопирует базу данных sqlite в папке Documents по заданному пути, если это необходимо. Затем вы можете использовать этот путь для создания и запроса таблиц базы данных.

 + (NSString*) createDatabaseIfRequiredAtPath:(NSString*)databasePath { if (databasePath == nil) return nil; NSString *path = [NSString stringWithFormat:@"%@/%@", databasePath, kMainDBName]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSError *error = nil; if ([fileManager fileExistsAtPath:path] == NO) { // The writable database does not exist, so copy the default to the appropriate location. NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:kMainDBName ofType:nil]; BOOL success = [fileManager copyItemAtPath:defaultDBPath toPath:path error:&error]; if (!success) { NSCAssert1(0, @"Failed to create writable database file with message '%@'.", [ error localizedDescription]); return nil; } } return path; 

Есть ли конкретная причина, по которой вы хотели бы использовать SQLLite напрямую, в отличие от использования CoreData? CoreData использует базу данных SQLLite, но сам по себе является API более высокого уровня, и особенно с табличными представлениями и т. Д., Вы получаете множество функциональных возможностей и методов шаблонов, которые уже настроены для него в Xcode. Определение моделей данных тривиально, вы получаете тонны кода шаблонов, и все это оптимизировано.

http://www.raywenderlich.com/934/core-data-on-ios-5-tutorial-getting-started

CoreData иногда описывается как крутая кривая обучения. Я не согласен. Если вы планируете самостоятельно писать SQL в своем приложении, у вас не будет проблем с CoreData.

Термин «песочница» является абстрактным термином для части файловой системы устройства, к которой ваше приложение имеет доступ для чтения / записи. Каталог «Документы» представляет собой конкретный каталог в изолированной программной среде вашего приложения. В вашей песочнице есть другие файлы, а не только каталог документов, но большинство приложений, которые сохраняют данные в файловой системе в iOS, делают это в каталоге документов.

вы можете открыть терминал и компакт-диск в / Users / Matt * * / Library / Application Support / iPhone Simulator / 5.1 / Applications / 5DB7A218-A0F6-485F-B366-91FD2F9BC062 / Documents /

затем sqlite3 tblStore.sqlite

затем используйте .schema tblStore должен показать вашу схему таблицы, и вы можете увидеть, была ли она построена правильно.

Ваша база данных должна находиться в каталоге документов для доступа к записи. Если ваша база данных будет только прочитана, она никогда не будет написана в вашем приложении. Один из способов сделать это – создать файл database.sqlite и добавить его в комплект и скопировать в каталог документов (если он еще не существует) при запуске.

возможно, вы забыли Табличные вставки. Созданная база данных и таблица, но ее пустая таблица. вы пытаетесь прочитать записи из таблицы, которая пуста.

  • Ошибка sqlite make statement - нет такой таблицы
  • Проблема с ObjectiveC sqlite3
  • отладка заблокированной базы данных sqlite3
  • Копирование таблицы в один бит на другой db
  • Вопрос о SQLite3 и обновлении приложения для iPhone
  • Восстановить имена таблиц из базы данных sqlite в объекте-c
  • как добавить столбец в таблице sqlite в SWIFT
  • Как добавить и выполнить .sql-файлы в моем проекте iOS?
  • va_args () вызывает EXC_BAD_ACCESS
  • Включение foreign_keys = ON в sqlite3 с помощью кода
  • «база данных заблокирована» в sqlite в iPhone
  • Interesting Posts

    Разница между Keychain и NSUserDefault?

    iOS CloudKit Извлечение активов перестает работать

    Длительная проблема распознавания жестов нажатия

    Как перестать повторять загрузку изображений в моем представлении таблицы?

    Swift – NSMutableAttributedString изменяет весь текст в UITextView

    OCR Tesseract устанавливает только номера

    Основы Multitouch (3 или более пальцев)

    Jazzy работает не так, как ожидалось, для создания быстрой документации

    Как я могу показать alertview с индикатором активности?

    Как реализовать countByEnumeratingWithState: objects: count: для класса, который внутренне использует NSMutableArray

    Установка NSDateComponents приводит к неправильному NSDate

    Издевательские объекты с автоматизацией пользовательского интерфейса Xcode 7

    Автоматически использует ли функция «Архив» Xcode «Конфигурация сборки»?

    Пользовательский чертеж UITextField при редактировании

    Ad Hoc для бета-тестирования xcode 4.3

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.