সুইফটে একটি এসকিউএল ডাটাবেস অ্যাক্সেস করা হচ্ছে


103

আমি সুইফট কোড সহ আমার অ্যাপ্লিকেশনটিতে একটি এসকিউএল ডাটাবেস অ্যাক্সেস করার উপায় খুঁজছি।

আমি জানি যে আমি উদ্দেশ্য সি তে এসকিউএলাইট র‍্যাপার ব্যবহার করতে পারি এবং ব্রিজিং শিরোনামটি ব্যবহার করতে পারি, তবে আমি বরং সুইফটে এই প্রকল্পটি সম্পূর্ণরূপে করতে সক্ষম হব। এটি করার কোনও উপায় আছে কি, যদি তাই হয় তবে কেউ কি আমাকে এমন একটি রেফারেন্সের দিকে নির্দেশ করতে পারে যা দেখায় যে কীভাবে কোনও জমা দেওয়ার, সারিগুলি পুনরুদ্ধার করা ইত্যাদি?



1
আমার ডাটাবেস ফাইলটি কোথায় রাখা উচিত?
সি ফেলিয়ানা

1
@ সিফেলিয়ানা - অ্যাপ্লিকেশন সহায়তা ডিরেক্টরি একটি দুর্দান্ত জায়গা, যেমন let dbPath = try! FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true).appendingPathComponent("test.sqlite").path
রব

উত্তর:


143

আপনার সম্ভবত অনেকগুলি এসকিউএল র‍্যাপার একটি ব্যবহার করা উচিত, আপনি কীভাবে এসকিউএল লাইব্রেরি কল করতে চান তা জানতে চাইলে আপনি:

  1. এসকিউএল সি কলগুলি পরিচালনা করতে আপনার সুইফট প্রকল্পটি কনফিগার করুন। যদি এক্সকোড 9 বা তার পরে ব্যবহার করা হয় তবে আপনি কেবল তা করতে পারেন:

    import SQLite3
  2. ডাটাবেস তৈরি / খুলুন

    let fileURL = try! FileManager.default
        .url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
        .appendingPathComponent("test.sqlite")
    
    // open database
    
    var db: OpaquePointer?
    guard sqlite3_open(fileURL.path, &db) == SQLITE_OK else {
        print("error opening database")
        sqlite3_close(db)
        db = nil
        return
    }

    দ্রষ্টব্য, আমি জানি এটি খুলতে ব্যর্থ হওয়ার পরে ডাটাবেসটি বন্ধ করা অদ্ভুত বলে মনে হয়, তবে sqlite3_open ডকুমেন্টেশনটি স্পষ্ট করে দেয় যে মেমরি ফাঁস থেকে বাঁচতে আমাদের অবশ্যই এটি করা উচিত:

    এটি খোলার সময় কোনও ত্রুটি দেখা দেয় কি না, ডাটাবেস সংযোগ হ্যান্ডেলের সাথে যুক্ত সংস্থানগুলি sqlite3_close()যখন প্রয়োজন হয় না তখন তা প্রেরণ করে ছেড়ে দেওয়া উচিত ।

  3. sqlite3_execএসকিউএল সম্পাদনের জন্য ব্যবহার করুন (যেমন টেবিল তৈরি করুন)।

    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(cString: sqlite3_errmsg(db)!)
        print("error creating table: \(errmsg)")
    }
  4. স্থানধারক sqlite3_prepare_v2সহ এসকিউএল প্রস্তুত করতে ব্যবহার করুন ?যার সাথে আমরা মান আবদ্ধ করব।

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

    দ্রষ্টব্য, এটি SQLITE_TRANSIENTধ্রুবকটি ব্যবহার করে যা নিম্নলিখিত হিসাবে প্রয়োগ করা যেতে পারে :

    internal let SQLITE_STATIC = unsafeBitCast(0, to: sqlite3_destructor_type.self)
    internal let SQLITE_TRANSIENT = unsafeBitCast(-1, to: sqlite3_destructor_type.self)
  5. অন্য মান সন্নিবেশ করতে এসকিউএল পুনরায় সেট করুন। এই উদাহরণে, আমি একটি NULLমান সন্নিবেশ করব :

    if sqlite3_reset(statement) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error resetting prepared statement: \(errmsg)")
    }
    
    if sqlite3_bind_null(statement, 1) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure binding null: \(errmsg)")
    }
    
    if sqlite3_step(statement) != SQLITE_DONE {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("failure inserting null: \(errmsg)")
    }
  6. প্রস্তুত বিবৃতিটির সাথে সম্পর্কিত স্মৃতি পুনরুদ্ধার করতে প্রস্তুত বিবৃতিটিকে চূড়ান্ত করুন:

    if sqlite3_finalize(statement) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error finalizing prepared statement: \(errmsg)")
    }
    
    statement = nil
  7. মানগুলি পুনরুদ্ধারের মাধ্যমে টেবিল এবং লুপ থেকে মান নির্বাচন করার জন্য নতুন বিবৃতি প্রস্তুত করুন:

    if sqlite3_prepare_v2(db, "select id, name from test", -1, &statement, nil) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error preparing select: \(errmsg)")
    }
    
    while sqlite3_step(statement) == SQLITE_ROW {
        let id = sqlite3_column_int64(statement, 0)
        print("id = \(id); ", terminator: "")
    
        if let cString = sqlite3_column_text(statement, 1) {
            let name = String(cString: cString)
            print("name = \(name)")
        } else {
            print("name not found")
        }
    }
    
    if sqlite3_finalize(statement) != SQLITE_OK {
        let errmsg = String(cString: sqlite3_errmsg(db)!)
        print("error finalizing prepared statement: \(errmsg)")
    }
    
    statement = nil
  8. ডাটাবেস বন্ধ করুন:

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

এক্সকোডের সুইফট 2 এবং পুরানো সংস্করণগুলির জন্য, এই উত্তরের পূর্ববর্তী সংশোধনগুলি দেখুন ।


1
পাসের 1 এ যারা কিছু সমস্যা পেয়েছে তাদের জন্য এটি বিবেচনা করুন: আপনার এক্সকোড প্রকল্পে একটি ব্রিজিং শিরোনাম তৈরি করুন (উদাঃ ব্রিজিংহিডার h); এই শিরোনাম ফাইলে কেবল সুইফটে ব্রিজ করার জন্য অবজেক্টিভ সি / সি হেডারগুলি আমদানি করা লাইন থাকতে পারে (উদাহরণস্বরূপ # অন্তর্ভুক্ত <sqlite3.h>); "বিল্ড সেটিংস" -এ "অবজেক্টিভ সি ব্রিজিং শিরোলেখ" (আপনি অনুসন্ধান বারটি ব্যবহার করতে পারেন) এবং "ব্রিজিংহিডার এইচ" লিখুন (যদি আপনি "উদ্দেশ্য-সি শিরোনামটি আমদানি করতে পারেন না") এর মতো একটি ত্রুটি বার্তা পান তবে "প্রকল্প- নাম / BridgingHeader.h "); "বিল্ড দশা", "লিঙ্ক বাইনারি সঙ্গে লাইব্রেরি" এ যান, এবং উপর XCode 7 libsqlite3.0.dylib বা libsqlite3.0.tbd যোগ
Jorg বি হোর্হে

নীচে যদি (... == SQLITE_OK) বাসা বাঁধাই আরও ভাল হয় যাতে নিম্নলিখিতটি ব্যর্থ হলে এটি সম্পাদন করে না। আমি খাঁটিভাবে জিজ্ঞাসা করছি কারণ আমি এটির জন্য খুব নতুন এবং আপনি যদি শিক্ষার উদ্দেশ্যে এটি করেন তবে কেবল কৌতূহলী ছিলাম।
মুহুর্ত

@ মেম্বারফুল - অবশ্যই, তবে আপনি যদি অনেক এসকিউএলাইট কল দিয়ে তা করেন তবে আপনি এমন কোড সহ শেষ করবেন যা সত্যই গভীরভাবে নেস্ট করেছে। আপনি যদি এই বিষয়ে উদ্বিগ্ন হন তবে আমি সম্ভবত guardপরিবর্তে বিবৃতি ব্যবহার করব।
রব

@ জর্জি বি জর্জি আমি সবই করেছি, আপনার কি কোনওভাবে ব্রিজিং শিরোনাম আমদানি করা দরকার? আমি পরীক্ষার ক্লাসে কাজ করছি
Async-

হাই @ রব, আমি এখানে একটি সুইফ্ট প্রকল্পে আপনার স্ক্লাইট র্যাপারটি ব্যবহার করছি। এটা সত্যিই সুন্দর, ধন্যবাদ। যাইহোক, আমি এটির সাথে টেবিল থেকে একটি নির্বাচন গণনা (*) করতে পারি না। এটি ক্রাশ হতে থাকে। যদি আমি টেবিলের নাম থেকে কোনও নির্বাচিত গণনা (কল_নাম) করি যেখানে কিছু_col = xxx, এটি কাজ করে। আপনি কি পরামর্শ দিচ্ছেন?
gbenros বিজ্ঞান

18

ব্রিজিং শিরোনামের ভিতরে ডায়নামিক লাইব্রেরি আমদানি করা আপনি সবচেয়ে ভাল যা করতে পারেন:

  1. আপনার "লাইব্রেরিগুলির সাথে লিঙ্ক বাইনারি" বিল্ড ফেজটিতে libsqlite3.dylib যুক্ত করুন
  2. একটি "ব্রিজিং-শিরোলেখ।" তৈরি করুন এবং #import <sqlite3.h>শীর্ষে যুক্ত করুন
  3. "সুইফ্ট কম্পাইলার - কোড জেনারেশন" এর অধীনে বিল্ড সেটিংসে "উদ্দেশ্য-সি ব্রিজিং শিরোলেখ" সেটিংয়ের জন্য "ব্রিজিং-শিরোলেখ" সেট করুন

এরপরে আপনি sqlite3_openআপনার সুইফট কোড থেকে সমস্ত সি পদ্ধতিতে অ্যাক্সেস করতে সক্ষম হবেন ।

তবে আপনি কেবল এফএমডিবি ব্যবহার করতে এবং ব্রিজিং শিরোনামের মাধ্যমে আমদানি করতে পারেন কারণ এটি স্ক্লাইটের আরও একটি অবজেক্ট ওরিয়েন্টেড র‌্যাপার। সি পয়েন্টার এবং স্ট্রাক্টের সাথে ডিল করা সুইফ্টে জটিল হবে।


ব্রিজিং শিরোনাম সন্ধানের জন্য এক্সকোডের জন্য আমাকে টার্গেট বিল্ড সেটিংস নয়, প্রকল্প বিল্ড সেটিংসের আওতায় এটিকে যুক্ত করতে হয়েছিল।
rob5408

3
এছাড়াও সবাই এবং তাদের বাবা এখন একটি সুইফ্ট র‍্যাপার তৈরি করেছেন .. নীচে দেখুন

1
দুঃখের বিষয়, এগুলির মধ্যে কোনওই ভয়ানকভাবে পরিপক্ক নয়, তাই আপনি যদি এই নতুন কোনও মোড়ক ব্যবহার করেন তবে সাবধান হন। উদাহরণস্বরূপ, লেখার সময়, আমি সেগুলির চারটিতে এক নজরে ছিলাম এবং তিনটি তারিখগুলি ভুলভাবে পরিচালিত হয়েছিল এবং চতুর্থ এগুলি একেবারেই সামলেনি।
রব

@ রব আপনি কি github.com/stephencelis/SQLite.swift#readme দেখেছেন ? NSDate এখানে সঙ্গে ব্যবহার করার জন্য কনফিগার করার তথ্য: github.com/stephencelis/SQLite.swift/blob/master/Documentation/...
stephencelis

@ স্টেফেনিসলিস আরে, এগুলির বেশিরভাগের চেয়ে ভাল, কারণ কমপক্ষে আপনি টাইমজোনটি নির্দিষ্ট করেছেন তবে আমার এখনও এটি নিয়ে সমস্যা রয়েছে NSDateFormatter। তবে আমার উদ্দেশ্য এই নির্দিষ্ট বাস্তবায়নের এই বিশেষ দিকটির সমালোচনা করার চেয়ে কম ছিল তার বিস্তৃত ইস্যুটির সূচক হিসাবে যে এফএমডিবির মতো সমাধানগুলিতে সংশোধন করার বছরগুলি নেই। আমি মনে করি লোকেরা কম পরিপক্ক সুইফ্ট বাস্তবায়ন (টিএফএইচপ্লেল বনাম এনডিএইচপ্পল আরেকটি ভাল উদাহরণ) এর পক্ষে প্রমাণিত অবজেক্টিভ সি সমাধানগুলি বাতিল করতে খুব দ্রুত।
রব

11

আমিও এসকিউএলাইটের সাথে একইভাবে ইন্টারঅ্যাক্ট করার জন্য কিছু উপায় সন্ধান করছিলাম যেভাবে আমি উদ্দেশ্য-সি-তে আগে যেমন ব্যবহার করতাম। স্বীকার করা যায় যে সি সামঞ্জস্যতার কারণে আমি কেবল স্ট্রেট সি এপিআই ব্যবহার করেছি।

যেহেতু সুইফটে এসকিউএলাইটের জন্য বর্তমানে কোনও মোড়কের উপস্থিতি নেই এবং উপরে উল্লিখিত এসকিউএলডিডিবি কোডটি কিছুটা উচ্চতর স্তরে যায় এবং নির্দিষ্ট ব্যবহার অনুমান করে, আমি একটি মোড়ক তৈরি করে প্রক্রিয়াটিতে সুইফ্টের সাথে কিছুটা পরিচিত হওয়ার সিদ্ধান্ত নিয়েছি। আপনি এটি এখানে পাবেন: https://github.com/chrismsimpson/SwiftSQLite

var db = SQLiteDatabase();
db.open("/path/to/database.sqlite");

var statement = SQLiteStatement(database: db);

if ( statement.prepare("SELECT * FROM tableName WHERE Id = ?") != .Ok )
{
    /* handle error */
}

statement.bindInt(1, value: 123);

if ( statement.step() == .Row )
{
    /* do something with statement */
    var id:Int = statement.getIntAt(0)
    var stringValue:String? = statement.getStringAt(1)
    var boolValue:Bool = statement.getBoolAt(2)
    var dateValue:NSDate? = statement.getDateAt(3)
}

statement.finalizeStatement(); /* not called finalize() due to destructor/language keyword */

5

আমি সুইফটে পুরোপুরি লিখিত একটি মার্জিত এসকিউএল লাইব্রেরি তৈরি করেছি যা সুইফটডাটা নামে পরিচিত

এর বৈশিষ্ট্যগুলির কয়েকটি হ'ল:

  • এসকিউএল স্ট্রিংয়ের সাথে অবজেক্টগুলিকে সুবিধার্থে বাঁধুন
  • লেনদেন এবং সেভপয়েন্টগুলির জন্য সমর্থন
  • ইনলাইন ত্রুটি পরিচালনা
  • সম্পূর্ণ থ্রেডটি ডিফল্টরূপে নিরাপদ

এটি 'পরিবর্তনগুলি' কার্যকর করার একটি সহজ উপায় সরবরাহ করে (যেমন INSERT, আপডেট, মোছা ইত্যাদি):

if let err = SD.executeChange("INSERT INTO Cities (Name, Population, IsWarm, FoundedIn) VALUES ('Toronto', 2615060, 0, '1793-08-27')") {
    //there was an error during the insert, handle it here
} else {
    //no error, the row was inserted successfully
}

এবং 'প্রশ্নগুলি' (যেমন নির্বাচন করুন):

let (resultSet, err) = SD.executeQuery("SELECT * FROM Cities")
if err != nil {
    //there was an error during the query, handle it here
} else {
    for row in resultSet {
        if let name = row["Name"].asString() {
            println("The City name is: \(name)")
        }
        if let population = row["Population"].asInt() {
            println("The population is: \(population)")
        }
        if let isWarm = row["IsWarm"].asBool() {
            if isWarm {
                println("The city is warm")
            } else {
                println("The city is cold")
            }
        }
        if let foundedIn = row["FoundedIn"].asDate() {
            println("The city was founded in: \(foundedIn)")
        }
    }
}

পাশাপাশি আরও অনেক বৈশিষ্ট্য!

আপনি এটি এখানে পরীক্ষা করে দেখতে পারেন


দুর্ভাগ্যক্রমে আপনার lib শুধুমাত্র iOS-! : - /
ব্যাডমিন্টনকিট

3

সুইফট 2 এবং সুইফট 3: http://github.com/groue/GRDB.swift এর জন্য আর একটি এসকিউএলাইট র‍্যাপার

বৈশিষ্ট্য:

  • সিসিগাস / এফএমডিবি ব্যবহারকারীদের কাছে পরিচিত এমন একটি এপিআই

  • একটি নিম্ন-স্তরের এসকিউএলাইট এপিআই যা সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরিটি উপভোগ করে

  • এসকিউএল-অ্যালার্জি বিকাশকারীদের জন্য একটি দুর্দান্ত সুইফ্ট ক্যোয়ারী ইন্টারফেস

  • SQLite ওয়াল মোড এবং অতিরিক্ত পারফরম্যান্সের জন্য একযোগে ডাটাবেস অ্যাক্সেসের জন্য সমর্থন Support

  • একটি রেকর্ড শ্রেণি যা ফলাফল সেটগুলিকে আবৃত করে, প্রাতঃরাশের জন্য আপনার কাস্টম এসকিউএল কোয়েরি খায় এবং মৌলিক সিআরইউডি ক্রিয়াকলাপ সরবরাহ করে

  • সুইফ্ট প্রকারের স্বাধীনতা: আপনার ডেটার সাথে মানানসই ডান দিকের সুইফট টাইপ করুন pick যখন প্রয়োজন হয় Int64 ব্যবহার করুন, বা সুবিধাজনক ইন্ট সঙ্গে স্টিক। এনএসডিট বা এনএসডিটকম্পোনেন্টগুলি সঞ্চয় এবং পড়ুন। পৃথক ডেটা ধরণের জন্য সুইফট এনামগুলি ঘোষণা করুন। আপনার নিজস্ব ডাটাবেস-রূপান্তরযোগ্য প্রকারের সংজ্ঞা দিন।

  • ডাটাবেস স্থানান্তর

  • গতি: https://github.com/groue/GRDB.swift/wiki/ পারফরম্যান্স


জিআরডিবি গিথুবের অন্যতম সেরা নথিভুক্ত, সমর্থিত এবং রক্ষণাবেক্ষণের ফ্রেমওয়ার্ক!
ক্লাস

3

AppDelegate.swift

func createDatabase()
{
    var path:Array=NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
    let directory:String=path[0]
    let DBpath=(directory as NSString).appendingPathComponent("Food.sqlite")

    print(DBpath)

    if (FileManager.default.fileExists(atPath: DBpath))
    {
        print("Successfull database create")
    }
    else
    {
        let pathfrom:String=(Bundle.main.resourcePath! as NSString).appendingPathComponent("Food.sqlite")

        var success:Bool
        do {
            try FileManager.default.copyItem(atPath: pathfrom, toPath: DBpath)
            success = true
        } catch _ {
            success = false
        }

        if !success
        {
            print("database not create ")
        }
        else
        {
            print("Successfull database new create")
        }
    }
}

Database.swift

import UIKit

class database: NSObject
{
func databasePath() -> NSString
{
    var path:Array=NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
    let directory:String=path[0] 
    let DBpath=(directory as NSString).appendingPathComponent("Food.sqlite")

    if (FileManager.default.fileExists(atPath: DBpath))
    {
        return DBpath as NSString
    }
    return DBpath as NSString
}

func ExecuteQuery(_ str:String) -> Bool
{
    var result:Bool=false
    let DBpath:String=self.databasePath() as String

    var db: OpaquePointer? = nil
    var stmt:OpaquePointer? = nil

    let strExec=str.cString(using: String.Encoding.utf8)

    if (sqlite3_open(DBpath, &db)==SQLITE_OK)
    {
        if (sqlite3_prepare_v2(db, strExec! , -1, &stmt, nil) == SQLITE_OK)
        {
            if (sqlite3_step(stmt) == SQLITE_DONE)
            {
                result=true
            } 
        }
        sqlite3_finalize(stmt)
    }
    sqlite3_close(db)

    return result
}

func SelectQuery(_ str:String) -> Array<Dictionary<String,String>>
{
    var result:Array<Dictionary<String,String>>=[]
    let DBpath:String=self.databasePath() as String

    var db: OpaquePointer? = nil
    var stmt:OpaquePointer? = nil

    let strExec=str.cString(using: String.Encoding.utf8)

    if ( sqlite3_open(DBpath,&db) == SQLITE_OK)
    {
        if (sqlite3_prepare_v2(db, strExec! , -1, &stmt, nil) == SQLITE_OK)
        {
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                var i:Int32=0
                let icount:Int32=sqlite3_column_count(stmt)

                var dict=Dictionary<String, String>()

                while i < icount
                {
                    let strF=sqlite3_column_name(stmt, i)
                    let strV = sqlite3_column_text(stmt, i)

                    let rFiled:String=String(cString: strF!)
                    let rValue:String=String(cString: strV!)
                    //let rValue=String(cString: UnsafePointer<Int8>(strV!))

                    dict[rFiled] = rValue

                    i += 1
                }
                result.insert(dict, at: result.count)
            }
        sqlite3_finalize(stmt)
        }

    sqlite3_close(db)
    }
    return result
}

func AllSelectQuery(_ str:String) -> Array<Model>
{
    var result:Array<Model>=[]
    let DBpath:String=self.databasePath() as String

    var db: OpaquePointer? = nil
    var stmt:OpaquePointer? = nil

    let strExec=str.cString(using: String.Encoding.utf8)

    if ( sqlite3_open(DBpath,&db) == SQLITE_OK)
    {
        if (sqlite3_prepare_v2(db, strExec! , -1, &stmt, nil) == SQLITE_OK)
        {
            while (sqlite3_step(stmt) == SQLITE_ROW)
            {
                let mod=Model()

                mod.id=String(cString: sqlite3_column_text(stmt, 0))
                mod.image=String(cString: sqlite3_column_text(stmt, 1))
                mod.name=String(cString: sqlite3_column_text(stmt, 2))
                mod.foodtype=String(cString: sqlite3_column_text(stmt, 3))
                mod.vegtype=String(cString: sqlite3_column_text(stmt, 4))
                mod.details=String(cString: sqlite3_column_text(stmt, 5))

                result.insert(mod, at: result.count)
            }
            sqlite3_finalize(stmt)
        }
        sqlite3_close(db)
    }
    return result
}

}

Model.swift

import UIKit


class Model: NSObject
{
var uid:Int = 0
var id:String = ""
var image:String = ""
var name:String = ""
var foodtype:String = ""
var vegtype:String = ""
var details:String = ""
var mealtype:String = ""
var date:String = ""
}

অ্যাক্সেস ডাটাবেস:

let DB=database()
var mod=Model()

ডাটাবেস অনুসন্ধান আগুন:

var DailyResult:Array<Model> = DB.AllSelectQuery("select * from food where foodtype == 'Sea Food' ORDER BY name ASC")

এই কিয়রি কাজ করছে না। কেন কেবল একটি = এর পরিবর্তে ==?
আরগাপিকে

1

এটি এখন পর্যন্ত সেরা এসকিউএল লাইব্রেরি যা আমি সুইফটে ব্যবহার করেছি: https://github.com/stephencelis/SQLite.swift

কোড উদাহরণ দেখুন। সি এপিআই এর চেয়ে অনেক বেশি ক্লিনার:

import SQLite

let db = try Connection("path/to/db.sqlite3")

let users = Table("users")
let id = Expression<Int64>("id")
let name = Expression<String?>("name")
let email = Expression<String>("email")

try db.run(users.create { t in
    t.column(id, primaryKey: true)
    t.column(name)
    t.column(email, unique: true)
})
// CREATE TABLE "users" (
//     "id" INTEGER PRIMARY KEY NOT NULL,
//     "name" TEXT,
//     "email" TEXT NOT NULL UNIQUE
// )

let insert = users.insert(name <- "Alice", email <- "alice@mac.com")
let rowid = try db.run(insert)
// INSERT INTO "users" ("name", "email") VALUES ('Alice', 'alice@mac.com')

for user in try db.prepare(users) {
    print("id: \(user[id]), name: \(user[name]), email: \(user[email])")
    // id: 1, name: Optional("Alice"), email: alice@mac.com
}
// SELECT * FROM "users"

let alice = users.filter(id == rowid)

try db.run(alice.update(email <- email.replace("mac.com", with: "me.com")))
// UPDATE "users" SET "email" = replace("email", 'mac.com', 'me.com')
// WHERE ("id" = 1)

try db.run(alice.delete())
// DELETE FROM "users" WHERE ("id" = 1)

try db.scalar(users.count) // 0
// SELECT count(*) FROM "users"

ডকুমেন্টেশনে আরও বলা হয়েছে যে "এসকিউএলাইট.উইউফট সিআইপি-র উপর একটি লাইটওয়েট, সুইফট-বান্ধব র‌্যাপার হিসাবেও কাজ করে" এবং এর কয়েকটি উদাহরণ অনুসরণ করে।


0

আমি সুইফটে একটি এসকিউএল 3 র‌্যাপার লাইব্রেরি লিখেছি

এটি আসলে খুব সাধারণ এপিআই সহ একটি উচ্চ স্তরের র‍্যাপার, তবে যাইহোক, এতে নিম্ন-স্তরের সি আন্তঃ অপ কোড রয়েছে এবং আমি সি আন্তঃ অপটিকে দেখানোর জন্য এর একটি (সরলীকৃত) অংশ পোস্ট করি।

    struct C
    {
        static let  NULL        =   COpaquePointer.null()
    }

    func open(filename:String, flags:OpenFlag)
    {
        let name2   =   filename.cStringUsingEncoding(NSUTF8StringEncoding)!
        let r       =   sqlite3_open_v2(name2, &_rawptr, flags.value, UnsafePointer<Int8>.null())
        checkNoErrorWith(resultCode: r)
    }

    func close()
    {   
        let r   =   sqlite3_close(_rawptr)
        checkNoErrorWith(resultCode: r)
        _rawptr =   C.NULL
    }

    func prepare(SQL:String) -> (statements:[Core.Statement], tail:String)
    {
        func once(zSql:UnsafePointer<Int8>, len:Int32, inout zTail:UnsafePointer<Int8>) -> Core.Statement?
        {
            var pStmt   =   C.NULL
            let r       =   sqlite3_prepare_v2(_rawptr, zSql, len, &pStmt, &zTail)
            checkNoErrorWith(resultCode: r)

            if pStmt == C.NULL
            {
                return  nil
            }
            return  Core.Statement(database: self, pointerToRawCStatementObject: pStmt)
        }

        var stmts:[Core.Statement]  =   []
        let sql2    =   SQL as NSString
        var zSql    =   UnsafePointer<Int8>(sql2.UTF8String)
        var zTail   =   UnsafePointer<Int8>.null()
        var len1    =   sql2.lengthOfBytesUsingEncoding(NSUTF8StringEncoding);
        var maxlen2 =   Int32(len1)+1

        while let one = once(zSql, maxlen2, &zTail)
        {
            stmts.append(one)
            zSql    =   zTail
        }

        let rest1   =   String.fromCString(zTail)
        let rest2   =   rest1 == nil ? "" : rest1!

        return  (stmts, rest2)
    }

    func step() -> Bool
    {   
        let rc1 =   sqlite3_step(_rawptr)

        switch rc1
        {   
            case SQLITE_ROW:
                return  true

            case SQLITE_DONE:
                return  false

            default:
                database.checkNoErrorWith(resultCode: rc1)
        }
    }

    func columnText(at index:Int32) -> String
    {
        let bc  =   sqlite3_column_bytes(_rawptr, Int32(index))
        let cs  =   sqlite3_column_text(_rawptr, Int32(index))

        let s1  =   bc == 0 ? "" : String.fromCString(UnsafePointer<CChar>(cs))!
        return  s1
    }

    func finalize()
    {
        let r   =   sqlite3_finalize(_rawptr)
        database.checkNoErrorWith(resultCode: r)

        _rawptr =   C.NULL
    }

আপনি যদি এই নিম্ন স্তরের মোড়কের পুরো উত্স কোড চান তবে এই ফাইলগুলি দেখুন।


0

এসকিউএল সি কল পরিচালনা করতে আপনার সুইফট প্রকল্পটি কনফিগার করুন:

প্রকল্পে ব্রিজিং হেডার ফাইল তৈরি করুন Create সুইচ উইথ কোকো এবং অবজেক্টিভ-সি এর সুইফট বিভাগে আমদানি করা উদ্দেশ্য-সি দেখুন। এই ব্রিজিং শিরোনামটি sqlite3.h আমদানি করা উচিত:

আপনার প্রকল্পে libsqlite3.0.dylib যুক্ত করুন। কারও প্রকল্পে গ্রন্থাগার / ফ্রেমওয়ার্ক যুক্ত সম্পর্কিত অ্যাপলের ডকুমেন্টেশন দেখুন।

এবং নিম্নলিখিত কোড ব্যবহার

    func executeQuery(query: NSString ) -> Int
    {
        if  sqlite3_open(databasePath! as String, &database) != SQLITE_OK
        {
            println("Databse is not open")
            return 0
        }
        else
        {
            query.stringByReplacingOccurrencesOfString("null", withString: "")
            var cStatement:COpaquePointer = nil
            var executeSql = query as NSString
            var lastId : Int?
            var sqlStatement = executeSql.cStringUsingEncoding(NSUTF8StringEncoding)
            sqlite3_prepare_v2(database, sqlStatement, -1, &cStatement, nil)
            var execute = sqlite3_step(cStatement)
            println("\(execute)")
            if execute == SQLITE_DONE
            {
                lastId = Int(sqlite3_last_insert_rowid(database))
            }
            else
            {
                println("Error in Run Statement :- \(sqlite3_errmsg16(database))")
            }
            sqlite3_finalize(cStatement)
            return lastId!
        }
    }
    func ViewAllData(query: NSString, error: NSError) -> NSArray
    {
        var cStatement = COpaquePointer()
        var result : AnyObject = NSNull()
        var thisArray : NSMutableArray = NSMutableArray(capacity: 4)
        cStatement = prepare(query)
        if cStatement != nil
        {
            while sqlite3_step(cStatement) == SQLITE_ROW
            {
                result = NSNull()
                var thisDict : NSMutableDictionary = NSMutableDictionary(capacity: 4)
                for var i = 0 ; i < Int(sqlite3_column_count(cStatement)) ; i++
                {
                    if sqlite3_column_type(cStatement, Int32(i)) == 0
                    {
                        continue
                    }
                    if sqlite3_column_decltype(cStatement, Int32(i)) != nil && strcasecmp(sqlite3_column_decltype(cStatement, Int32(i)), "Boolean") == 0
                    {
                        var temp = sqlite3_column_int(cStatement, Int32(i))
                        if temp == 0
                        {
                            result = NSNumber(bool : false)
                        }
                        else
                        {
                            result = NSNumber(bool : true)
                        }
                    }
                    else if sqlite3_column_type(cStatement,Int32(i)) == SQLITE_INTEGER
                    {
                        var temp = sqlite3_column_int(cStatement,Int32(i))
                        result = NSNumber(int : temp)
                    }
                    else if sqlite3_column_type(cStatement,Int32(i)) == SQLITE_FLOAT
                    {
                        var temp = sqlite3_column_double(cStatement,Int32(i))
                        result = NSNumber(double: temp)
                    }
                    else
                    {
                        if sqlite3_column_text(cStatement, Int32(i)) != nil
                        {
                            var temp = sqlite3_column_text(cStatement,Int32(i))
                            result = String.fromCString(UnsafePointer<CChar>(temp))!
                            
                            var keyString = sqlite3_column_name(cStatement,Int32(i))
                            thisDict.setObject(result, forKey: String.fromCString(UnsafePointer<CChar>(keyString))!)
                        }
                        result = NSNull()

                    }
                    if result as! NSObject != NSNull()
                    {
                        var keyString = sqlite3_column_name(cStatement,Int32(i))
                        thisDict.setObject(result, forKey: String.fromCString(UnsafePointer<CChar>(keyString))!)
                    }
                }
                thisArray.addObject(NSMutableDictionary(dictionary: thisDict))
            }
            sqlite3_finalize(cStatement)
        }
        return thisArray
    }
    func prepare(sql : NSString) -> COpaquePointer
    {
        var cStatement:COpaquePointer = nil
        sqlite3_open(databasePath! as String, &database)
        var utfSql = sql.UTF8String
        if sqlite3_prepare(database, utfSql, -1, &cStatement, nil) == 0
        {
            sqlite3_close(database)
            return cStatement
        }
        else
        {
            sqlite3_close(database)
            return nil
        }
    }
}

0

কখনও কখনও, sqlite.org এ দেখানো " এসকিউএলাইট 5 মিনিট বা তারও কম সময়ে" পদ্ধতির একটি সুইফ্ট সংস্করণ যথেষ্ট। "5 মিনিট বা তার কম" পদ্ধতির ব্যবহার sqlite3_exec(), যার জন্য সুবিধা মোড়কের হয় sqlite3_prepare(), sqlite3_step(), sqlite3_column(), এবং sqlite3_finalize()

সুইফট ২.২ সরাসরি sqlite3_exec() callbackবিশ্বব্যাপী, নন-ইনস্ট্যান্স পদ্ধতি funcবা একটি অ-ক্যাপচারিং আক্ষরিক বন্ধ হিসাবে ফাংশন পয়েন্টারটিকে সরাসরি সমর্থন করতে পারে {}

সুপাঠ্য typealias

typealias sqlite3 = COpaquePointer
typealias CCharHandle = UnsafeMutablePointer<UnsafeMutablePointer<CChar>>
typealias CCharPointer = UnsafeMutablePointer<CChar>
typealias CVoidPointer = UnsafeMutablePointer<Void>

কলব্যাক অ্যাপ্রোচ

func callback(
    resultVoidPointer: CVoidPointer, // void *NotUsed 
    columnCount: CInt,               // int argc
    values: CCharHandle,             // char **argv     
    columns: CCharHandle             // char **azColName
    ) -> CInt {
    for  i in 0 ..< Int(columnCount) {
        guard let value = String.fromCString(values[i]) 
        else { continue }
        guard let column = String.fromCString(columns[i]) 
        else { continue }
        print("\(column) = \(value)")
    }
    return 0 // status ok
}

func sqlQueryCallbackBasic(argc: Int, argv: [String]) -> Int {
    var db: sqlite3 = nil 
    var zErrMsg:CCharPointer = nil
    var rc: Int32 = 0 // result code

    if argc != 3 {
        print(String(format: "ERROR: Usage: %s DATABASE SQL-STATEMENT", argv[0]))
        return 1
    }

    rc = sqlite3_open(argv[1], &db)
    if  rc != 0 {
        print("ERROR: sqlite3_open " + String.fromCString(sqlite3_errmsg(db))! ?? "" )
        sqlite3_close(db)
        return 1
    }

    rc = sqlite3_exec(db, argv[2], callback, nil, &zErrMsg)
    if rc != SQLITE_OK {
        print("ERROR: sqlite3_exec " + String.fromCString(zErrMsg)! ?? "")
        sqlite3_free(zErrMsg)
    }

    sqlite3_close(db)
    return 0
}

বন্ধের পদ্ধতি

func sqlQueryClosureBasic(argc argc: Int, argv: [String]) -> Int {
    var db: sqlite3 = nil 
    var zErrMsg:CCharPointer = nil
    var rc: Int32 = 0

    if argc != 3 {
        print(String(format: "ERROR: Usage: %s DATABASE SQL-STATEMENT", argv[0]))
        return 1
    }

    rc = sqlite3_open(argv[1], &db)
    if  rc != 0 {
        print("ERROR: sqlite3_open " + String.fromCString(sqlite3_errmsg(db))! ?? "" )
        sqlite3_close(db)
        return 1
    }

    rc = sqlite3_exec(
        db,      // database 
        argv[2], // statement
        {        // callback: non-capturing closure
            resultVoidPointer, columnCount, values, columns in

            for i in 0 ..< Int(columnCount) {
                guard let value = String.fromCString(values[i]) 
                else { continue }
                guard let column = String.fromCString(columns[i]) 
                else { continue }
                print("\(column) = \(value)")
            }
            return 0
        }, 
        nil, 
        &zErrMsg
    )

    if rc != SQLITE_OK {
        let errorMsg = String.fromCString(zErrMsg)! ?? ""
        print("ERROR: sqlite3_exec \(errorMsg)")
        sqlite3_free(zErrMsg)
    }
    sqlite3_close(db)
    return 0
}

এসকিউএলাইটের মতো সি লাইব্রেরিতে কল করতে একটি এক্সকোড প্রকল্প প্রস্তুত করতে, একটি (1) ব্রিজেড-শিরোনাম ফাইল ফাইলের রেফারেন্স সি শিরোনাম যুক্ত করতে হবে #import "sqlite3.h", (2) প্রকল্পে ব্রিজিং-শিরোনামকে উদ্দেশ্য উদ্দেশ্য-সি ব্রিজিং হেডার যুক্ত করতে হবে add সেটিংস, এবং (3) যোগ libsqlite3.tbdকরতে লাইব্রেরির সাথে লিঙ্ক বাইনারি লক্ষ্য সেটিংস।

Sqlite.org এর "5 মিনিট বা তার কম SQLite" উদাহরণ হচ্ছে সুইফট Xcode7 প্রকল্পের বাস্তবায়িত হয় এখানে


0

আপনি এই লাইব্রেরিটি এসকিউএল https://github.com/pmurphyjam/SQLiteDemo জন্য সুইফটে ব্যবহার করতে পারেন

SQLiteDemo

এসকিউএলাইট ডেমো সুইফটে লিখিত এসকিউএলডেটা অ্যাক্সেস ক্লাস সহ সুইফ্ট ব্যবহার করে

আপনার প্রকল্পে যুক্ত করা হচ্ছে

আপনার প্রকল্পে যুক্ত করতে আপনার কেবলমাত্র তিনটি ফাইল দরকার * এসকিউএলডেটাএকসেস.উইফ্ট * ডেটা কনস্ট্যান্টস.সইউফ্ট * ব্রিজিং-শিরোনাম। ব্রিজিং-শিরোনামটি অবশ্যই আপনার এক্সকোডের প্রকল্প 'অবজেক্টিভ-সি ব্রিজিং শিরোলেখ' এর মধ্যে 'সুইফ্ট সংকলক - সাধারণ' এর অধীনে সেট করা উচিত must

ব্যবহারের জন্য উদাহরণ

এসকিউএলডাটাঅ্যাক্সেস.সুইফ্ট দিয়ে কীভাবে সহজ এসকিউএল লিখতে হয় তা দেখতে কেবল ভিউকন্ট্রোলআরসইউফ্টে কোডটি অনুসরণ করুন প্রথমে আপনাকে আপনার লেনদেনের এসকিউএলাইট ডাটাবেস খুলতে হবে

    let db = SQLDataAccess.shared
    db.setDBName(name:"SQLite.db")
    let opened = db.openConnection(copyFile:true)

যদি ওপেন সংযোগটি সফল হয় তবে এখন আপনি টেবিল অ্যাপআইএনফোতে একটি সাধারণ সন্নিবেশ করতে পারেন

    //Insert into Table AppInfo
    let status = db.executeStatement("insert into AppInfo (name,value,descrip,date) values(?,?,?,?)",SQLiteDemo","1.0.2","unencrypted",Date())
    if(status)
    {
        //Read Table AppInfo into an Array of Dictionaries
        let results = db.getRecordsForQuery("select * from AppInfo ")
        NSLog("Results = \(results)")
    }

কত সহজ ছিল দেখুন!

Db.executeStatement এ প্রথম পদটি আপনার স্ট্রিং হিসাবে এসকিউএল হয়, সমস্ত শর্তাবলী অনুসরণ করে যে কোনও হ'ল একটি ভিন্নতর আর্গুমেন্ট তালিকা এবং এটি একটি অ্যারেতে আপনার পরামিতি। এই সমস্ত পদগুলি আপনার এসকিউএল আর্গুমেন্টের তালিকায় কমা দ্বারা পৃথক করা হয়েছে। সিক্যুয়াল স্টেটমেন্টের ঠিক পরে আপনি স্ট্রিংস, ইন্টিজারস, ডেটস এবং ব্লবস প্রবেশ করতে পারেন যেহেতু এই সমস্ত পদটি সিক্যুয়ালের পরামিতি হিসাবে বিবেচিত হয়। বৈকল্পিক আর্গুমেন্ট অ্যারে আপনার সমস্ত সিক্যুয়াল কেবলমাত্র একটি এক্সিকিউটিস্ট স্টেটমেন্ট বা getRecordsForQuery কলটিতে প্রবেশ করা সুবিধাজনক করে তোলে। আপনার যদি কোনও প্যারামিটার না থাকে তবে আপনার এসকিউএল এর পরে কোনও কিছু প্রবেশ করবেন না।

ফলাফল অ্যারে অভিধানের একটি অ্যারে যেখানে 'কী' আপনার সারণী কলামের নাম, এবং 'মান' আপনার এসকিউএলাইট থেকে প্রাপ্ত ডেটা। আপনি সহজেই এই অ্যারের মাধ্যমে একটি লুপের সাহায্যে পুনরাবৃত্তি করতে পারেন বা এটি সরাসরি মুদ্রণ করতে পারেন বা এই অভিধান উপাদানগুলি কাস্টম ডেটা অবজেক্টের জন্য বরাদ্দ করতে পারেন যা আপনি মডেল সেবনের জন্য আপনার ভিউ কন্ট্রোলারগুলিতে ব্যবহার করেন ক্লাসগুলি।

    for dic in results as! [[String:AnyObject]] {
       print(“result = \(dic))
    }

এসকিউএলডেটা অ্যাক্সেস সংরক্ষণ করবে, পাঠ্য, ডাবল, ভাসমান, ব্লব, তারিখ, পূর্ণসংখ্যা এবং দীর্ঘ দীর্ঘ পূর্ণসংখ্যার। ব্লবসের জন্য আপনি বাইনারি, ভেরিবিনারি, ব্লব সংরক্ষণ করতে পারেন।

পাঠ্যের জন্য আপনি চর, অক্ষর, নমনীয়, জাতীয় বিচিত্র অক্ষর, নেটিভ চরিত্র, এনসিআর, এনভারচর, বার্চর, বৈকল্পিক, ভিন্ন চরিত্র, পাঠ্য সংরক্ষণ করতে পারেন।

তারিখগুলির জন্য আপনি তারিখের সময়, সময়, টাইমস্ট্যাম্প, তারিখ সংরক্ষণ করতে পারেন।

পূর্ণসংখ্যার জন্য আপনি বিগিন্ট, বিট, বুল, বুলিয়ান, ইন্ট 2, ইনট 8, ইন্টিজার, মিডিয়ামিন্ট, স্মলিন্ট, টিনিনেন্ট, ইনট সংরক্ষণ করতে পারেন।

ডাবলসের জন্য আপনি দশমিক, ডাবল নির্ভুলতা, ভাসা, সংখ্যা, বাস্তব, ডাবল সংরক্ষণ করতে পারেন store ডাবল সবচেয়ে নির্ভুলতা আছে।

এমনকি আপনি নাল টাইপ নুল সংরক্ষণ করতে পারেন।

ভিউকন্ট্রোল.আরউইফ্ট-এ আরও একটি জটিল উদাহরণ তৈরি করা হয় যাতে কীভাবে একটি অভিধানকে 'ব্লব' হিসাবে sertোকানো যায় showing এছাড়াও এসকিউএলডেটা অ্যাক্সেস দেশীয় সুইফট ডেট () বোঝে যাতে আপনি এই বিষয়গুলিকে রূপান্তর করে সন্নিবেশ করতে পারেন এবং এটি সেগুলিকে পাঠ্যে রূপান্তর করবে এবং সেগুলি সংরক্ষণ করবে এবং পুনরুদ্ধার করার পরে এগুলি পাঠ্য থেকে তারিখে ফিরে রূপান্তর করবে।

অবশ্যই এসকিউএলাইটের আসল শক্তি হ'ল এটি লেনদেনের ক্ষমতা। এখানে আপনি আক্ষরিক অর্থে 400 টি এসকিউএল স্টেটমেন্টগুলিকে প্যারামিটারগুলির সাথে সারি করতে পারেন এবং সেগুলি একবারে sertোকাতে পারেন যা এটি এত শক্তিশালী কারণ এটি সত্যই শক্তিশালী। কীভাবে এটি করা যায় তার একটি উদাহরণও ভিউকন্ট্রোলআর.সুইফ্ট আপনাকে দেখায়। আপনি যা করছেন তা হ'ল 'sqlAndParams' নামক একটি অভিধানের অ্যারে তৈরি করা হচ্ছে, এই অ্যারেতে আপনার স্ট্রিং সিক্যুয়াল স্টেটমেন্ট বা ক্যোয়ারির জন্য দুটি কী 'এসকিউএল' দিয়ে স্টোরিং ডিকোরিজগুলি এবং 'পারমস' যা নেটিভ অবজেক্টের এসকিউএলাইটের একটি অ্যারে মাত্র এই প্রশ্নের জন্য বোঝে। প্রতিটি 'sqlParams' যা সিক্যুয়েল ক্যোয়ারী প্লাস পরামিতিগুলির স্বতন্ত্র অভিধান হয় তারপর 'sqlAndParams' অ্যারেতে সংরক্ষণ করা হয় in একবার আপনি এই অ্যারে তৈরি করার পরে, আপনি কেবল কল করুন।

    let status = db.executeTransaction(sqlAndParams)
    if(status)
    {
        //Read Table AppInfo into an Array of Dictionaries for the above Transactions
        let results = db.getRecordsForQuery("select * from AppInfo ")
        NSLog("Results = \(results)")
    }

এসকিউএল কোয়েরির জন্য সাধারণ স্ট্রিং এবং কোয়েরির প্রয়োজনীয় প্যারামিটারগুলির জন্য একটি অ্যারে দিয়ে সমস্ত এক্সিকিউটিস্টেটমেন্ট এবং গেটরেকর্ডসফিউরি পদ্ধতিগুলি করা যেতে পারে।

    let sql : String = "insert into AppInfo (name,value,descrip) values(?,?,?)"
    let params : Array = ["SQLiteDemo","1.0.0","unencrypted"]
    let status = db.executeStatement(sql, withParameters: params)
    if(status)
    {
        //Read Table AppInfo into an Array of Dictionaries for the above Transactions
        let results = db.getRecordsForQuery("select * from AppInfo ")
        NSLog("Results = \(results)")
    }

একটি অবজেক্টিভ-সি সংস্করণও বিদ্যমান এবং একে একই এসকিউএলডেটাঅ্যাক্সেস বলা হয়, তাই এখন আপনি নিজের সিক্যুয়ালটি উদ্দেশ্য-সি বা সুইফটে লিখতে বেছে নিতে পারেন। এছাড়াও এসকিউএলডাটা অ্যাক্সেস এসকিউএলসিফারের সাথেও কাজ করবে, বর্তমান কোডটি এখনও এটির সাথে কাজ করার জন্য সেটআপ করেনি, তবে এটি করা বেশ সহজ এবং কীভাবে এটি করা যায় তার একটি উদাহরণ এসকিউএলডেটাঅ্যাক্সেসের উদ্দেশ্য-সি সংস্করণে রয়েছে।

এসকিউএলডেটা অ্যাক্সেস একটি খুব দ্রুত এবং দক্ষ বর্গ, এবং কোরিডাটার জায়গায় ব্যবহার করা যেতে পারে যা কোরিডাটার সাথে উপস্থিত সমস্ত কোরিডাটা কোর ডেটা অখণ্ডতা ত্রুটি ক্র্যাশ ছাড়াই এটি সত্যই কেবল এসকিউলাইট ব্যবহার করে।


-1

আপনি স্বাচ্ছন্দ্যের সাথে একক টন ক্লাস ব্যবহার করে এসলিওটি কনফিগার করতে পারেন।

পড়ুন

https://github.com/hasyapanchasara/SQLite_SingleManagerClass

ডাটাবেস তৈরি করার পদ্ধতি

func methodToCreateDatabase() -> NSURL?{} 

তথ্য সন্নিবেশ, আপডেট এবং মুছে ফেলার পদ্ধতি

func methodToInsertUpdateDeleteData(strQuery : String) -> Bool{}

ডেটা নির্বাচন করার পদ্ধতি

func methodToSelectData(strQuery : String) -> NSMutableArray{}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.