как создать sqlite

#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];
    }
}