استفاده از دیتابیس خارجی از نوع sqlite که توسط خود برنامه دانلود میشه
با سلام خدمت همه ی دوستان عزیز
اون چیزی که مد نظرم هست و میخوام داخل برنامم پیاده سازی کنم این هست که کاربر بتونه دیتابیس خارجی از نوع sqlite رو که روی سرور بارگذاری شده دانلود کنه و از دیتا های درون اون داخل برنامه استفاده کنه
توی آموزشی که استاد کاشی زاده راجب استفاده از دیتابیس خارجی داده ، در یکی از مراحل میومدیم از قسمت Build phases و بعد از اون روی New copy files phase کلیک میکردیم و دیتابیس خارجی خودمون رو به برنامه معرفی میکردیم تا موقع نصب همراه با برنامه داخل گوشی ثبت بشه . حالا با توجه به این موضوع انجام این مرحله برای دیتابیس دانلودی ممکن نیست در نتیجه نمیتونیم از دیتابیس دانلودی با این روش استفاده کنیم ، حالا سوال من از آقای کاشی زاده و دوستان عزیز دیگه اینه که آیا راهی برای استفاده از دیتابیس دانلودی درون برنامه وجود داره ؟
خوشبختانه مشکل برطرف شد .
کد ها رو میزارم تا اگه دوستان دیگه به این مشکل برخوردن بتونن از این کد ها استفاده کنند . خروجی قطعه کد های زیر به این صورت هست که فایل دیتابیس از نوع sqlite رو از سرور دانلود میکنه و اطلاعات داخل دیتابیس رو درون کنسول پیرینت میکنه .
امکان انجام چنین کاری با تغییرات جزیی در متد copyDBFromBundle داخل کلاس sqliteDB که آقای کاشی زاده در آموزش ها قرار داده میسر هستش . البته متد رو تغییر ندادم فقط کد های داخل اون رو به صورت دیگه ای در داخل ViewController اصلی تغییر دادم و استفاده کردم .
کد های کلاس AppDelegate ( البته فقط کد های داخل متد didFinishLaunchingWithOptions رو میزارم چون بقیش تفاوتی با کلاس اصلی نداره و همچنین یک متغییر استاتیک هم باید درون این کلاس تعریف شه که به صورت زیر میشه :
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
internal static var downloadPath = ""
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
let documentpath:NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
print(documentpath)
AppDelegate.downloadPath = documentpath.stringByAppendingPathComponent("download")
if !NSFileManager.defaultManager().fileExistsAtPath(AppDelegate.downloadPath) {
do {
try NSFileManager.defaultManager().createDirectoryAtPath(AppDelegate.downloadPath, withIntermediateDirectories: false, attributes: nil)
} catch let error as NSError {
print(error.localizedDescription)
}
}
return true
}
کد های مربوط به کلاس ViewController :
import UIKit
class ViewController: UIViewController , NSURLSessionDelegate , NSURLSessionDownloadDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let sessionConf = NSURLSessionConfiguration.defaultSessionConfiguration()
let session = NSURLSession(configuration: sessionConf, delegate: self, delegateQueue: nil)
let url = NSURL(string: "http://basketlife.ir/driveTest.sqlite")
let request = NSURLRequest(URL: url!)
let downloadTask = session.downloadTaskWithRequest(request)
downloadTask.resume()
}
internal func URLSession(session: NSURLSession, downloadTask: NSURLSessionDownloadTask, didFinishDownloadingToURL location: NSURL) {
let fileManager = NSFileManager.defaultManager()
let content = NSData(contentsOfURL: location)
fileManager.createFileAtPath(AppDelegate.downloadPath + "/" + "test.sqlite", contents: content, attributes: nil)
let db = DB.getInstance()
let bundlePath = AppDelegate.downloadPath + "/" + "test.sqlite"
let destPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let fileManager2 = NSFileManager.defaultManager()
let fullDestPath = NSURL(fileURLWithPath: destPath).URLByAppendingPathComponent("db.sqlite")
let fullDestPathString = fullDestPath.path
do {
if !fileManager2.fileExistsAtPath(fullDestPathString!) {
try fileManager2.copyItemAtPath(bundlePath, toPath: fullDestPathString!)
}
} catch {
print(error)
}
let records = db.executeQuery("SELECT * FROM exam3")
for record in records {
print(record.column["question"]?.asString())
}
}
}
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .