Italian Modifica DataBase DirInternal

Fulvio75

Well-Known Member
Licensed User
Ciao a tutti, come da titolo dovrei modificare un db che risiede nella DirInternal dell'app al quale ho aggiunto un campo.
Come posso procedere? Visto che il db è in assets e quando l'app viene installata per la prima volta esso viene preso da lì, vorrei cancellarlo all'interno della DirInternal e metterci quello nuovo modificato che si trova in dirassets, il problema è che l'app che è già installata dovrebbe cancellarlo una sola volta per reinserire quello nuovo modificato, ovviamente prima di avviarsi.
Come posso fare?
 

Star-Dust

Expert
Licensed User
Longtime User
Nel db non hai messo un tabella con un campo che contiene la versione?

Se non lo hai fatto, semplicemente cambia nome al DB. Chiamalo db1.1 È se non c'è in dirInternal allora lo copi dall'Assets.

Oppure aggiungi il campo da codice dopo aver verificato che non esiste
 

Fulvio75

Well-Known Member
Licensed User
Trovato:

PRAGMA user_version

la modifico ogni volta... ma il db viene sostituito automaticamente oppure scrivo l'istruzione sql per PRAGMA user_version e la confronto con l'attule e copio sopra il nuovo db al vecchio?
 

giannimaione

Well-Known Member
Licensed User
Longtime User
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
 

Star-Dust

Expert
Licensed User
Longtime User
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
il database deve essere gestito da codice!
Mi sorge un a domanda, i database come dev'essere gestito?
 

Star-Dust

Expert
Licensed User
Longtime User
Trovato:

PRAGMA user_version

la modifico ogni volta... ma il db viene sostituito automaticamente oppure scrivo l'istruzione sql per PRAGMA user_version e la confronto con l'attule e copio sopra il nuovo db al vecchio?
Ogni avvio verifichi se c'è il campo altrimenti lo aggiungi. Comunque se lo aggiungi e già c'è con try catch intercetti l'errore e vai avanti...
 

Fulvio75

Well-Known Member
Licensed User
Si questo è un campo ma se aggiungo una tabella oppure modifico dei dati devo copiarla nuova
 

giannimaione

Well-Known Member
Licensed User
Longtime User
Mi sorge un a domanda, i database come dev'essere gestito?
B4X:
sql.Initialize (File.DirInternal, Starter.nomeDB, True)
    Dim cmd As String
    cmd = "PRAGMA foreign_keys = ON"
    sql.ExecNonQuery(cmd)
    '
    cmd = "PRAGMA auto_vacuum = '1'"
    sql.ExecNonQuery(cmd)
    cmd=$"create table if not exists fornitori (
    "id" INTEGER,
    "nome" TEXT
    )"$
    sql.ExecNonQuery(cmd)
    '
    'posizione: 0=articolo NON preferito | 1=articolo preferito
    cmd=$"create table if not exists articoli (
    "id" INTEGER,
    "codice" TEXT,
    "descrizione" TEXT,
    "peso" TEXT,
    "idfornitore" INTEGER,
    "posizione" INTEGER,
    "note" TEXT,
    "unita" TEXT,
    "idcliente" TEXT)"$
    sql.ExecNonQuery(cmd)
    '
    cmd = "pragma table_info('articoli')"
    Dim rs As Cursor
    rs = sql.ExecQuery(cmd)
    Dim note_esiste As Boolean = False
    Dim unita_esiste As Boolean = False
    Dim id_cliente As Boolean = False
    For i = 0 To rs.RowCount - 1
        rs.Position = i
        If rs.GetString("name") = "note" Then
            note_esiste = True
        End If
        If rs.GetString("name") = "unita" Then
            unita_esiste = True
        End If
        If rs.GetString("name") = "idcliente" Then
            id_cliente = True
        End If
    Next
    rs.Close
    If note_esiste = False Then
        cmd = "alter table articoli add note TEXT"
        sql.ExecNonQuery (cmd)
    End If
    '
    If unita_esiste = False Then
        cmd = "alter table articoli add unita TEXT"
        sql.ExecNonQuery (cmd)
    End If
    '
    If id_cliente = False Then
        cmd = "alter table articoli add idcliente text"
        sql.ExecNonQuery (cmd)
    End If
    '
    cmd=$"create table if not exists preordine (
    "idart" INTEGER,
    "qta" TEXT,
    "annotazioni" TEXT
    )"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"CREATE UNIQUE INDEX IF NOT EXISTS "xpreordine" ON "preordine" ("idart")"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"CREATE TABLE if not exists ordini (
    "id" INTEGER Not Null UNIQUE,
    "idcliente" TEXT,
    "dataord" TEXT,
    "annotazioni" TEXT,
    "inviato" INTEGER,
    "idordine" INTEGER,
    PRIMARY KEY("id" AUTOINCREMENT)
    )"$
    sql.ExecNonQuery(cmd)
    ''''''''''''''''''''''''''''''''''''''
    cmd = "pragma table_info('ordini')"
    Dim rs As Cursor
    rs = sql.ExecQuery(cmd)
    Dim idOrdine_esiste As Boolean = False
    For i = 0 To rs.RowCount - 1
        rs.Position = i
        If rs.GetString("name") = "idordine" Then
            idOrdine_esiste = True
        End If
    Next
    rs.Close
    If idOrdine_esiste = False Then
        cmd = "alter table ordini add idordine INTEGER"
        'Log(cmd)
        sql.ExecNonQuery (cmd)
    End If
    ''''''''''''''''''''''''''''''''''''''
    cmd=$"create table if not exists rigoordini (
    "id" INTEGER Not Null UNIQUE,
    "idordini" INTEGER,
    "idcliente" TEXT,
    "idart" INTEGER,
    "qta" TEXT,
    "annotazioni" TEXT,
    "inviato" INTEGER,
    "unita" TEXT,
    PRIMARY KEY("id" AUTOINCREMENT)
    )"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"create table if not exists unita (
    "id" INTEGER,
    "um" text)"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"CREATE TABLE if not exists progressivo (
    "id" INTEGER Not Null UNIQUE,
    PRIMARY KEY("id" AUTOINCREMENT)
    )"$
    sql.ExecNonQuery(cmd)
    sql.Close
 

Star-Dust

Expert
Licensed User
Longtime User
B4X:
sql.Initialize (File.DirInternal, Starter.nomeDB, True)
    Dim cmd As String
    cmd = "PRAGMA foreign_keys = ON"
    sql.ExecNonQuery(cmd)
    '
    cmd = "PRAGMA auto_vacuum = '1'"
    sql.ExecNonQuery(cmd)
    cmd=$"create table if not exists fornitori (
    "id" INTEGER,
    "nome" TEXT
    )"$
    sql.ExecNonQuery(cmd)
    '
    'posizione: 0=articolo NON preferito | 1=articolo preferito
    cmd=$"create table if not exists articoli (
    "id" INTEGER,
    "codice" TEXT,
    "descrizione" TEXT,
    "peso" TEXT,
    "idfornitore" INTEGER,
    "posizione" INTEGER,
    "note" TEXT,
    "unita" TEXT,
    "idcliente" TEXT)"$
    sql.ExecNonQuery(cmd)
    '
    cmd = "pragma table_info('articoli')"
    Dim rs As Cursor
    rs = sql.ExecQuery(cmd)
    Dim note_esiste As Boolean = False
    Dim unita_esiste As Boolean = False
    Dim id_cliente As Boolean = False
    For i = 0 To rs.RowCount - 1
        rs.Position = i
        If rs.GetString("name") = "note" Then
            note_esiste = True
        End If
        If rs.GetString("name") = "unita" Then
            unita_esiste = True
        End If
        If rs.GetString("name") = "idcliente" Then
            id_cliente = True
        End If
    Next
    rs.Close
    If note_esiste = False Then
        cmd = "alter table articoli add note TEXT"
        sql.ExecNonQuery (cmd)
    End If
    '
    If unita_esiste = False Then
        cmd = "alter table articoli add unita TEXT"
        sql.ExecNonQuery (cmd)
    End If
    '
    If id_cliente = False Then
        cmd = "alter table articoli add idcliente text"
        sql.ExecNonQuery (cmd)
    End If
    '
    cmd=$"create table if not exists preordine (
    "idart" INTEGER,
    "qta" TEXT,
    "annotazioni" TEXT
    )"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"CREATE UNIQUE INDEX IF NOT EXISTS "xpreordine" ON "preordine" ("idart")"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"CREATE TABLE if not exists ordini (
    "id" INTEGER Not Null UNIQUE,
    "idcliente" TEXT,
    "dataord" TEXT,
    "annotazioni" TEXT,
    "inviato" INTEGER,
    "idordine" INTEGER,
    PRIMARY KEY("id" AUTOINCREMENT)
    )"$
    sql.ExecNonQuery(cmd)
    ''''''''''''''''''''''''''''''''''''''
    cmd = "pragma table_info('ordini')"
    Dim rs As Cursor
    rs = sql.ExecQuery(cmd)
    Dim idOrdine_esiste As Boolean = False
    For i = 0 To rs.RowCount - 1
        rs.Position = i
        If rs.GetString("name") = "idordine" Then
            idOrdine_esiste = True
        End If
    Next
    rs.Close
    If idOrdine_esiste = False Then
        cmd = "alter table ordini add idordine INTEGER"
        'Log(cmd)
        sql.ExecNonQuery (cmd)
    End If
    ''''''''''''''''''''''''''''''''''''''
    cmd=$"create table if not exists rigoordini (
    "id" INTEGER Not Null UNIQUE,
    "idordini" INTEGER,
    "idcliente" TEXT,
    "idart" INTEGER,
    "qta" TEXT,
    "annotazioni" TEXT,
    "inviato" INTEGER,
    "unita" TEXT,
    PRIMARY KEY("id" AUTOINCREMENT)
    )"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"create table if not exists unita (
    "id" INTEGER,
    "um" text)"$
    sql.ExecNonQuery(cmd)
    '
    cmd = $"CREATE TABLE if not exists progressivo (
    "id" INTEGER Not Null UNIQUE,
    PRIMARY KEY("id" AUTOINCREMENT)
    )"$
    sql.ExecNonQuery(cmd)
    sql.Close
Era una battura
 

giannimaione

Well-Known Member
Licensed User
Longtime User
Dim cmd As String
nooooo, B4I mi segnala un errore nell'utilizzo di "cmd"; certo che a fantasia sono forte!
da ora in poi "strCMD as String" al posto di una misera "cmd"
 

Alessandro71

Well-Known Member
Licensed User
Longtime User
Perché? Che errore?
alcune keywords sono riservare in B4i

 

udg

Expert
Licensed User
Longtime User
Avevo pubblicato un paio di funzioni per aggiornare un db da codice. Prova a cercare. Probabilmente nella sezione tutorial. Scusa ma sono sul cellulare e sarebbe un po' scomodo cercare, copiare ed incollare il link.
 

Fulvio75

Well-Known Member
Licensed User
Ho optato per il PRAGMA user_version controllando quella in dirassets e quella nel db effettivo in DirInternal, il db contiene solo dati dell'app.
Funziona perfettamente
 
Top