aka Blue Posted September 6, 2016 Share Posted September 6, 2016 Buenas, estoy teniendo unos problemas con SQLite. Éste es el script que uso actualmente: local sql = dbConnect ( "sqlite" , "wallet.db" ) -- Create the connection local walletTable = dbQuery ( sql , "CREATE TABLE IF NOT EXISTS wallets (owner TEXT,money_inside TEXT)" ) local cartera = { } addEventHandler( "onPlayerLogin", root, function( ) local name = getPlayerName( source ) local qh = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = ?", name ) local result = dbPoll( qh, -1 ) if result then for i=1, #result do local data = result[i] local money_inside = data.money_inside cartera[ source ] = tonumber( money_inside ) end else cartera[ source ] = 0 end end ) addEventHandler( "onPlayerLogout", root, function( ) local name = getPlayerName( source ) local exists = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = "..name ) if exists then local cartera = cartera[ source ] if cartera then local result = dbFree ( dbQuery ( sql , "UPDATE wallets SET money_inside = ? WHERE owner = ?" , tonumber(cartera), name ) ) if result then outputChatBox( "Cantidad en cartera guardada: $"..cartera, source, 0, 255, 0 ) else outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", source, 255, 145, 0 ) end else outputChatBox( "No se te guardará la cartera, ya que no la has usado.", source, 255, 145, 0 ) end else local cartera = cartera[ source ] if cartera then local result = dbQuery ( sql , "INSERT INTO wallets (owner,money_inside) VALUES (?,?)", name, tonumber( cartera ) ) if result then outputChatBox( "Guardada la cantidad $"..cartera.." en la base de datos.", source, 0, 255, 0 ) else outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", source, 255, 145, 0 ) end else outputChatBox( "No se te guardará la cartera, ya que no la has usado.", source, 255, 145, 0 ) end end end ) addCommandHandler( "cartera", function( player, commandName, accion, cantidad ) local cantidad = tonumber( cantidad ) local account = getPlayerAccount( player ) if isGuestAccount( account ) then cartera[ player ] = 0 outputChatBox( "No puedes usar la cartera siendo invitado. Logueate", player, 255, 145, 0 ) else if cartera[ player ] == nil then cartera[ player ] = 0 end if accion == "guardar" then if cantidad then local cantidad_cartera = cartera[ player ] or 0 if cartera[ player ] == 0 then outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 ) outputChatBox( "• Genial! Acabas de usar tu cartera.", player, 0, 255, 0 ) cartera[ player ] = cantidad else outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 ) cartera[ player ] = cantidad_cartera + cantidad outputChatBox( "Cantidad total en la cartera: $"..cantidad_cartera+cantidad, player, 0, 255, 0 ) end else outputChatBox( 'Necesitas añadir una cantidad a guardar en la cartera', player, 255, 145, 0 ) end end end end ) He intentado solucionarlo de todas las formas posibles pero, no funciona. El problema es que, por lo visto "no se guarda en SQLite" o algo parecido. Es extraño el error, porque, al estar conectado, al desloguearse y al loguearse sigue la cantidad, pero al reconectar deslogueado, no se guarda. No entiendo lo que pasa. Link to comment
Bc# Posted September 6, 2016 Share Posted September 6, 2016 No es necesario guardar data cuando se desconecta un jugador si previamente ya habías guardado. Es recomendable que cada vez que se haga una variación en el dinero se guarde en la base de datos el cambio, ya que en cualquier momento puede caerse el servidor y los datos se pierden. Tienes el problema precisamente por esa razon, ya que el player al salir, no ejecuta el logout, sino que ejecuta el evento onPlayerQuit. Para solucionar esto, la mejor opción es que crees una función para leer y otra para guardar data. Así no tendrías que estar llamando a la base de datos en cada función. Link to comment
aka Blue Posted September 6, 2016 Author Share Posted September 6, 2016 Es la primera vez que me pongo 'seriamente' con SQLite, por lo cual, pues no entiendo muy bien. Gracias @Bc#, tomaré en cuenta lo que dijiste y haré dos funciones. De cargado y de guardado. Sigue igual. Se ve que el problema está en la función loadWalletData, no recibe correctamente los valores o qué se yo, no lo entiendo... local cartera = { } addEventHandler( "onResourceStart", resourceRoot, function( ) sql = dbConnect ( "sqlite" , "wallet.db" ) -- Create the connection walletTable = dbQuery ( sql , "CREATE TABLE IF NOT EXISTS wallets (owner TEXT,money_inside TEXT)" ) if sql and walletTable then outputDebugString( "Conectado SQLite para el recurso carteras" ) else outputDebugString( "No se puede conectar SQLite para el recurso de carteras" ) end end ) function saveWalletData( player ) local name = getPlayerName( player ) local exists = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = "..name ) if exists then local cartera = cartera[ player ] if cartera then local result = dbFree ( dbQuery ( sql , "UPDATE wallets SET money_inside = ? WHERE owner = ?" , tonumber(cartera), name ) ) if result then else outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", player, 255, 145, 0 ) end else outputChatBox( "No se te guardará la cartera, ya que no la has usado.", player, 255, 145, 0 ) end else local cartera = cartera[ player ] if cartera then local result = dbQuery ( sql , "INSERT INTO wallets (owner,money_inside) VALUES (?,?)", name, tonumber( cartera ) ) if result then else outputChatBox( "No se guardó la cantidad de la cartera en la base de datos.", player, 255, 145, 0 ) end else outputChatBox( "No se te guardará la cartera, ya que no la has usado.", player, 255, 145, 0 ) end end end function loadWalletData( player ) if cartera[ player ] == nil then cartera[ player ] = 0 end local name = getPlayerName( player ) local qh = dbQuery ( sql , "SELECT * FROM wallets WHERE owner = ?", name ) local result = dbPoll( qh, -1 ) if result then for i=1, #result do local data = result[i] local money_inside = data.money_inside cartera[ player ] = tonumber( money_inside ) end else cartera[ player ] = 0 end end addEventHandler( "onPlayerQuit", root, function( ) saveWalletData( source ) end ) addEventHandler( "onPlayerLogin", root, function( ) loadWalletData( source ) end ) addCommandHandler( "cartera", function( player, commandName, accion, cantidad ) local cantidad = tonumber( cantidad ) local account = getPlayerAccount( player ) if isGuestAccount( account ) then cartera[ player ] = 0 outputChatBox( "No puedes usar la cartera siendo invitado. Logueate", player, 255, 145, 0 ) else if cartera[ player ] == nil then cartera[ player ] = 0 end if accion == "guardar" then if cantidad then local cantidad_cartera = cartera[ player ] or 0 if cartera[ player ] == 0 then outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 ) cartera[ player ] = cantidad saveWalletData( player ) else outputChatBox( "Has guardado $"..cantidad.." de dinero en la cartera.", player, 0, 255, 0 ) cartera[ player ] = cantidad_cartera + cantidad outputChatBox( "Cantidad total en la cartera: $"..cantidad_cartera+cantidad, player, 0, 255, 0 ) end else outputChatBox( 'Necesitas añadir una cantidad a guardar en la cartera', player, 255, 145, 0 ) end end end end ) Link to comment
-Rex- Posted September 6, 2016 Share Posted September 6, 2016 A la columna de money_inside le pusiste como tipo de dato TEXT ( Texto o string ), ponlo como INTEGER Link to comment
aka Blue Posted September 6, 2016 Author Share Posted September 6, 2016 Vale, por lo visto ya funciona. Gracias @-Rex- y @Bc#. Pueden cerrar. Link to comment
Recommended Posts