#iphone #objective-c
Вопрос:
как создать файл sqlite при запуске приложения (didFinishLaunchingWithOptions) тест, если он уже существует или нет, в противном случае создайте файл sqlite
Ответ №1:
Подобный этому… переменная sqlPath-это путь к предварительно созданной базе данных sql в вашем источнике ресурсов
- (void) checkAndCreateSQL
{
if (![[NSFileManager defaultManager] fileExistsAtPath:[documentPath stringByAppendingString:@"/database.sql"]]) {
[[NSFileManager defaultManager] createFileAtPath:[documentPath stringByAppendingString:@"/database.sql"]
contents:[NSData dataWithContentsOfFile:sqlPath]
attributes:nil];
}
}
ПРАВКА 1:
Вы можете создать базу данных на своем компьютере Mac с помощью этой командной строки :
sqlite3 database.sql < DATABASE_CREATION.txt
в DATABASE_CREATION.txt что-то вроде этого :
CREATE TABLE IF NOT EXISTS `group` (
`id` integer PRIMARY KEY,
`name` text,
`position` integer
);
Затем поместите файл database.sql непосредственно в ресурс вашего проекта. (как изображение)
Комментарии:
1. Но в этом случае вы предполагаете, что создаваемый файл уже присутствует, так как вы используете вызов
[NSData dataWithContentsOfFile:]
. Где это должноsqlPath
быть?2. Я думаю, что обработка баз данных, за исключением случаев, когда это требуется для выполнения строго определенных задач, должна осуществляться с использованием основных библиотек данных, поскольку для их использования вы не привязаны к конкретной реализации языка SQL и конкретным характеристикам базы данных.
3. О да, извини… Я перепутал имена 😉
Ответ №2:
Вероятно, вы захотите использовать библиотеки основных данных по умолчанию вместо ручного создания и обработки одного файла sqlite. Пожалуйста, ознакомьтесь с официальным руководством по программированию Apple Core Data. Он будет автоматически обрабатывать создание и обновление внутренней базы данных в приложении.
Комментарии:
1. Я согласен, что Основные данные должны в большинстве случаев использоваться API, но иногда вам нужна база данных с первичными и уникальными ключами, вы не можете просто работать с основными данными без проблем
2. Если основные данные не могут легко обрабатывать уникальные или первичные ключи … его бы там не было. Он просто использует подход, полностью независимый от SQL, как это происходит, например, в режиме гибернации.
Ответ №3:
sqlite3 *reference2Database() {
if (_database == nil) {
// First, test for existence.
NSError *error;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"my.sqlite"];
if ([fileManager fileExistsAtPath:writableDBPath] == NO) {
// Database file doesnt exists. Copy the database at writable path (documents directory).
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"my.sqlite"];
[fileManager removeItemAtPath:writableDBPath error:nil];
BOOL databaseCopied = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:amp;error];
if (!databaseCopied) {
// Handle the error...
}
}else {
// Open the database. The database was prepared outside the application.
if (sqlite3_open([writableDBPath UTF8String], amp;_database) != SQLITE_OK) {
// Even though the open failed, call close to properly clean up resources.
sqlite3_close(_database);
_database = nil;
// Additional error handling, as appropriate...
}
}
}
return _database;
}
// Пример использования.
-(void) someDatabaseFunction {
sqlite3 *database = reference2Database();
// Do something with "database"...
}
// Закройте базу данных. Это должно быть вызвано при завершении работы приложения.
void closeDatabase() {
if (_database == nil) return;
// Close the database.
if (sqlite3_close(_database) != SQLITE_OK) {
// Handle the error...
}
_database = nil;
}
ПРИМЕЧАНИЕ: В верхней части файла у вас должно быть: статический sqlite3 *_database = ноль;
Ответ №4:
Я использую Matteo Bertozzi SQLite Wrapper
для создания своей базы данных sqlite со следующим кодом:
-(void)checkDatabase
{
if([[NSFileManager defaultManager] fileExistsAtPath:DBPATH] == NO)
{
sqlite = [[Sqlite alloc] init];
if (![sqlite open:DBPATH]) return;
[sqlite executeNonQuery:@"DROP TABLE yourtable"];
[sqlite executeNonQuery:@"CREATE TABLE yourtable (record1 TEXT NOT NULL,
record2 TEXT NOT NULL,
record3 TEXT NOT NULL,
record4 TEXT NOT NULL);"];
NSArray *results = [sqlite executeQuery:@"SELECT * FROM yourtable;"];
for (NSDictionary *dictionary in results) {
for (NSString *key in [dictionary keyEnumerator])
NSLog(@" - %@ %@", key, [dictionary objectForKey:key]);
}
[results release];
[sqlite release];
}
}