SORU
8 HAZİRAN 2014, Pazar


Erişim Swift bir SQLite Veritabanı

Bir Swift kodu ile benim app bir SQLite veritabanına erişmek için arıyorum.

Objective C SQLite bir Sarıcı kullanın ve köprü Başlığı kullanabilirsiniz biliyorum, ama oldukça bu proje tamamen Swift yapmak mümkün olurdu. Bir şekilde bunu yapmak için birinin bir sorgu göndermek için nasıl gösteren bir referans için kullanılabilir ve eğer öyleyse, satır, vb almak var mı?

CEVAP
21 ŞUBAT 2015, CUMARTESİ


Muhtemelen eğer SQLite Kütüphanesi kendinizi nasıl bilmek istiyorsan birçok SQLite paketleri (FMDB olmasını tercih ederdim) kullanmanız gerekirken,:

  1. SQLite C çağrıları işlemek için Hızlı proje yapılandırma:

  2. /Açık veritabanı oluşturmak

    let documents = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false)
    let fileURL = documents.URLByAppendingPathComponent("test.sqlite")
    
    // open database
    
    var db: COpaquePointer = nil
    if sqlite3_open(fileURL.path!, &db) != SQLITE_OK {
        print("error opening database")
    }
    
  3. sqlite3_exec SQL tablo oluşturmak (örn gerçekleştirmek için kullanın.

    if sqlite3_exec(db, "create table if not exists test (id integer primary key autoincrement, name text)", nil, nil, nil) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("error creating table: \(errmsg)")
    }
    
  4. sqlite3_prepare_v2 ? ile SQL ederiz bağlama değeri: tutucu için hazırlamak için kullanın

    var statement: COpaquePointer = nil
    
    if sqlite3_prepare_v2(db, "insert into test (name) values (?)", -1, &statement, nil) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("error preparing insert: \(errmsg)")
    }
    
    if sqlite3_bind_text(statement, 1, "foo", -1, SQLITE_TRANSIENT) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("failure binding foo: \(errmsg)")
    }
    
    if sqlite3_step(statement) != SQLITE_DONE {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("failure inserting foo: \(errmsg)")
    }
    

    Unutmayın, bu sabit SQLITE_TRANSIENT şöyle: which can be implemented kullanır

    internal let SQLITE_STATIC = unsafeBitCast(0, sqlite3_destructor_type.self)
    internal let SQLITE_TRANSIENT = unsafeBitCast(-1, sqlite3_destructor_type.self)
    
  5. Eklemek için SQL başka bir değeri sıfırlandı. Bu örnekte, NULL bir değer ekleme yapacağım:

    if sqlite3_reset(statement) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("error resetting prepared statement: \(errmsg)")
    }
    
    if sqlite3_bind_null(statement, 1) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("failure binding null: \(errmsg)")
    }
    
    if sqlite3_step(statement) != SQLITE_DONE {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("failure inserting null: \(errmsg)")
    }
    
  6. Bellek hazırlanan deyimi ile ilişkili kurtarmak için hazırlanmış deyimi tamamlamak:

    if sqlite3_finalize(statement) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("error finalizing prepared statement: \(errmsg)")
    }
    
    statement = nil
    
  7. Değerler alınıyor: tablo ve döngü seçme değerler için yeni bir açıklama hazırlayın

    if sqlite3_prepare_v2(db, "select id, name from test", -1, &statement, nil) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        println("error preparing select: \(errmsg)")
    }
    
    while sqlite3_step(statement) == SQLITE_ROW {
        let id = sqlite3_column_int64(statement, 0)
        print("id = \(id); ", terminator: "")
    
        let name = sqlite3_column_text(statement, 1)
        if name != nil {
            let nameString = String.fromCString(UnsafePointer<Int8>(name))
            print("name = \(nameString!)")
        } else {
            print("name not found")
        }
    }
    
    if sqlite3_finalize(statement) != SQLITE_OK {
        let errmsg = String.fromCString(sqlite3_errmsg(db))
        print("error finalizing prepared statement: \(errmsg)")
    }
    
    statement = nil
    
  8. Veritabanını kapatın

    if sqlite3_close(db) != SQLITE_OK {
        print("error closing database")
    }
    
    db = nil
    

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Mr_BrettHooge

    Mr_BrettHoog

    3 Ocak 2011
  • Pepsi

    Pepsi

    1 Kasım 2005
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009