Spanish ¿ Como creo una DB SQLite por codigo desde la propia APP ?

Sergio Castellari

Active Member
Licensed User
Hola gente,

Necesito saber como puedo crear una DB SQLite desde la APP. De tal manera que al iniciar la APP, verifique la existencia de la DB, y si la misma no existe, la cree y que incluso pueda agregar informacion predeterminada.
He estado buscando informacion sobre SQLite, pero todo lo que encuentro da por sentado que la DB ya existe.
Quiero saber como agregar Tablas e indices, ademas de agregar, borrar y modificar registros. En principio la idea es para poder 'configurar' la APP con distintos parametros.

Saludos,
Sergio
 

EnriqueGonzalez

Well-Known Member
Licensed User
Longtime User
Sqlite es una base de tipo archivo por lo que tu puedes:

Crearla con sql.initialize (pasa el tercer parametro como true)

Verificar que existe con file.exists

Crear las tablas mandado a llamar simples CREATE TABLE
 

roberto64

Active Member
Licensed User
Longtime User
Tal vez estabas buscando esto
B4X:
        'check if the database already exists
        If File.Exists(File.DirInternal, "persons.db") = False Then
            'if not, initialize it 
            SQL1.Initialize(File.DirInternal, "persons.db", True)
            'and create it
            CreateDataBase
        Else
            'if yes, initialize it
            SQL1.Initialize(File.DirInternal, "persons.db", True)
        End If
Private sub CreateDatabase()
Private Query As String
    
    'create the database with 3 columns
    Query = "CREATE TABLE persons (FirstName TEXT, LastName TEXT, City TEXT)"
    SQL1.ExecNonQuery(Query)

    'Fill a few entries
    Query = "INSERT INTO persons VALUES (?, ?, ?)"
    SQL1.ExecNonQuery2(Query, Array As Object("John", "KENNEDY", "New York"))
    SQL1.ExecNonQuery2(Query, Array As Object("Peter", "FALK", "Los Angeles"))
    SQL1.ExecNonQuery2(Query, Array As Object("Jack", "LONDON", "Seattle"))
    SQL1.ExecNonQuery2(Query, Array As Object("Ronald", "REGAN", "Los Angeles"))
End Sub

Saludos,
Roberto
Sergio
 

Sergio Castellari

Active Member
Licensed User
Tal vez estabas buscando esto
B4X:
        'check if the database already exists
        If File.Exists(File.DirInternal, "persons.db") = False Then
            'if not, initialize it
            SQL1.Initialize(File.DirInternal, "persons.db", True)
            'and create it
            CreateDataBase
        Else
            'if yes, initialize it
            SQL1.Initialize(File.DirInternal, "persons.db", True)
        End If
Private sub CreateDatabase()
Private Query As String
   
    'create the database with 3 columns
    Query = "CREATE TABLE persons (FirstName TEXT, LastName TEXT, City TEXT)"
    SQL1.ExecNonQuery(Query)

    'Fill a few entries
    Query = "INSERT INTO persons VALUES (?, ?, ?)"
    SQL1.ExecNonQuery2(Query, Array As Object("John", "KENNEDY", "New York"))
    SQL1.ExecNonQuery2(Query, Array As Object("Peter", "FALK", "Los Angeles"))
    SQL1.ExecNonQuery2(Query, Array As Object("Jack", "LONDON", "Seattle"))
    SQL1.ExecNonQuery2(Query, Array As Object("Ronald", "REGAN", "Los Angeles"))
End Sub

Saludos,
Roberto
Sergio

Hola @Enrique Gonzalez R y @roberto64 !!!

¡ Exactamente esto es lo que queria implementar !
He visto por ahi, que se debe hacer desde [starter] ¿Es lo correcto?
¿La carpeta ideal para que tenga persistencia en el tiempo es File.DirInternal ? ¿Y el tema permisos de Android es necesario?

Arme este codigo y funciona!!!

B4X:
Sub Process_Globals
   'These global variables will be declared once when the application starts.
   'These variables can be accessed from all modules.
  Dim DB         As SQL
  Dim DBFileDir  As String = File.DirInternal
  Dim DBFileName As String = "APP.db"
End Sub

Sub Service_Create
   'This is the program entry point.
   'This is a good place to load resources that are not specific to a single activity.
  If File.Exists(DBFileDir, DBFileName) Then
    'ReadData
       Log("DB existente...")
  Else
    CreateDB
  End If

End Sub

Sub CreateDB
   Try
    DB.Initialize(DBFileDir, DBFileName, True)
    DB.ExecNonQuery("Create Table PARAMETROS (APPNOMBRE Text, VERSION Integer)") 'refer section 2.1.3 of SQL Booklet regarding INTEGER Primary Key
    DB.ExecNonQuery("Insert Into PARAMETROS (APPNOMBRE,VERSION) Values ('TomaEstado','1')")
       Log("DB creada correctamente !!!")
   Catch
       LogColor("[Starter] CreateDB: " & LastException.Message, Colors.Red)
   End Try
End Sub

¿Esta bien lo que codifique o le falta algun control o verificación?

Saludos y muchas gracias!!!
Sergio
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola, espero te sirva esto

B4X:
Dim s As SQL
ruta = File.DirInternal
s.Initialize(ruta, "datosavl.db3", True)
CreaTablas

Sub CreaTablas
    'Crea Tablas Base de datos si no existen
            
    s.ExecNonQuery($"CREATE TABLE IF NOT EXISTS tareas (
                      id_tarea INTEGER PRIMARY KEY AUTOINCREMENT,
                      nombre_tarea TEXT,
                      id_em INTEGER,
                      nombre_em TEXT,
                      fecha DATETIME);"$)

End Sub
 

Sergio Castellari

Active Member
Licensed User
Hola, espero te sirva esto

B4X:
Dim s As SQL
ruta = File.DirInternal
s.Initialize(ruta, "datosavl.db3", True)
CreaTablas

Sub CreaTablas
    'Crea Tablas Base de datos si no existen
           
    s.ExecNonQuery($"CREATE TABLE IF NOT EXISTS tareas (
                      id_tarea INTEGER PRIMARY KEY AUTOINCREMENT,
                      nombre_tarea TEXT,
                      id_em INTEGER,
                      nombre_em TEXT,
                      fecha DATETIME);"$)

End Sub

Hola @rscheel !!!

Muchas gracias, veo que hay varias formas de crear Tablas. Aqui tu la creas usando un Query desde otra forma. ¿Que significa que le coloques el signo $ antes y al final ?. Ademas veo que le colocas el ;. ESA FORMA yo la utilizo (de forma similar) cuando lo utilizo en MySQL desde un utilitario.

Saludos,
Sergio
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola @rscheel !!!

Muchas gracias, veo que hay varias formas de crear Tablas. Aqui tu la creas usando un Query desde otra forma. ¿Que significa que le coloques el signo $ antes y al final ?. Ademas veo que le colocas el ;. ESA FORMA yo la utilizo (de forma similar) cuando lo utilizo en MySQL desde un utilitario.

Saludos,
Sergio

El signo peso es para string literal, te permite crear varias lineas sin necesidad de concatenar, el ";" es para terminar el query, básicamente SQLite es similar a MySql, por decir "CREATE TABLE" es la sentencia para crear la tabla a través de query directamente, yo uso esa forma, siempre me ha funcionado bien.

Ademas esta forma te permite ir agregando las tablas a medida de que avanza tu proyecto, incluso podrías colocar versiones de base de datos, donde puedas agregar campos a una tabla etc.

Espero te sirva, lo mejor es siempre usar el método que mas te acomode, en este caso hay varias formas distintas de hacer lo mismo.
 
Top