iPhoneアプリでSQLite: データベースの保存・読み込みを完全マスター

2024-06-09

iOSが提供するSQLiteのバージョン

各iOSバージョンで提供されるSQLiteのバージョンは以下の通りです。

  • iOS 5.1.1:SQLite 3.7.7
  • iOS 6.0 - iOS 7.1.2:SQLite 3.7.13

SQLiteのバージョンを確認する方法

以下の方法で、iOSデバイスで実行されているSQLiteのバージョンを確認できます。

  1. ターミナルアプリ(MobileTerminal、NewTerm、またはSSH経由)を開きます。
  2. sqlite3 -version と入力して実行します。

SQLiteの機能

iOSアプリケーションでSQLiteを使用する一般的な例としては、次のものがあります。

  • アプリケーション設定の保存
  • ユーザーデータの保存
  • オフラインでのデータアクセス
  • ゲームの進行状況の追跡
  • iOSデバイスでSQLiteデータベースを管理するためのサードパーティ製ツールが多数あります。
  • SQLiteは軽量で高速なデータベースエンジンであるため、モバイルアプリケーションに適しています。



iOSでSQLiteを使用するサンプルコード

データベースの作成

import Foundation

class DatabaseManager {
    
    private let dbPath: String
    
    init() {
        let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
        let documentsDirectory = paths[0]
        dbPath = documentsDirectory.appendingPathComponent("database.sqlite").path
    }
    
    func createDatabase() {
        let db = SQLite3.Connection()
        
        if sqlite3_open(dbPath, &db) != SQLITE_OK {
            print("Error opening database: \(sqlite3_errmsg(db))")
            return
        }
        
        defer {
            sqlite3_close(db)
        }
        
        let createTableSQL = """
        CREATE TABLE IF NOT EXISTS items (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL,
            price REAL NOT NULL
        )
        """
        
        if sqlite3_exec(db, createTableSQL, nil, nil, nil) != SQLITE_OK {
            print("Error creating table: \(sqlite3_errmsg(db))")
            return
        }
        
        print("Database and table created successfully")
    }
}

データの挿入

class DatabaseManager {
    // ... (createDatabase() function)
    
    func insertItem(name: String, price: Double) {
        let db = SQLite3.Connection()
        
        if sqlite3_open(dbPath, &db) != SQLITE_OK {
            print("Error opening database: \(sqlite3_errmsg(db))")
            return
        }
        
        defer {
            sqlite3_close(db)
        }
        
        let insertSQL = """
        INSERT INTO items (name, price) VALUES (?, ?)
        """
        
        var stmt: OpaquePointer?
        
        if sqlite3_prepare_v2(db, insertSQL, -1, &stmt, nil) != SQLITE_OK {
            print("Error preparing statement: \(sqlite3_errmsg(db))")
            return
        }
        
        defer {
            sqlite3_finalize(stmt)
        }
        
        if sqlite3_bind_text(stmt, 1, name, -1, nil) != SQLITE_OK {
            print("Error binding name: \(sqlite3_errmsg(db))")
            return
        }
        
        if sqlite3_bind_double(stmt, 2, price) != SQLITE_OK {
            print("Error binding price: \(sqlite3_errmsg(db))")
            return
        }
        
        if sqlite3_step(stmt) != SQLITE_DONE {
            print("Error inserting item: \(sqlite3_errmsg(db))")
            return
        }
        
        print("Item inserted successfully")
    }
}
class DatabaseManager {
    // ... (createDatabase(), insertItem() functions)
    
    func fetchItems() -> [Item] {
        var items: [Item] = []
        
        let db = SQLite3.Connection()
        
        if sqlite3_open(dbPath, &db) != SQLITE_OK {
            print("Error opening database: \(sqlite3_errmsg(db))")
            return items
        }
        
        defer {
            sqlite3_close(db)
        }
        
        let querySQL = "SELECT id, name, price FROM items"
        
        var stmt: OpaquePointer?
        
        if sqlite3_prepare_v2(db, querySQL, -1, &stmt, nil) != SQLITE_OK {
            print("Error preparing statement: \(sqlite3_errmsg(db))")
            return items
        }
        
        defer {
            sqlite3_finalize(stmt)
        }
        
        while sqlite3_step(stmt) == SQLITE_ROW {
            let id = Int(sqlite3_column_int64(stmt, 0))
            let name = String(cString: sqlite3_column_text(stmt, 1))!
            let price = Double(sqlite3_column_double(stmt, 2))
            
            let item = Item(id: id, name: name, price: price)



iOSでSQLiteを使用するその他の方法

サードパーティ製ライブラリの使用

SQLiteをiOSアプリケーションで使用するもう1つの方法は、サードパーティ製ライブラリを使用することです。 多くのライブラリが用意されており、それぞれ異なる機能と利点があります。 人気のあるライブラリには次のようなものがあります。

  • SQLite.swift: Swift言語用の使いやすいSQLiteライブラリです。
  • GRDB.swift: 高度な機能を備えたSQLiteライブラリです。
  • FMDB: Objective-C言語用のSQLiteライブラリです。

Core Dataの使用

Core Data は、iOSアプリケーションでデータを管理するためのフレームワークです。 Core DataはSQLiteを使用してデータを保存しますが、開発者はSQLiteの複雑な詳細を処理する必要はありません。 Core Dataは、オブジェクトグラフマッピング、トランザクション、フェッチリクエストなどの機能を提供します。

Realmの使用

Realm は、モバイルアプリケーション用のオープンソースのデータベースです。 Realmは、SQLiteよりも高速でスケーラブルなデータベースであると主張しています。 また、オブジェクトグラフマッピング、トランザクション、リアルタイム同期などの機能を提供します。

  • シンプルなアプリケーション の場合は、上記のサンプルコードを使用してSQLiteを直接使用するのがよいでしょう。
  • より複雑なアプリケーション の場合は、SQLite.swiftなどのサードパーティ製ライブラリを使用すると、開発時間を節約できます。
  • データを大量に処理する必要があるアプリケーション の場合は、Core DataまたはRealmを使用することを検討してください。

    iphone ios sqlite


    【完全ガイド】SQLite のプリペアドステートメントのデバッグ方法

    以下は、SQLite のプリペアドステートメントのデバッグに役立つヒントです。ログを使用するSQLite は、エラーや警告に関する情報をログファイルに記録することができます。ログファイルの内容を確認することで、問題の原因を特定できる場合があります。...


    【Android】SimpleCursorAdapterでデータベース変更を反映できない?その原因と解決策

    Android アプリ開発において、データベース変更を SimpleCursorAdapter で反映させようとすると、データが更新されないという問題が発生することがあります。この問題は、SimpleCursorAdapter が自動的にデータベースの変更を検知しないことに起因します。...


    【初心者向け】iPhoneアプリでSQLiteを使うなら知っておきたいデータ閲覧術!

    SQLite エディタを使う最も簡単で一般的な方法は、SQLite エディタを使うことです。 多くの SQLite エディタは、iOS デバイス向けに用意されており、App Store からダウンロードできます。 人気のある SQLite エディタには、以下のようなものがあります。...


    SQLite データベースファイルとダンプを見つける場所

    SQLite データベースファイルとダンプの例を見つける場所書籍: 『SQLite データベース入門』書籍:『SQLite データベース入門』データベースファイルの種類SQLite 3 形式: 拡張子が . sqlite 最も一般的な形式...


    データベース初心者でも安心!SQLiteで列を追加・削除する方法

    列を追加新しい列を追加するには、ALTER TABLEコマンドを使用します。 構文は以下の通りです。table_name は変更するテーブルの名前、column_name は追加する列の名前、column_type は追加する列のデータ型を指定します。...