swift - swift 5 中的 SQLite 实现?
问题描述
创建 PersonModel 类以将数据存储在 localObject 中
import Foundation
class PersonModel {
var name : String = ""
var age : Int = 0
var id : Int = 0
//初始化方法绑定数据
init(name : String , age : Int ,id:Int) {
self.name = name
self.age = age
self.id = id
}
}
创建 DBHelper 类以连接到数据库和其他功能
import SQLite3
class DBHelper
{
init()
{
db = openDatabase()
createTable()
}
let dbPath: String = "myDb.sqlite"
var db:OpaquePointer?
//打开数据库的函数
func openDatabase() -> OpaquePointer?
{
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false)
.appendingPathComponent(dbPath)
var db: OpaquePointer? = nil
if sqlite3_open(fileURL.path, &db) != SQLITE_OK
{
print("error opening database")
return nil
}
else
{
print("Successfully opened connection to database at \(dbPath)")
return db
}
}
创建表的函数
function createTable() {
let createTableString = "CREATE TABLE IF NOT EXISTS person(Id INTEGER PRIMARY KEY ,name TEXT ,age INTEGER);"
var createTableStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, createTableString, -1, &createTableStatement, nil) == SQLITE_OK
{
if sqlite3_step(createTableStatement) == SQLITE_DONE
{
print("person table created.")
} else {
print("person table could not be created.")
}
} else {
print("CREATE TABLE statement could not be prepared.")
}
sqlite3_finalize(createTableStatement)
}
func insert(id:Int, name:String, age:Int)
{
let persons = read()
for p in persons
{
if p.id == id
{
return
}
}
let insertStatementString = "INSERT INTO person (Id, name, age) VALUES (?, ?, ?);"
var insertStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {
sqlite3_bind_int(insertStatement, 1, Int32(id))
sqlite3_bind_text(insertStatement, 2, (name as NSString).utf8String, -1, nil)
sqlite3_bind_int(insertStatement, 3, Int32(age))
if sqlite3_step(insertStatement) == SQLITE_DONE {
print("Successfully inserted row.")
} else {
print("Could not insert row.")
}
} else {
print("INSERT statement could not be prepared.")
}
sqlite3_finalize(insertStatement)
}
获取数据的函数
func read() -> [PersonModel] {
let queryStatementString = "SELECT * FROM person;"
var queryStatement: OpaquePointer? = nil
var psns : [PersonModel] = []
if sqlite3_prepare_v2(db, queryStatementString, -1, &queryStatement, nil) == SQLITE_OK {
while sqlite3_step(queryStatement) == SQLITE_ROW {
let id = sqlite3_column_int(queryStatement, 0)
let name = String(describing: String(cString: sqlite3_column_text(queryStatement, 1)))
let year = sqlite3_column_int(queryStatement, 2)
psns.append(PersonModel(name: name, age: Int(year), id: Int(id)))
print("Query Result:")
print("\(id) | \(name) | \(year)")
}
} else {
print("SELECT statement could not be prepared")
}
sqlite3_finalize(queryStatement)
return psns
}
func deleteByID(id:Int) {
let deleteStatementStirng = "DELETE FROM person WHERE Id = ?;"
var deleteStatement: OpaquePointer? = nil
if sqlite3_prepare_v2(db, deleteStatementStirng, -1, &deleteStatement, nil) == SQLITE_OK {
sqlite3_bind_int(deleteStatement, 1, Int32(id))
if sqlite3_step(deleteStatement) == SQLITE_DONE {
print("Successfully deleted row.")
} else {
print("Could not delete row.")
}
} else {
print("DELETE statement could not be prepared")
}
sqlite3_finalize(deleteStatement)
}
}
创建控制器类来表示 UIGraphics 上的数据
import UIKit
class HomeController: UIViewController {
@IBOutlet weak var personTableView: UITableView!
var persons:[PersonModel] = []
var db:DBHelper = DBHelper()
override func viewDidLoad() {
super.viewDidLoad()
//向数据库中插入数据
db.insert(id: 1, name: "Bilal", age: 24)
db.insert(id: 2, name: "Bosh", age: 25)
db.insert(id: 3, name: "Thor", age: 23)
db.insert(id: 4, name: "Edward", age: 44)
db.insert(id: 5, name: "Ronaldo", age: 34)
persons = db.read()
personTableView.reloadData()
}
}
extension HomeController : UITableViewDelegate, UITableViewDataSource {
function tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
{
return persons.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
let identifier = "PersonCell"
var cell: PersonCell! = tableView.dequeueReusableCell(withIdentifier: identifier) as? PersonCell
if cell == nil {
tableView.register(UINib(nibName: "PersonCell", bundle: nil), forCellReuseIdentifier: identifier)
cell = tableView.dequeueReusableCell(withIdentifier: identifier) as? PersonCell
}
cell.idLabel.text = "\(persons[indexPath.row].id)"
cell.ageLabel.text = "\(persons[indexPath.row].age)"
cell.nameLabel.text = "\(persons[indexPath.row].name)"
return cell
}
function tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
return 100
}
}
解决方案
推荐阅读
- php - 从类中导入和别名静态方法
- java - 如何在跟踪进位的同时获得两个数组的总和(如 java 中的 bigInt)?
- android - 我看不到我在布局活动中添加的图片
- regex - 在 PowerShell 中查找和替换字符串的问题
- excel - 添加以日期为名称的工作表
- java - 如果不匹配,则从 ArrayList 流式传输返回 null 错误
- html - 如何实现/上传我自己的html和css代码到weebly?
- ruby-on-rails - 如何将黄瓜与铁轨分开运行?
- javascript - webpack编译后如何告诉主要的nodejs脚本?
- android - 如何在 Android Studio 中修复此错误:“原因:无效类型代码:00”?