使用Corona SDK模拟器将数据插入sqlite数据库

时间:2014-04-29 17:02:41

标签: sqlite insert lua corona

我可以使用corona SDK模拟器查询SQLlite数据库中的数据,但无法插入或删除数据。我正在运行Corona SDK的最新公开发布。这是代码。它编译得很好,但插入命令根本不起作用。这是main.lua的代码:

local sqlite3 = require "sqlite3"

local function setUpDatabase(dbName)

local path = system.pathForFile( dbName, system.DocumentsDirectory )
local file = io.open( path, "r" )

if ( file == nil ) then
    -- copy the database file if doesn't exist
    local pathSource     = system.pathForFile( dbName, system.ResourceDirectory )
    local fileSource     = io.open( pathSource, "r" )
    local contentsSource = fileSource:read( "*a" )

    local pathDest = system.pathForFile( dbName, system.DocumentsDirectory )
    local fileDest = io.open( pathDest, "w" )
    fileDest:write( contentsSource )

    io.close( fileSource )
    io.close( fileDest )
end

local gameDB = system.pathForFile(dbName, system.DocumentsDirectory)
local dbNew = sqlite3.open( gameDB )

return dbNew

end

function loadData()
    local sql = "select * from projects"
    local projects = {}

    for a in db:nrows(sql) do
        projects[#projects+1] =
        {
        id = a.id,
        name = a.name,
        category = a.category,
        rating = a.rating
        }
    end

    return projects
end

function insertData(n, c, r)
    local sql = "insert into projects (name, category, rating) values ('" .. n .. "', '" .. c .. "', " .. r .. ")"
   db:exec(sql)
end

function deleteData(id)
    local sql = "delete from projects where id = " .. tostring(id)
    db:exec(sql)
end

function updateData(id, col, v)
    local sql = "update projects set " .. col .. " = '" .. v .. "' where id = " .. tostring(id)
    db:exec(sql)
end

db = setUpDatabase("mydatabase.sqlite")
insertData("Horse Crazy", "Game", 2)

deleteData(3)
--updateData(4, "name", "Ralph")
--updateData(4, "category", "Dog")
--updateData(4, "rating", 4)

local data = loadData()

for x = 1, #data do
    print (data[x].id, data[x].name, data[x].category, data[x].rating)
end

2 个答案:

答案 0 :(得分:0)

在一段时间遇到同样的问题之后才弄明白。 你必须替换这一行

local sql = [[delete from projects WHERE ID = ']]..id..[[';]]
db:exec(sql)

确保id是一个数字,否则只需通过在第一行之前添加它来使其成为数字:

id=id*1

答案 1 :(得分:0)

原因是您的模拟器中的system.DocumentsDirectory文件已被读取,但此文件未包含在您的设备系统中.DocumentsDirectory。当您的设备上运行该应用时,您必须再次创建此文件。