2016-07-18 1 views
0

Salut j'ai un problème avec obtenir de nombreux enregistrements de db c'est ma table principaleJe ne peux pas obtenir les valeurs de la table. Relation un à plusieurs

@DatabaseTable(tableName = "MyTrips") 
public class MyTripTable { 

@DatabaseField(generatedId = true) 
private long id; 

@DatabaseField 
private long timestamp; 


@DatabaseField(foreign = true, foreignAutoRefresh = true) 
private ForeignCollection<PortTable> mPorts; 

public MyTripTable() {} 

public ForeignCollection<PortTable> getPorts() { 
    return mPorts; 
} 

public long getId() { 
    return id; 
} 
} 

et voici deuxième table

@DatabaseTable(tableName = "Ports") 
public class PortTable { 

@DatabaseField(generatedId = true) 
private long id; 

@DatabaseField 
private long timestamp; 

@DatabaseField(foreign = true, foreignAutoRefresh = true) 
private MyTripTable myTripTable; 

public PortTable() {} 
public void setTripAssigned(MyTripTable myTripTable){ 
    this.myTripTable = myTripTable; 
} 
} 

Et je besoin d'un MyTrips ont plus Ports Je le fais par example mais ne fonctionne pas

problème est ici:

private void strawberry(){ 
    DatabaseHelper helper = OpenHelperManager.getHelper(getApplicationContext(), DatabaseHelper.class); 
    RuntimeExceptionDao<MyTripTable, Long> mTrip = helper.getTripRuntimeExcaptionDao(); 
    RuntimeExceptionDao<PortTable, Long> mPort = helper.getPortRuntimeExcaptionDao(); 

    long time1 = Calendar.getInstance().getTimeInMillis(); 

    //crate data 
    MyTripTable myFirstTrip = new MyTripTable(153315, "Praha - Gothenburg",  "Big fat woman", 
      time1,time1,time1,time1,1,5,6); 
    mTrip.create(myFirstTrip); 

    PortTable port1 = new PortTable("Praha", 
      "Praha is the capital and largest city of the Czech Republic. ", 
      50.078047, 
      14.427172); 
    port1.setTripAssigned(myFirstTrip); 
    PortTable port2 = new PortTable("Praha", 
      "Praha is the capital and largest city of the Czech Republic. ", 
      50.078047, 
      14.427172); 
    port2.setTripAssigned(myFirstTrip); 
    PortTable port3 = new PortTable("Praha", 
      "Praha is the capital and largest city of the Czech Republic. ", 
      50.078047, 
      14.427172); 
    port3.setTripAssigned(myFirstTrip); 
    PortTable port4 = new PortTable("Praha", 
      "Praha is the capital and largest city of the Czech Republic. ", 
      50.078047, 
      14.427172); 
    port4.setTripAssigned(myFirstTrip); 

    mPort.create(port1); 
    mPort.create(port2); 
    mPort.create(port3); 
    mPort.create(port4); 


    //Get data 
    Log.e("LSA", "----------------------------------TRIPS"); 
    List<MyTripTable> alltrips = mTrip.queryForAll(); 
    Log.e("LSA", "TRIPS" + alltrips.toString()); 
    for (MyTripTable trip : alltrips){ 
     Log.e("LSA", "Trip: " + trip.toString()); 
    } 

    Log.e("LSA", "----------------------------------PORTS"); 
    List<PortTable> allPorts = mPort.queryForAll(); 
    Log.e("LSA", "PORTS" + allPorts.toString()); 
    for (PortTable port : allPorts){ 
     Log.e("LSA", "port: " + port.toString()); 
    } 

    Log.e("LSA", "----------------------------------PORTs assigned"); 

    MyTripTable mOneTrip = mTrip.queryForId(myFirstTrip.getId()); 
    ForeignCollection<PortTable> mPortsForOneTrip = mOneTrip.getPorts(); 

    Log.e("LSA", "ports inside trip: " + mPortsForOneTrip); 
    } 

cette partie retourne toujours null

ForeignCollection<PortTable> mPortsForOneTrip = mOneTrip.getPorts(); 

Pouvez-vous me aider? Où est une erreur? Merci pour la réponse!

Répondre

0

Fondamentalement, votre méthode principale devrait vous donner l'erreur ci-dessous sur l'exécution du code ci-dessus. Je ne suis pas sûr de savoir pourquoi cela fonctionne pour vous en premier lieu.

Exception in thread "main" java.sql.SQLException: Field 'mPorts' in class interface com.j256.ormlite.dao.ForeignCollection' should use the @ForeignCollectionField annotation not foreign=true

L'erreur ci-dessus dit dans votre classe MyTripTable.java, vous avez marqué @DatabaseField (étranger = true, foreignAutoRefresh = true) sur une collection, alors que, selon docs, vous devez utiliser la @ForeignCollectionField d'annotation. Je poste le code de fonctionnement.

Code pour MyTripTable.java

@DatabaseTable(tableName = "MyTrips") 
public class MyTripTable { 

    @DatabaseField(generatedId = true) 
    private long id; 

    @DatabaseField 
    private long timestamp; 

// @DatabaseField(foreignAutoRefresh = true) 
    @ForeignCollectionField(eager = false) 
    private ForeignCollection<PortTable> mPorts; 

    public MyTripTable() { 
    } 

    public ForeignCollection<PortTable> getPorts() { 
     return mPorts; 
    } 

    public long getId() { 
     return id; 
    } 

    public long getTimestamp() { 
     return timestamp; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public void setTimestamp(long timestamp) { 
     this.timestamp = timestamp; 
    } 
} 

Code pour Port Table.java

@DatabaseTable(tableName = "Ports") 
public class PortTable { 

    /** The id. */ 
    @DatabaseField(generatedId = true) 
    private long id; 

    /** The timestamp. */ 
    @DatabaseField 
    private long timestamp; 

    /** The my trip table. */ 
    @DatabaseField(foreign = true, foreignAutoRefresh = true) 
    private MyTripTable myTripTable; 

    /** 
    * Instantiates a new port table. 
    */ 
    public PortTable() { 
    } 

    /** 
    * Sets the trip assigned. 
    * 
    * @param myTripTable the new trip assigned 
    */ 
    public void setTripAssigned(MyTripTable myTripTable) { 
     this.myTripTable = myTripTable; 
    } 

    /** 
    * Gets the id. 
    * 
    * @return the id 
    */ 
    public long getId() { 
     return id; 
    } 

    /** 
    * Gets the timestamp. 
    * 
    * @return the timestamp 
    */ 
    public long getTimestamp() { 
     return timestamp; 
    } 

    /** 
    * Sets the id. 
    * 
    * @param id the new id 
    */ 
    public void setId(long id) { 
     this.id = id; 
    } 

    /** 
    * Sets the timestamp. 
    * 
    * @param timestamp the new timestamp 
    */ 
    public void setTimestamp(long timestamp) { 
     this.timestamp = timestamp; 
    } 
} 

ci-dessous montre l'exécution de code ci-dessus ....

public static void main(String[] args) throws SQLException { 
     String databaseUrl = "jdbc:mysql://localhost:3306/YOUR_DATABASE"; 

     ConnectionSource connectionSource = new JdbcConnectionSource(databaseUrl, "root", "root"); 
     // instantiate the dao 
     Dao<MyTripTable, Long> tripDao = DaoManager.createDao(connectionSource, MyTripTable.class); 
     Dao<PortTable, Long> portDao = DaoManager.createDao(connectionSource, PortTable.class); 

     // if you need to create the 'accounts' table make this call 
     TableUtils.createTable(connectionSource, MyTripTable.class); 
     TableUtils.createTable(connectionSource, PortTable.class); 

     long time1 = Calendar.getInstance().getTimeInMillis(); 

     // crate data 
     MyTripTable myFirstTrip = new MyTripTable(); 
     myFirstTrip.setTimestamp(time1); 

     tripDao.create(myFirstTrip); 

     PortTable port1 = new PortTable(); 
     port1.setTimestamp(time1); 
     port1.setTripAssigned(myFirstTrip); 

     PortTable port2 = new PortTable(); 
     port2.setTimestamp(time1); 
     port2.setTripAssigned(myFirstTrip); 

     PortTable port3 = new PortTable(); 
     port3.setTimestamp(time1); 
     port3.setTripAssigned(myFirstTrip); 

     portDao.create(port1); 
     portDao.create(port2); 
     portDao.create(port3); 

     List<MyTripTable> alltrips = tripDao.queryForAll(); 
     for (MyTripTable trip : alltrips) { 
      System.out.println(trip); 
     } 

     List<PortTable> allPorts = portDao.queryForAll(); 
     for (PortTable port : allPorts) { 
      System.out.println(port); 
     } 

     MyTripTable mOneTrip = tripDao.queryForId(myFirstTrip.getId()); 
     ForeignCollection<PortTable> mPortsForOneTrip = mOneTrip.getPorts(); 
     System.out.println(mPortsForOneTrip); 

    } 

J'ai testé la ci-dessus le code et il fonctionnait bien. S'il vous plaît laissez-moi savoir si vous faites face à d'autres problèmes.

+0

Salut d'abord vous remercie pour la réponse .. mais je vois un problème 'String.valueOf (myFirstTrip.getId())' id est long pas la chaîne! Il ne peut pas fonctionner correctement .... btw je vois juste une différence '@ForeignCollectionField (eager = false) privé ForeignCollection mPorts;' et je l'ai changé et ne fonctionne toujours pas. Je vais vérifier à nouveau ... –

+0

J'ai édité Dao tripDao = DaoManager.createDao (connectionSource, MyTripTable.class); Dao portDao = DaoManager.createDao (connectionSource, PortTable.class); à Dao tripDao = DaoManager.createDao (connectionSource, MyTripTable.class); Dao portDao = DaoManager.createDao (connectionSource, PortTable.class); et ont remplacé tripDao.queryForId (String.valueOf (myFirstTrip.getId())); à tripDao.queryForId (myFirstTrip.getId()) –

+0

Veuillez essayer ci-dessus et faites-moi savoir si vous rencontrez un problème avec le code. –