Autore Topic: Definizione database in caso di foreign key  (Letto 1492 volte)

Offline androider

  • Translate Team
  • Utente normale
  • ***
  • Post: 261
  • In campo come nella vita.
  • Respect: +1
    • andreadannibale
    • andreadevil
    • Mostra profilo
    • AnAndroider
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    AnAnApps
  • Sistema operativo:
    Mac Os X Snow Leopard
Definizione database in caso di foreign key
« il: 04 Ottobre 2010, 11:59:20 CEST »
0
Il problema è questo: ho una prima tabella "Profilo" in cui ho un attributo che referenzia la chiave primaria di una seconda tabella.
Il punto è che non riesco a tradurre tutto questo in codice, qualcuno può aiutarmi?
Se i cosiddetti "migliori" di noi avessero il coraggio di
sottovalutarsi almeno un po' vivremmo in un mondo infinitamente migliore.

In ogni cAso nessun rimorso.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Definizione database in caso di foreign key
« Risposta #1 il: 04 Ottobre 2010, 12:33:36 CEST »
0
Cosa intendi dire che non riesci a tradurre tutto questo in codice?
Parli di java? di sql?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Definizione database in caso di foreign key
« Risposta #2 il: 04 Ottobre 2010, 12:37:37 CEST »
0
Qui dovresti trovare supporto: SQLite Foreign Key Support

Offline androider

  • Translate Team
  • Utente normale
  • ***
  • Post: 261
  • In campo come nella vita.
  • Respect: +1
    • andreadannibale
    • andreadevil
    • Mostra profilo
    • AnAndroider
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    AnAnApps
  • Sistema operativo:
    Mac Os X Snow Leopard
Re:Definizione database in caso di foreign key
« Risposta #3 il: 04 Ottobre 2010, 12:40:57 CEST »
0
Cosa intendi dire che non riesci a tradurre tutto questo in codice?
Parli di java? di sql?

Parlo di java
Se i cosiddetti "migliori" di noi avessero il coraggio di
sottovalutarsi almeno un po' vivremmo in un mondo infinitamente migliore.

In ogni cAso nessun rimorso.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Definizione database in caso di foreign key
« Risposta #4 il: 04 Ottobre 2010, 12:47:04 CEST »
0
Ok. Ma precisamente quali sono i problemi che incontri?
Te lo chiedo perché vorrei capire cosa vuoi di preciso.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline androider

  • Translate Team
  • Utente normale
  • ***
  • Post: 261
  • In campo come nella vita.
  • Respect: +1
    • andreadannibale
    • andreadevil
    • Mostra profilo
    • AnAndroider
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    AnAnApps
  • Sistema operativo:
    Mac Os X Snow Leopard
Re:Definizione database in caso di foreign key
« Risposta #5 il: 04 Ottobre 2010, 12:53:49 CEST »
0
Codice (Java): [Seleziona]
    static class ProfileMetaData {  // i metadati della tabella, accessibili ovunque
            static final String PROFILES_TABLE = "profiles";
            static final String PRODUCT_NAME_KEY = "name";
            static final String PRODUCT_TEAM_KEY = "team";
            static final String MATCH= "partita";
    }
   
    static class Match {  // i metadati della tabella, accessibili ovunque
        static final String MATCH_TABLE = "partite";
        static final String ID = "_id";
        static final String ASSIST = "assist";
        static final String GOL = "gol";
        static final String MINUTI_GIOCATI = "time";
        static final String VOTO= "voto";
        static final String YELLOW= "giallo";
        static final String RED= "rosso";

}
   
    private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                    + ProfileMetaData.PROFILES_TABLE + " ("
                    + ProfileMetaData.MATCH+ " _id, references MATCH(id) "
                    + ProfileMetaData.PRODUCT_NAME_KEY + " text not null,primary key "
                    + ProfileMetaData.PRODUCT_TEAM_KEY + " text not null);";
   
   
    private static final String MATCH_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
        + Match.MATCH_TABLE + " ("
        + Match.ID+ " text not null, primary key"
        + Match.ASSIST + " integer "
        + Match.MINUTI_GIOCATI + " text  "
        + Match.RED + "integer "
        + Match.VOTO + " text  "
        + Match.YELLOW + " text  "
        + Match.GOL + " integer);";

Queste sono le tabelle ancora abbastanza incasinate. Allora il primo problema è come faccio a creare tutte e due le tabelle con questa istruzione?
Codice (Java): [Seleziona]
 public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                    _db.execSQL(PRODUCTS_TABLE_CREATE);
            }

Secondo problema:
Codice (Java): [Seleziona]
  public void insertProfile(String name,String team){ //metodo per inserire i dati
            ContentValues cv=new ContentValues();
            cv.put(ProfileMetaData.PRODUCT_NAME_KEY, name);
            cv.put(ProfileMetaData.PRODUCT_TEAM_KEY, team);
            mDb.insert(ProfileMetaData.PROFILES_TABLE, null, cv);
    }
Quando inserisco un nuovo profilo creo la tabella, ma sul campo match cosa ci metto? come faccio a fare in modo che si completi automaticamente con l'inserimento delle varie partite? mi crea problemi se lo lascio vuoto?

scusate ma sono molto inesperto
Se i cosiddetti "migliori" di noi avessero il coraggio di
sottovalutarsi almeno un po' vivremmo in un mondo infinitamente migliore.

In ogni cAso nessun rimorso.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Definizione database in caso di foreign key
« Risposta #6 il: 04 Ottobre 2010, 13:10:38 CEST »
0
In fase di creazione delle tabelle non dovrebbero esserci problemi nell'impostazione di foreign-key.
Per quanto riguarda il primo problema, hai provato a chiamare in sequenza la creazione della tabella partita e successivamente quella di profiles? Così profiles non dovrebbe avere problemi a referenziare partita.

Per quanto riguarda il secondo problema, in fase di select devi fare una join e quindi tirarti fuori i risultati che ti servono.
In fase di inserimento, visto che ti serve la chiave di partita che caratterizza la tua informazione, devi avere questo valore da inserire, altrimenti che senso ha?
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline androider

  • Translate Team
  • Utente normale
  • ***
  • Post: 261
  • In campo come nella vita.
  • Respect: +1
    • andreadannibale
    • andreadevil
    • Mostra profilo
    • AnAndroider
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    AnAnApps
  • Sistema operativo:
    Mac Os X Snow Leopard
Re:Definizione database in caso di foreign key
« Risposta #7 il: 04 Ottobre 2010, 13:14:36 CEST »
0

Per quanto riguarda il primo problema, hai provato a chiamare in sequenza la creazione della tabella partita e successivamente quella di profiles? Così profiles non dovrebbe avere problemi a referenziare partita.



Non posso creare prima la tabella partita se non ho creato il profilo...
Se i cosiddetti "migliori" di noi avessero il coraggio di
sottovalutarsi almeno un po' vivremmo in un mondo infinitamente migliore.

In ogni cAso nessun rimorso.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Definizione database in caso di foreign key
« Risposta #8 il: 04 Ottobre 2010, 13:51:17 CEST »
0
scusa.
Se creiamo le tabelle in quell'ordine non dovrebbero esserci problemi.
Il problema dovrebbe presentarsi nel momento in cui tu fai un inserimento in una e non trova il riferimento nell'altra.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline androider

  • Translate Team
  • Utente normale
  • ***
  • Post: 261
  • In campo come nella vita.
  • Respect: +1
    • andreadannibale
    • andreadevil
    • Mostra profilo
    • AnAndroider
  • Dispositivo Android:
    Nexus One
  • Play Store ID:
    AnAnApps
  • Sistema operativo:
    Mac Os X Snow Leopard
Re:Definizione database in caso di foreign key
« Risposta #9 il: 04 Ottobre 2010, 15:33:05 CEST »
0
Ho dato una sistemata ed ora l'applicazione parte ma quando clicco sul bottone crasha. Vi posto il codice:
Codice (Java): [Seleziona]
package com.android;

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

public class season extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
       
        final EditText insNome= (EditText) findViewById(R.id.insNome);
        final EditText insTeam= (EditText) findViewById(R.id.insTeam);
       
       
        Button start=(Button) findViewById(R.id.start);
       
       
        start.setOnClickListener(new View.OnClickListener(){

                        @Override
                        public void onClick(View v) {
                                // TODO Auto-generated method stub                             
                                MyDatabase db=new MyDatabase(getApplicationContext());          
                               
                       db.open();
                       
                       db.insertProfile(insNome.getText().toString(), insTeam.getText().toString());   
                                   
                                   
                                }
                        }      
               
        );
       
       
   
    }}  

Ecco il codice della classe myDatabase:
Codice (Java): [Seleziona]
package com.android;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class MyDatabase {  

        SQLiteDatabase mDb;
    DbHelper mDbHelper;
    Context mContext;
    private static final String DB_NAME="seasonDb";//nome del db
    private static final int DB_VERSION=1; //numero di versione del nostro db
   
    public MyDatabase(Context ctx){
            mContext=ctx;
            mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
    }
   
    public void open(){  //il database su cui agiamo è leggibile/scrivibile
            mDb=mDbHelper.getWritableDatabase();
           
    }
   
    public void close(){ //chiudiamo il database su cui agiamo
            mDb.close();
    }
   
   
    //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
   // consiglio:si potrebbe creare una classe Prodotto, i quali oggetti verrebbero passati come parametri dei seguenti metodi, rispettivamente ritornati. Lacio a voi il divertimento

   
    public void insertProfile(String name,String team){ //metodo per inserire i dati
            ContentValues cv=new ContentValues();
            cv.put(ProfileMetaData.PRODUCT_NAME_KEY, name);
            cv.put(ProfileMetaData.PRODUCT_TEAM_KEY, team);
            mDb.insert(ProfileMetaData.PROFILES_TABLE, null, cv);
    }
   
    public Cursor fetchProducts(){ //metodo per fare la query di tutti i dati
            return mDb.query(ProfileMetaData.PROFILES_TABLE, null,null,null,null,null,null);              
    }

    static class ProfileMetaData {  // i metadati della tabella, accessibili ovunque
            static final String PROFILES_TABLE = "profiles";
            static final String PRODUCT_NAME_KEY = "name";
            static final String PRODUCT_TEAM_KEY = "team";
            static final String MATCH= "partita";
    }
   
    static class Match {  // i metadati della tabella, accessibili ovunque
        static final String MATCH_TABLE = "partite";
        static final String ID = "_id";
        static final String ASSIST = "assist";
        static final String GOL = "gol";
        static final String MINUTI_GIOCATI = "time";
        static final String VOTO= "voto";
        static final String YELLOW= "giallo";
        static final String RED= "rosso";

}
   
    private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
                    + ProfileMetaData.PROFILES_TABLE + " ("
                    + ProfileMetaData.MATCH+ " _id, references MATCH(id) "
                    + ProfileMetaData.PRODUCT_NAME_KEY + " text not null,primary key "
                    + ProfileMetaData.PRODUCT_TEAM_KEY + " text not null);";
   
   
    private static final String MATCH_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //codice sql di creazione della tabella
        + Match.MATCH_TABLE + " ("
        + Match.ID+ " text not null, primary key"
        + Match.ASSIST + " integer "
        + Match.MINUTI_GIOCATI + " text  "
        + Match.RED + "integer "
        + Match.VOTO + " text  "
        + Match.YELLOW + " text  "
        + Match.GOL + " integer);";
   
    private class DbHelper extends SQLiteOpenHelper { //classe che ci aiuta nella creazione del db

            public DbHelper(Context context, String name, CursorFactory factory,int version) {
                    super(context, name, factory, version);
            }

            @Override
            public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                    _db.execSQL(PRODUCTS_TABLE_CREATE) ;
                  _db.execSQL(MATCH_TABLE_CREATE);
            }

            @Override
            public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                    //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

            }

    }
           

}
Se i cosiddetti "migliori" di noi avessero il coraggio di
sottovalutarsi almeno un po' vivremmo in un mondo infinitamente migliore.

In ogni cAso nessun rimorso.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Definizione database in caso di foreign key
« Risposta #10 il: 04 Ottobre 2010, 17:05:16 CEST »
0
potresti dare maggiori informazioni?
il Logcat, per esempio.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Definizione database in caso di foreign key
« Risposta #11 il: 04 Ottobre 2010, 17:27:55 CEST »
0
Nella PRODUCTS_TABLE_CREATE non vedo la definizione del campo "_id", ti ricordo che è obbligatorio.