在我的应用中,我在每张表中都有数千条记录。我有多个表插入。我正在使用fmdb。为了插入数据,我使用的是FMDatabaseQueue:
DBManager.GetQueue().inTransaction { (db, rollback) in
var query: String = String()
for obj in chatThreads
{
query += "insert or replace into \(TABLE_NAME) (\(COLUMN_THREAD_ID), \(COLUMN_CHAT_NAME), \(COLUMN_DATE_TIME)) values (\(obj.threadId), '\(obj.chat_name)', '\(obj.date_time)');"
}
if !(db.executeStatements(query)) {
}
}
我以上述方式将数据插入到大约15个表中。 现在,问题是,FMDatabaseQueue一个接一个地插入数据,这是它应该工作的方式。我正在使用FMDatabaseQueue来保证线程安全,因为我在前两个类中插入数据,并且不希望出现任何数据库锁定问题。
我的问题是,有没有办法让它成为一个并行进程,这样我就可以同时将数据插入到不同的表中。如果没有,请你指导我正确的道路,以达到更好的表现。 我也尝试过批量插入,但同时多次插入可能会导致数据库锁定。
感谢。
答案 0 :(得分:0)
你可以保留你自己的单例类和方法来在表中插入数据应该返回bool值来知道数据是否被插入。
如果数据存储在表中,那么您可以触发另一种方法来插入数据,理想情况下,您可以使用链来存储表中的数据。
像这样的Singleton类
导入基金会 class LocalDatabase:NSObject {
//sharedInstance
static let sharedInstance = LocalDatabase()
func methodToCreateDatabase() -> NSURL? {
let fileManager = NSFileManager.defaultManager()
let urls = fileManager.URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
if let documentDirectory:NSURL = urls.first { // No use of as? NSURL because let urls returns array of NSURL
// exclude cloud backup
do {
try documentDirectory.setResourceValue(true, forKey: NSURLIsExcludedFromBackupKey)
} catch _{
print("Failed to exclude backup")
}
// This is where the database should be in the documents directory
let finalDatabaseURL = documentDirectory.URLByAppendingPathComponent("contact.db")
if finalDatabaseURL.checkResourceIsReachableAndReturnError(nil) {
// The file already exists, so just return the URL
return finalDatabaseURL
} else {
// Copy the initial file from the application bundle to the documents directory
if let bundleURL = NSBundle.mainBundle().URLForResource("contact", withExtension: "db") {
do {
try fileManager.copyItemAtURL(bundleURL, toURL: finalDatabaseURL)
} catch _ {
print("Couldn't copy file to final location!")
}
} else {
print("Couldn't find initial database in the bundle!")
}
}
} else {
print("Couldn't get documents directory!")
}
return nil
}
func methodToInsertUpdateDeleteData(strQuery : String) -> Bool
{
// print("%@",String(methodToCreateDatabase()!.absoluteString))
let contactDB = FMDatabase(path: String(methodToCreateDatabase()!.absoluteString) )
if contactDB.open() {
let insertSQL = strQuery
let result = contactDB.executeUpdate(insertSQL,
withArgumentsInArray: nil)
if !result {
print("Failed to add contact")
print("Error: \(contactDB.lastErrorMessage())")
return false
} else {
print("Contact Added")
return true
}
} else {
print("Error: \(contactDB.lastErrorMessage())")
return false
}
}
func methodToSelectData(strQuery : String) -> NSMutableArray
{
let arryToReturn : NSMutableArray = []
print("%@",String(methodToCreateDatabase()!.absoluteString))
let contactDB = FMDatabase(path: String(methodToCreateDatabase()!.absoluteString) )
if contactDB.open() {
let querySQL = strQuery
let results:FMResultSet? = contactDB.executeQuery(querySQL,
withArgumentsInArray: nil)
while results?.next() == true
{
arryToReturn.addObject(results!.resultDictionary())
}
// NSLog("%@", arryToReturn)
if arryToReturn.count == 0
{
print("Record Not Found")
}
else
{
print("Record Found")
}
contactDB.close()
} else {
print("Error: \(contactDB.lastErrorMessage())")
}
return arryToReturn
}
}
从您的viewcontroller调用的方法
if LocalDatabase.sharedInstance.methodToInsertUpdateDeleteData("INSERT INTO CONTACTS_TABLE (name, address, phone) VALUES ('Demo1', 'Demo2', 123)")
{
NSLog("Store Successfully.")
}
else
{
NSLog("Failled to store in database.")
}
这是与FMDB连接的包装单例类
https://github.com/hasyapanchasara/SQLite_SingleManagerClass