sqlite 查询现有的Db表

ioekq8ef  于 6个月前  发布在  SQLite
关注(0)|答案(3)|浏览(84)

我现在正在学习SQLite.swift,并且正在阅读它的文档。我正在尝试查询一个我已经拥有的现有表,但不知道如何做到这一点。在文档中,它展示了如何查询创建的表(如下所示https://github.com/stephencelis/SQLite.swift/blob/master/Documentation/Index.md#selecting-rows)

let users = Table("users")
try db.run(users.create { t in     // CREATE TABLE "users" (
t.column(id, primaryKey: true) //     "id" INTEGER PRIMARY KEY NOT NULL,
t.column(email, unique: true)  //     "email" TEXT UNIQUE NOT NULL,
t.column(name)                 //     "name" TEXT
})  
                           // )
for user in try db.prepare(users) {
print("id: \(user[id]), email: \(user[email]), name: \(user[name])")
// id: 1, email: [email protected], name: Optional("Alice")
}
// SELECT * FROM "users"

字符串
我有一个现有的表,我能够连接到它,但唯一的方法,我能够获得信息,从它是通过执行db.scalar,但不知道这是不是正确的方式这样做。

let home = FileManager.default.homeDirectoryForCurrentUser
let dbURL = "Desktop/MyPracticeCode/EpubParser/"
let myPath = home.appendingPathComponent(dbURL)
let db = try Connection("\(myPath)/TestTable.sqlite3")
print(db.scalar("SELECT WtName FROM MyTable"))


这打印出我需要的数据,但不确定这是否是正确的方法。有没有一种方法可以将我现有的表分配给一个类型“表”,并像示例中那样查询它。我在网上到处搜索,但找不到一个明确的答案。谢谢

e0uiprwp

e0uiprwp1#

我设法找出了答案。如果有人遇到这个问题或同样的问题,这是我设法解决它的方法。仍然不确定它是否是正确的方法。基本上,你需要像示例中一样用列重新创建表,但要使用列的名称。创建一个表,并将其命名为与数据库中的表相同的名称。下面是我是如何做到的

let id = Expression<Int64>("id")
let Article = Expression<String?>("Article")
let ArticleName = Expression<String?>("ArticleName")
let ImageThumbnail = Expression<String?>("ImageThumbnail")
let WtCoverImage = Expression<String?>("WtCoverImage")
let myTable = Table("MyTable")
try db.run(myTable.create(ifNotExists: true){ t in
  t.column(id,primaryKey: true)
  t.column(Article)
  t.column(ArticleName)
  t.column(ImageThumbnail)
  t.column(WtCoverImage)
 })

字符串
这是我使用的:

try db.run(users.create(ifNotExists: true) { t in /* ... */ })
// CREATE TABLE "users" IF NOT EXISTS -- ...


现在我可以这样查询它

for myData in try db.prepare(myTable){
print("WtCoverImage\(myData[WtCoverImage])")
}

g0czyy6m

g0czyy6m2#

class SqliteDB{
    static let shared:SqliteDB = SqliteDB()
    private init(){}
    
    var DB:Connection!
    
    /// path for creat a databased file.
    func createDBPath(){
        do {
            let dbPath = try FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("chatDB.sqlite").path
            DB = try Connection(dbPath)
            print(dbPath)

        } catch {
            print(error.localizedDescription)
        }
    }
    
    func dbTables_ChatMessage(){
        let tableQuery = """
           CREATE TABLE IF NOT EXISTS message_list (id INTEGER, conversation_id INTEGER UNIQUE, conversation_recipient_id INTEGER, timestamp INTEGER UNIQUE, content_type TEXT, message TEXT, user_id INTEGER, user_name TEXT, group_id INTEGER,isOnline TEXT,room_id INTEGER, local_conversation_id INTEGER ,room_unique_id TEXT,PRIMARY KEY(id AUTOINCREMENT))
          """
        do {
            try DB.run(tableQuery)
        } catch  {
            print(error.localizedDescription)
        }
    }
}

字符串

kq4fsx7k

kq4fsx7k3#

我的解决方案,使其工作,而不必创建一个新的数据库根据Nbera的答案。
1.在DB Browser for SQlite中打开数据库文件
1.将生成两个文件(dataBase.db-shm和dataBase.db-wal)
1.将这3个文件复制到您的解决方案中。
跟着...

let seededDataUrl = Bundle.main.url(forResource: "dataBase", withExtension: "db")
 db = try Connection(seededDataUrl!.path())

for myData in try db.prepare(myTable){
print("WtCoverImage\(myData[WtCoverImage])")
}

字符串
享受

相关问题